Bash
bash myscript.sh 在 bash 中執行,但第一行是 #!/usr/bin/sh
我有一個類似以下的腳本:
#!/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.sh
are的前兩個字節#!
,所以它知道程序是一個腳本。它讀取該行的其餘部分以查看它應該使用哪個 shell 1來執行腳本。在這種情況下,該行的其餘部分是
/usr/bin/sh
,所以它執行/usr/bin/sh test.sh
2。當你跑
bash test.sh
/usr/bin/bash
它在3中找到 bash 。它看到的前兩個字節/usr/bin/bash
不是#!
,所以它/usr/bin/bash test.sh
甚至不看第一行就執行test.sh.
在這兩種情況下,
sh
實際上都bash
忽略了 shebang 行,因為任何以開頭的行#
都是註釋。唯一具有這種#
神奇效果的原因是作業系統,而不是外殼。更多資訊:
腳註:
- 事實上,它可以是任何程序,它不必是外殼。
- 其實更像
execl("./test.sh", "/usr/bin/sh", "./test.sh", NULL)
。/bin/sh
在大多數 Linux 系統上,但問題是關於 Solaris。