shell
是什么东西之前,不妨让我们重新审视使用者
和计算机系统
的关系:
我们知道计算机的运作不能离开硬件,但使用者却无法直接操作硬件,
硬件的驱动只能通过一种称为“操作系统
(OS
,Opertating System
)”的软件来管控。
事实上,我们每天所谈的“linux
”,严格来说只是一个操作系统
(OS
),
我们称之为“内核
(kernel
)”。
然而,从使用者的角度来说,使用者没有办法直接操作一个kernel
,
而是通过kernel
的“外壳”程序,也就是所谓的shell
,来与kernel
沟通。
这也正是kernel
跟shell
的形象命名的的关系。如图:
从技术的角度来说,shell
是一个使用者与系统的交互界面(interface)
,
只能让使用者通过命令行
(command line
)来使用系统来完成工作。
因此,shell
最简单的定义就是----命令解释器
( Command Interpreter
):
- 将使用者的命令翻译给 kernel 来处理;
- 同时,将 kernel 的处理结果翻译给使用者。
每次当我们完成系统登入
(login
), 我们就取得一个交互模式的 shell,
也称之为login shell
或者 primary shell
。
若从进程
(process
)的角度来说,我们在shell所下达的命令,均是 shell 所产生的子进程
。
这种现象,我暂可称之为fork
。
如果是执行shell脚本
(shell script
)的话,脚本中命令则是由另一个非交互模式的
子shell
(sub shell
)来执行的。 也就是 primary shell 产生 sub shell 的进程,而该 sub shell
进程再产生 script 中所有命令的进程。
(关于进程,我们日后有机会在补充)
这里, 我们必须知道:kernel
与 shell
是不同的两套软件,而且都是可以被替换的:
- 不同的
OS
使用不同的kernel
; - 同一个kernel之上,也可以使用不同的
shell
;
在Linux
的预设系统中,通常可以找到好几种不同的shell
,
且通常会被记录在如下文件中:
/etc/shells
不同的shell
有着不同的功能,且彼此各异,或者说“大同小异”。
常见的shell
主要分为两大主流: