鍍金池/ 教程/ Linux/ 何為 shell?
別人echo、你也echo,是問echo知多少?
何為 shell?
你要 if 還是 case 呢?
""(雙引號) 與''(單引號) 差在哪?
exec 跟 source 差在哪?
$(())與$()還有${}差在哪?
() 與 {} 差在哪?
shell and Carriage 關(guān)系
for what? while 與 until 差在哪?
大于小于號差別?
[^ ] 跟[! ]差在哪? (RE: Regular Expression)
[^ ] 跟[! ]差在哪? (wildcard)
特殊符號差異
&& 與 || 差在哪?
var=value 在 export 前后的差在哪?

何為 shell?

shell是什么東西之前,不妨讓我們重新審視使用者計算機系統(tǒng)的關(guān)系:

我們知道計算機的運作不能離開硬件,但使用者卻無法直接操作硬件, 硬件的驅(qū)動只能通過一種稱為“操作系統(tǒng)(OS,Opertating System)”的軟件來管控。 事實上,我們每天所談的“linux”,嚴(yán)格來說只是一個操作系統(tǒng)(OS), 我們稱之為“內(nèi)核(kernel)”。

然而,從使用者的角度來說,使用者沒有辦法直接操作一個kernel, 而是通過kernel的“外殼”程序,也就是所謂的shell,來與kernel溝通。 這也正是kernelshell的形象命名的的關(guān)系。如圖:

從技術(shù)的角度來說,shell是一個使用者與系統(tǒng)的交互界面(interface), 只能讓使用者通過命令行(command line)來使用系統(tǒng)來完成工作。 因此,shell最簡單的定義就是----命令解釋器( Command Interpreter):

  • 將使用者的命令翻譯給 kernel 來處理;
  • 同時,將 kernel 的處理結(jié)果翻譯給使用者。

每次當(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會在補充)

這里, 我們必須知道:kernelshell 是不同的兩套軟件,而且都是可以被替換的:

  • 不同的OS使用不同的kernel;
  • 同一個kernel之上,也可以使用不同的shell;

Linux的預(yù)設(shè)系統(tǒng)中,通??梢哉业胶脦追N不同的shell, 且通常會被記錄在如下文件中:

/etc/shells

不同的shell有著不同的功能,且彼此各異,或者說“大同小異”。 常見的shell主要分為兩大主流:

  1. sh:
    • burne shell (sh)
    • burne again shell (bash)
  2. csh:
    • c shell (csh)
    • tc shell (tcsh)
    • korn shell (ksh) (FIXME)

大部分的 Linux 操作系統(tǒng)的預(yù)設(shè) shell 都是bash,其原因大致如下兩種:

  • 自由軟件
  • 功能強大

bash 是 gnu project 最成功的產(chǎn)品之一,自推出以來深受廣大Unix用戶的喜愛, 且也逐漸成為不少組織的系統(tǒng)標(biāo)準(zhǔn)。