Scripting

shebang 是否確定執行腳本的 shell?

  • June 30, 2020

這可能是一個愚蠢的問題,但我仍然會問。如果我宣布了一個shebang

#!/bin/bash 

在開頭my_shell_script.sh,所以我總是必須使用 bash 呼叫這個腳本

[my@comp]$bash my_shell_script.sh

或者我可以使案例如

[my@comp]$sh my_shell_script.sh

我的腳本使用shebang確定正在執行的shell?kshshell也一樣嗎?我正在使用 AIX。

shebang 是由字節字元串組成的幻數#!人類可讀實例,函式族使用它來確定要執行的文件是腳本還是二進製文件。當 shebang 存在時,將執行 shebang 之後指定的執行檔。0x23 0x21``exec()``exec()

請注意,這意味著如果您通過在命令行上指定解釋器來呼叫腳本,就像在問題中給出的兩種情況下所做的那樣,exec()將執行在命令行上指定的解釋器,它甚至不會查看腳本。

因此,正如其他人所指出的,如果要exec()呼叫 shebang 行上指定的解釋器,腳本必須設置可執行位並呼叫為./my_shell_script.sh.

使用以下腳本很容易展示該行為:

#!/bin/ksh
readlink /proc/$$/exe

解釋:

  • #!/bin/ksh定義ksh為解釋器。
  • $$保存目前程序的PID。
  • /proc/pid/exe是指向程序執行檔的符號連結(至少在 Linux 上;在 AIX 上,/proc/$$/object/a.out 是指向執行檔的連結)。
  • readlink將輸出符號連結的值。

例子:

注意:我在 Ubuntu 上展示了這一點,其中預設 shell/bin/shdash ie的符號連結,/bin/dash並且/bin/ksh是 . 的符號/etc/alternatives/ksh連結,而/bin/pdksh.

$ chmod +x getshell.sh
$ ./getshell.sh 
/bin/pdksh
$ bash getshell.sh 
/bin/bash
$ sh getshell.sh 
/bin/dash

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