だからPOSIX仕様私たちは次の定義を持っています*
:
1から始めて位置パラメータに展開され、最初は各位置パラメータセットのフィールドが生成されます。フィールド分割が実行されるコンテキストで拡張が発生した場合は、空のフィールドを削除することができ、空でない各フィールドは、フィールド分割の説明に従ってさらに分割する必要があります。フィールド分割を行わないコンテキストで拡張が発生した場合、IFSに1つ以上の文字が含まれている場合は、最初のフィールドを連結して単一のフィールドを形成する必要があり、各引数の値はIFS変数の最初の文字で区切られます。 IFS が設定されていない場合は a で区切られます。 IFS が空の文字列に設定されている場合、区切り文字は使用されません。
私たちのほとんどは、以下のよく知られたARG_MAX
制限を知っています。
$ getconf ARG_MAX
2621440
これにより、以下が発生する可能性があります。
$ cat * | sort -u > /tmp/bla.txt
-bash: /bin/cat: Argument list too long
ありがたいことに、その背後にある良い人([POSIXのような他のすべての人を含む])が私たちに組み込まれた機能をbash
提供することで、単に次のことができます。printf
printf '%s\0' * | sort -u --files0-from=- > /tmp/bla.txt
すべてがユーザーにとって透明です。
コマンドをARG_MAX
使用して制限をバイパスするのがなぜそんなに簡単なのか、スタンドアロンの実行可能ファイルの特殊パラメータをエレガントに処理する一貫したPOSIXシェルソルバーを提供するのはなぜそんなに難しいのか、誰かが教えてくれますか?built-in
*
$ cat *
それは問題になりますか?人々に組み込みコマンドをbash
提供するように求めるものではありません。作業順序とコマンドが組み込みコマンドかスタンドアロン実行可能ファイルであるかに応じて、サイズ変更が異なるように動作する理由にのみ興味があります。cat
*
ベストアンサー1
制限はシェルではなく、exec()
機能系列にあります。
POSIX規格これに関連する発言:
新しいプロセスの結合引数と環境リストに使用できるバイト数はです
{ARG_MAX}
。ヌル終端子、ポインター、および/またはソートバイトがこの合計に含まれるかどうかは、実装によって定義されます。
シェルに組み込まれているユーティリティを実行するためにシェルを呼び出す必要はないため、exec()
この制限の影響を受けません。
制限されるのは、コマンドラインの長さだけでなく、コマンドの長さ、引数、現在の環境変数、およびその値の組み合わせでもあります。
printf
また、いいえpdksh
sh
たとえば(OpenBSDで組み込みユーティリティとして機能する場合)ksh
。これを組み込み機能として使用するには、使用される特定のシェルを考慮する必要があります。