xargsの不規則な引数の数

xargsの不規則な引数の数

数字はなぜこんなに不規則なのですか?

echo {1..200000} | xargs perl -E 'say "ok:", scalar @ARGV'
ok:23691
ok:21840
ok:21840
ok:21840
ok:20261
ok:18720
ok:18720
ok:18720
ok:18720
ok:15648

標準引数の長さがさらに文明化されました。

perl -E' say "1 " x 900000' | xargs perl -E 'say "ok:", scalar @ARGV'
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:65520
ok:48240

重要な要素は正確に何ですか?

ベストアンサー1

重要な数字は(すべての)引数の合計長であり、コマンドバッファサイズxargsが使用することを決定します。

最初は実行するコマンドの固定コマンドラインによって異なり、各呼び出しにxargs引数が与えられます。perl -E 'say "ok:", scalar @ARGV'は32バイトで、文字列を終了するNULバイトを計算します(perl<NUL>-E<NUL>say "ok:", scalar @ARGV<NUL>たとえば、2番目の例では、すべての引数はそれぞれ2バイトです。つまり1<NUL>、.so 32 + 65520 * 2バイトまたは131072 B = 128 * 1024 B = 128kB)。

明らかに、最初の例では引数の長さが異なり、指定された数も異なりますが、論理は同じでなければなりません。たとえば、2番目から4番目の実行までの21840引数は、5ビット引数(引数あたり6バイト)と一致します(21840 * 6 + 32 = 131072)。

コマンドバッファのサイズは実装によって異なりますが、GNU xargsを使用してそれを表示できます。xargs --show-limits私のLinuxでは、次のようになります。

$ echo | xargs --show-limits
Your environment variables take up 2305 bytes
POSIX upper limit on argument length (this system): 2092799
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2090494
Size of command buffer we are actually using: 131072
Maximum parallelism (--max-procs must be no greater): 2147483647

2番目から最後の行を見ると、まったく同じ数です。

-sたとえば、10kB バッファのみを使用して、使用するバッファサイズを変更できます。

$ perl -E' say "1 " x 90000' | xargs -s 10240 perl -E 'say "ok:", scalar @ARGV' 
ok:5104
ok:5104
ok:5104
...

もちろん、-n個々のパラメータの数も制限する必要があります。

$ echo {1..200000} | xargs -n 10000 perl -E 'say "ok:", scalar @ARGV' 
ok:10000
ok:10000
ok:10000
...

--show-limits環境変数が言及される理由は、コマンドラインパラメータと同じスペースを使用するためであり、バッファサイズをシステム最大値に近づけると、そのサイズも重要になり始めます。

システムで計算するかどうかはわかりません。引数文字列の制限については反対意見がありますが、少なくともxargsはそれを気にしないようです。

おすすめ記事