3つのスクリプトがあり、そのうちの2つはshebangとして使用されます。
shebang-1
#!/bin/sh
echo "#1"
exec sh -- "$@"
shebang-2
それを使うshebang-1
#!/home/a/ex/shebang-1
echo "#2"
exec sh -- "$@"
script
#!/home/a/ex/shebang-2
echo script...
私が実行するときscript
、私は期待する
#1
#2
script...
代わりに私はただ得る
$ ./script
script...
明示的に呼び出すと機能します。
$ ./shebang-1 ./shebang-2 ./script
#1
#2
script...
ファイルには次の権限があります
$ ls -l
total 24
-rwx------ 1 a a 38 Sep 3 18:00 script*
-rwx------ 1 a a 38 Sep 3 18:05 shebang-1*
-rwx------ 1 a a 50 Sep 3 18:05 shebang-2*
ここで問題は何ですか?
答え1
OpenBSDは、shebangsのshebangedスクリプトであるインタプリタをサポートしていません。インタプリタは実際のバイナリでなければなりません。
実行にscript
失敗すると、シェルは説明されているようにスクリプトを最初の引数として実行するようにENOEXEC
置き換えられます。/bin/sh
execve(2)
exec
シェル、Perlの、xargs(1)
またはシェルの動作をエミュレートする他のラッパーをenv(1)
介さずにスクリプトを直接実行してexecvp(3)
これを確認できます。
記録がなければ見ることができます。ソースコード。
とにかく、OpenBSDはLinux以外のほとんどの他のシステムと同じです。私の知る限り、Linuxだけが別のスクリプトをレベル4までインタプリタとしてサポートしているように見え、その後execve
はELOOP
。