#!/bin/bash 的解釋


https://blog.csdn.net/jackalfly/article/details/7571616

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM