`env var = value`がvarにすべての名前を受け入れるのはなぜですか?

`env var = value`がvarにすべての名前を受け入れるのはなぜですか?

読むenv POSIX ドキュメント:

一部の人々は、次の方法で同じ効果を得ることができるので、envが重複していると思います。

名前=値...ユーティリティ[パラメータ...]

この例は、環境変数がコマンド環境に追加されたときにenvと同じですが、環境が指定された値に設定されている場合は適用されません。引数なしで呼び出されると、envユーティリティは現在の環境も記録します。 env を含めることを正当化するために、例で提供する以上の機能で十分です。

AFAICT、asを使用する場合、上記の文の意味はvar=value command同じですが、同じではありません。env var="value" commandenv -i var="value" command

少なくともenvGNUシステム、FreeBSD、およびSolaris 11の実装では、env名前の合計を除くすべての文字が許可されているため、同じではないことに気づきました=\0var

$ env 'BASH_FUNC_foo%%=() { echo foo; }' bash -c foo

印刷金持ち、有効な変数名ではないBASH_FUNC_foo%%='() { echo foo; }'ため、どのシェルでも使用できません。BASH_FUNC_foo%%

POSIXシェルでは、以外はシェルがアクセスできないbash環境変数に名前付き変数が残ります。BASH_FUNC_foo%%

もしそうなら、フォーマットにランダムな名前を許可する目的は何ですかenv var=value? POSIXはこれを許可しますか?

ベストアンサー1

もしそうなら、フォーマットにランダムな名前を許可する目的は何ですかenv var=value? POSIXはこれを許可しますか?

から引用POSIX: 環境変数:

POSIX.1-2008シェルボリュームとユーティリティボリュームでユーティリティが使用する環境変数名は、大文字、数字、および移植可能な文字セットで定義された文字( '_')で構成され、数字で始まらない。実装では他の文字を受け入れることができます(MAY)。アプリケーションはそのような名前の存在を許可する必要があります。

注:他のアプリケーションでは、数字で始まる環境変数名を処理するのが難しい場合があります。したがって、これらの名前はどこでも使用しないことをお勧めします。

したがって、実装は任意envの環境変数名を受け入れることができ、ほとんどの実装ではNUL以外のすべての文字を左側に許可し、他のユーティリティ(シェルなど'=')の実装では任意の環境変数名を許可または許可しない可能性があります。 。環境変数名が許可されます。

name=value ... utility同じ説明は、実装とシェルの両方でそれを環境変数として受け入れる場合にのみ適用されます。env var="value" utilityenvname

Austin Groupはこの問題に関する興味深い記事を投稿しました。環境で無効なシェルを割り当てる。言及されていることの1つは、シェルは通常、名前がシェル変数として表示される可能性がある環境変数のみを許可することです。このスレッドの複数の参加者がunix.stackexchange.comに参加しており、問題に関する詳細情報を追加できることを願っています。

おすすめ記事