
私は読んだ別の答え私がインタープリターに渡している引数は、次のものより多くは渡せません/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 では許可されませんが...
env
GNU 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+"$@"}
代わりに を使用することを検討してください。