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