shell十三問之1: 何為shell?
shell
是什麼東西之前,不妨讓我們重新審視使用者
和計算機系統
的關係:
(此處為使用者和計算機系統的關係圖)
我們知道計算機的運作不能離開硬件,但使用者卻無法直接操作硬件,
硬件的驅動只能通過一種稱為“操作系統
(OS
,Opertating System
)”的軟件來管控。
事實上,我們每天所談的“linux
”,嚴格來說只是一個操作系統
(OS
),
我們稱之為“內核
(kernel
)”。
然而,從使用者的角度來說,使用者沒有辦法直接操作一個kernel
,
而是通過kernel
的“外殼”程序,也就是所謂的shell
,來與kernel
溝通。
這也正是kernel
跟shell
的形象命名的的關係。如圖:
(此處為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
主要分為兩大主流:
- sh:
- burne shell (sh)
- burne again shell (bash)
- csh:
- c shell (csh)
- tc shell (tcsh)
- korn shell (ksh) (FIXME)
大部分的Linux操作系統的預設shell都是bash
,其原因大致如下兩種:
- 自由軟件
- 功能強大
bash是gnu project最成功的產品之一,自推出以來深受廣大
Unix
用戶的喜愛, 且也逐漸成為不少組織的系統標準。