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

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

私は読んだもう一つの答え私が提供したもの以外のパラメータをインタプリタに渡すことはできません/usr/bin/env

別の潜在的な問題は、この#!/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

一部のUnices、特にmacOS(および2005年以前のFreeBSD)ではこれを許可しますが、Linuxでは許可しません。

最新バージョンのGNU coreutilsパッケージ(8.30+)でユーティリティを使用している場合は、その行に複数の引数を提供するためのenv非標準オプションがあります。-S#!

反対の質問:Linux で `#!/usr/bin/env コマンド --argument` を使用する Shebang ラインが失敗します。

答え2

できない持ち運べるインタプリタに複数の引数を渡します。特にLinuxではサポートされていません。

一部のUnixバリアントは、shebangラインで複数のパラメータをサポートしています。これは、最新のmacOSシステムや他のいくつかのシステムの場合です。バラよりSven Mascheckのシェル移植性ページ一つのためにUnixバリアント比較表そして豊かな歴史的情報。


移植可能なawkスクリプトが必要な場合は、賢い解決策はありません。実際に移植可能な唯一のshebangラインです。 Unixのバリエーションによって、#!/usr/bin/envまたは他の場所にある場合があります(たとえば、Solarisではレガシーアプリケーションの場合はPOSIXラインを取得します)。移植性がないので。#!/bin/shawk/bin/usr/bin/usr/xpg4/bin/awk/usr/bin#!/usr/bin/env awk -f#!/bin/sh/bin/sh多言語shつまり、awkを実行するコマンドとして解釈されるスクリプトと、awkが必須スクリプトとして解釈されるということです。これはshshebang行を認識しませんが、基本的にスクリプトを実行しているシステム(一部のアンティークユニックスまたはUnix以外のカーネルの一部のUnixファミリーユーザー領域)でも機能します。

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

(古代のユニティの移植性について心配している場合は、以下を参照してください。Sven Maschekのページサポート"$@"し、使用を検討してください${1+"$@"}。 )

関連情報