#!/bin/bash詳解

在shell腳本的第一行中,必須寫#!/bin/bash嗎?帶着這個問題,我今天在百度上搜索了一下,
發現在一個貼子中討論了這個問題,覺得各個跟貼者在回答這個問題時,都解釋的很有道理,現摘記如下,以便學習。
---------------------------------------------------------------------------------------------
本人初學linux不久,發現在編寫腳本的時候開頭都有一行#!/bin/sh
我記得#是表示註釋的,那麼這一行應該是可以不寫的吧?爲什麼又說“這條語句告訴操作系統用來解釋腳本的程序位置。”呢?
---------------------------------------------------------------------------------------------
#!/bin/sh
表示本腳本由/bin/路徑的sh程序來解釋....
跟命令行下~
#/bin/sh Scriptname效果相同...

---------------------------------------------------------------------------------------------
但是#不是用來表示註釋的嗎?難道這裏的#不是這個意思?
---------------------------------------------------------------------------------------------
不同的地方,#有不同的意思
就好比c++裏面用“//”來註解
vb裏面用“'”註解一樣
dns裏面用“;”來註解
shell的開頭那個#不是用來註解的

---------------------------------------------------------------------------------------------
如果你要用給該腳本執行權限的話...第一行必須聲明該腳本由什麼來解釋...
#的確表示註釋.第一行的你只需要知道是聲明解釋程序的路徑就好了 :)
假如第一行是別的東西.而你又給了x權限,執行的時候就會出錯...
可以不寫.執行時手工執行...
/bin/sh xxxx.sh
效果是一樣的 ...
---------------------------------------------------------------------------------------------
如果不寫也成,那就用你登陸的那個shell來解釋執行.
---------------------------------------------------------------------------------------------
可以不寫,但應該有良好的編程習慣
---------------------------------------------------------------------------------------------
#通常用作註釋,但是#!放在一起就標誌着這是一個shell script,其後的路徑指出了用來解釋這個script的程序。
如果一個script只是一些普通linux指令的堆砌。那麼#!可以略去不寫。但通常我們遇到的都不是這種情況。
如果這個script中包含一些自定義的程序組件,比如說函數,變量等,#!便需要標註。

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

發佈了24 篇原創文章 · 獲贊 37 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章