shell
是什么東西之前,不妨讓我們重新審視使用者
和計算機系統(tǒng)
的關(guān)系:
我們知道計算機的運作不能離開硬件,但使用者卻無法直接操作硬件,
硬件的驅(qū)動只能通過一種稱為“操作系統(tǒng)
(OS
,Opertating System
)”的軟件來管控。
事實上,我們每天所談的“linux
”,嚴(yán)格來說只是一個操作系統(tǒng)
(OS
),
我們稱之為“內(nèi)核
(kernel
)”。
然而,從使用者的角度來說,使用者沒有辦法直接操作一個kernel
,
而是通過kernel
的“外殼”程序,也就是所謂的shell
,來與kernel
溝通。
這也正是kernel
跟shell
的形象命名的的關(guān)系。如圖:
從技術(shù)的角度來說,shell
是一個使用者與系統(tǒng)的交互界面(interface)
,
只能讓使用者通過命令行
(command line
)來使用系統(tǒng)來完成工作。
因此,shell
最簡單的定義就是----命令解釋器
( Command Interpreter
):
每次當(dāng)我們完成系統(tǒng)登入
(login
), 我們就取得一個交互模式的 shell,
也稱之為login shell
或者 primary shell
。
若從進程
(process
)的角度來說,我們在shell所下達的命令,均是 shell 所產(chǎn)生的子進程
。
這種現(xiàn)象,我暫可稱之為fork
。
如果是執(zhí)行shell腳本
(shell script
)的話,腳本中命令則是由另一個非交互模式的
子shell
(sub shell
)來執(zhí)行的。 也就是 primary shell 產(chǎn)生 sub shell 的進程,而該 sub shell
進程再產(chǎn)生 script 中所有命令的進程。
(關(guān)于進程,我們?nèi)蘸笥袡C會在補充)
這里, 我們必須知道:kernel
與 shell
是不同的兩套軟件,而且都是可以被替換的:
OS
使用不同的kernel
;shell
;在Linux
的預(yù)設(shè)系統(tǒng)中,通??梢哉业胶脦追N不同的shell
,
且通常會被記錄在如下文件中:
/etc/shells
不同的shell
有著不同的功能,且彼此各異,或者說“大同小異”。
常見的shell
主要分為兩大主流:
大部分的 Linux 操作系統(tǒng)的預(yù)設(shè) shell 都是bash
,其原因大致如下兩種:
bash 是 gnu project 最成功的產(chǎn)品之一,自推出以來深受廣大Unix
用戶的喜愛,
且也逐漸成為不少組織的系統(tǒng)標(biāo)準(zhǔn)。