天天看點

#!/bin/sh & #!/bin/bash差別

在shell腳本的開頭往往有一句話來定義使用哪種sh解釋器來解釋腳本。

目前研發送測的shell腳本中主要有以下兩種方式:

(1) #!/bin/sh

(2) #!/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,螢幕輸出為:

hello

由此可見,在#!/bin/bash的情況下,雖然source不成功,但是還是運作了source後面的echo語句。

但是緊接着我又試着運作了一下sh ./test.sh,這次螢幕輸出為:

表示雖然腳本中指定了#!/bin/bash,但是如果使用sh 方式運作,如果source不成功,也不會運作source後面的代碼。

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

說明:

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的特定規範,有可能就包括這樣的規範:“當某行代碼出錯時,不繼續往下解釋”)

<a href="http://doc.okbase.net/dadong616/archive/240001.html" target="_blank">最全的linux指令大全,shell運維手冊</a>

<a href="http://doc.okbase.net/dadong616/archive/240001.html" target="_blank">http://doc.okbase.net/dadong616/archive/240001.html</a>

      本文轉自ling118 51CTO部落格,原文連結:http://blog.51cto.com/meiling/1826201,如需轉載請自行聯系原作者