Bash

bash myscript.sh 在 bash 中執行,但第一行是 #!/usr/bin/sh

  • September 17, 2012

我有一個類似以下的腳本:

#!/usr/bin/sh

var="ABC"
if [ $var == "ABC" ]
then
  echo True
else
  echo False
fi

上面的程式碼在 Solaris Sparc 和 Solaris X64 中不起作用。它顯示==未定義。如果我===.

奇怪的是,如果我通過以下方法執行上面的程式碼而不做任何更改,它就可以工作。

#bash test.sh

根據我的理解,即使使用 bash,腳本也不應該工作,因為在我使用的腳本的頂部,#!/bin/sh它不支持== 作為比較運算符。

任何人都可以解釋為什麼當我執行上面提到的腳本時它會起作用。

注意:我知道 bash 確實辨識===.

腳本的第一行稱為#!行(有時稱為“shebang”行)。

它僅在直接執行腳本時使用,如

./test.sh

解釋

當你執行一個執行檔時,作業系統會查看前兩個字節來判斷它是什麼類型的程序。

當你跑

./test.sh

作業系統看到./test.share的前兩個字節#!,所以它知道程序是一個腳本。

它讀取該行的其餘部分以查看它應該使用哪個 shell 1來執行腳本。在這種情況下,該行的其餘部分是/usr/bin/sh,所以它執行/usr/bin/sh test.sh2。

當你跑

bash test.sh

/usr/bin/bash它在3中找到 bash 。它看到的前兩個字節/usr/bin/bash不是#!,所以它/usr/bin/bash test.sh甚至不看第一行就執行test.sh.

在這兩種情況下,sh實際上都bash忽略了 shebang 行,因為任何以開頭的行#都是註釋。唯一具有這種#神奇效果的原因是作業系統,而不是外殼。

更多資訊:

腳註:

  1. 事實上,它可以是任何程序,它不必是外殼。
  2. 其實更像execl("./test.sh", "/usr/bin/sh", "./test.sh", NULL)
  3. /bin/sh在大多數 Linux 系統上,但問題是關於 Solaris。

引用自:https://unix.stackexchange.com/questions/45044