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