この場合、なぜ /usr/bin/env に引数を渡すことができるのでしょうか?

この場合、なぜ /usr/bin/env に引数を渡すことができるのでしょうか?

私は読んだ別の答え私がインタープリターに渡している引数は、次のものより多くは渡せません/usr/bin/env:

もう 1 つの潜在的な問題は、この#!/usr/bin/envトリックではインタープリターに引数を渡すことができないことです (暗黙的に渡されるスクリプトの名前を除く)。

awkただし、フラグを指定しないと が壊れ、フラグ-fを指定すると修正されるため、次のように実行できるようです。-f/usr/bin/env

まず、旗なしの場合-f:

$ cat wrap_in_quotes
#!/usr/bin/env awk
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
awk: syntax error at source line 1
 context is
     >>> . <<< /wrap_in_quotes
awk: bailing out at source line 1

2番目は旗です-f:

$ vim wrap_in_quotes
$ cat wrap_in_quotes
#!/usr/bin/env awk -f
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
"foobar"
  • つまり、リンクされた回答インタープリターにフラグを渡すことができません。なぜ-fフラグを渡すことができるのでしょうかawk?

実行中macOS:

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.1
BuildVersion:   16B2657

答え1

一部の Unix、特に macOS (および 2005 年までは FreeBSD) ではこれが許可されますが、Linux では許可されませんが...

envGNU coreutils パッケージの最新リリース (8.30+) のユーティリティを使用する場合、-S複数の引数を行で指定できる非標準オプションがあります#!

反対の質問:Linux で `#!/usr/bin/env command --argument` を含む Shebang 行が失敗する

答え2

あなたはできませんポータブルインタープリタに複数の引数を渡します。特に、Linux ではサポートされていません。

一部のUnix系OSでは、シェバン行に複数の引数がサポートされています。これは最近のmacOSシステムやその他のいくつかのシステムで当てはまります。Sven Mascheck のシェル移植性ページのためにUnix のバリエーションの比較表そして歴史的な情報も豊富です。


移植可能な awk スクリプトが必要な場合、すっきりとした解決策はありません。#!/usr/bin/envと は#!/bin/sh、実際に移植可能な唯一のシェバン行です。Unix の種類によっては、またはにawkある場合もあれば、他の場所にある場合もあります (たとえば、Solaris では POSIX シェルを取得するために、 にあるものはレガシー アプリケーション用です)。は移植性がないために、 が残ります。 (は、最新の POSIX シェルではなくレガシー Bourne シェルである可能性がありますが、実際にはどの Unix プラットフォームにもそこに何かがあります。) アイデアは、 を記述することです。/bin/usr/bin/usr/xpg4/bin/awk/usr/bin#!/usr/bin/env awk -f#!/bin/sh/bin/sh多言語話者つまり、awk を実行するための命令として解釈され、awk が目的のスクリプトとして解釈するスクリプトですsh。これは、シェバン行を認識しないが、shスクリプト実行のデフォルトとして を使用するシステム (一部の古い Unix や、非 Unix カーネル上の Unix ライクなユーザーランド) でも機能します。

#!/bin/sh
"exec" "awk" "-f" "$0" "$@" && 0 {}
… # awk script here

(古代のユニオンへの移植性が懸念される場合は、スヴェン・マシュケのページ"$@"サポートに問い合わせて、${1+"$@"}代わりに を使用することを検討してください。

関連情報