shell指令碼頭,#!/bin/sh與#!/bin/bash的區別.

jonnyan發表於2018-04-11

因為今天寫了個小指令碼,死活不成功,總是報檔案或者目錄不存在,問了一下我們馬同學的正常寫法,發現只有指令碼頭的區別,也就是今天本文要講的#!/bin/sh與#!/bin/bash.

本文參考:https://www.cnblogs.com/aaronLinux/p/6885288.html和http://www.cnblogs.com/baizhantang/archive/2012/09/11/2680453.html

一:解釋

#!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面跟的是此解釋此指令碼的shell的路徑。

$ cat /etc/shells可以檢視系統支援的shell格式

其實第一句的#!是對指令碼的直譯器程式路徑,指令碼的內容是由直譯器解釋的,我們可以用各種各樣的直譯器來寫對應的指令碼。

比如說/bin/csh指令碼,/bin/perl指令碼,/bin/awk指令碼,/bin/sed指令碼,/bin/python指令碼,甚至/bin/echo等等。

** #!/bin/bash **同理。

二:區別

指令碼test.sh內容:
#!/bin/sh
source pcy.sh #pcy.sh並不存在
echo hello
執行./test.sh,螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
由此可見,在#!/bin/sh的情況下,source不成功,不會執行source後面的程式碼。
修改test.sh指令碼的第一行,變為#!/bin/bash,再次執行./test.sh,螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可見,在#!/bin/bash的情況下,雖然source不成功,但是還是執行了source後面的echo語句。
但是緊接著我又試著執行了一下sh ./test.sh,這次螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
表示雖然指令碼中指定了#!/bin/bash,但是如果使用sh 方式執行,如果source不成功,也不會執行source後面的程式碼。

為什麼會有這樣的區別呢?

junru同學作了解釋

  1. sh一般設成bash的軟鏈
    [work@zjm-testing-app46 cy]$ ll /bin/sh
    lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
  2. 在一般的linux系統當中(如redhat),使用sh呼叫執行指令碼相當於開啟了bash的POSIX標準模式
  3. 也就是說 /bin/sh 相當於 /bin/bash –posix

所以,sh跟bash的區別,實際上就是bash有沒有開啟posix模式的區別

so,可以預想的是,如果第一行寫成#!/bin/bash --posix,那麼指令碼執行效果跟#!/bin/sh是一樣的(遵循posix的特定規範,有可能就包括這樣的規範:“當某行程式碼出錯時,不繼續往下解釋”)

相關文章