Scripting
shebang 是否確定執行腳本的 shell?
這可能是一個愚蠢的問題,但我仍然會問。如果我宣布了一個shebang
#!/bin/bash
在開頭
my_shell_script.sh
,所以我總是必須使用 bash 呼叫這個腳本[my@comp]$bash my_shell_script.sh
或者我可以使案例如
[my@comp]$sh my_shell_script.sh
我的腳本使用shebang確定正在執行的shell?
ksh
shell也一樣嗎?我正在使用 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/sh
是dash 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