数字はなぜこんなに不規則なのですか?
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はそれを気にしないようです。