腳本位于第一行的#!
當(dāng) shell 執(zhí)行一個(gè)程序時(shí),會(huì)要求 linux 內(nèi)核啟動(dòng)一個(gè)新的進(jìn)程,以便在該進(jìn)程里執(zhí)行所指定的程序。內(nèi)核知道如何為編譯性程序做這件事。但是我們的 nusers Shell 腳本并非編譯性程序;當(dāng) shell 要求內(nèi)核執(zhí)行它的時(shí)候,內(nèi)核無法處理,并且回應(yīng)“not executable format file”,接著會(huì)啟動(dòng)一個(gè)新的/bin/sh(標(biāo)準(zhǔn) shell)副本來執(zhí)行該程序。
當(dāng)系統(tǒng)只有一個(gè) shell 是,“退回到/bin/sh”的機(jī)制很方便。但是現(xiàn)在的 linux 都擁有好幾個(gè) shell,因此需要通過一宗方式,告知 linux 內(nèi)核用哪個(gè) shell 來執(zhí)行所指定的 shell 及哦啊本。
linux 有多個(gè) shell 帶來的好處是有助于執(zhí)行機(jī)制通用化,讓用戶得以直接引用任何程序語言解釋器,而非只是一個(gè)命令 shell。
例如:文件開頭存在#! /bin/csh 則說明執(zhí)行的是 csh 腳本,相同的,例如我們可以這樣引用獨(dú)立的 awk 程序:
#! /bin/awk -f
此處是 awk 程序
shell 腳本的第一行通常是#! /bin/sh。如果不這樣是不符合標(biāo)準(zhǔn)的,自覺修改這個(gè)路徑,將其改為符合 POSIX 標(biāo)準(zhǔn)的 shell。
以下是幾個(gè)初級(jí)的陷阱:
#!這一行的長度盡量不要超過 64 個(gè)字符。#!的能力,有些 shell 會(huì)自行處理,這些 shell 對(duì)于#!與緊隨其后的解釋器名稱之間是否可以有空白,可能有不同的解釋。 查看當(dāng)前發(fā)行版本可以使用的shell:cat /etc/shells。
查看系統(tǒng)默認(rèn)的shell:echo $SHELL:一般情況下是輸出/bin/bash。
如果想切換 shell 的版本,只需要直接輸入 shell 的版本。例如想使用 csh,直接輸入 csh 即可,使用 exit 退出當(dāng)前 shell 回到原 shell。