ここでは、引数配列全体の合計サイズと環境のサイズ(これはに制限されていARG_MAX
ます)ほど、1つの引数の最大長は問題ではないという印象を受けました。したがって、次のようなことが成功すると思いました。
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
- 100
シェルでの環境の大きさとの間の差を考慮するために十分すぎるほどであることがよりecho
プロセス。代わりに、エラーが発生しました:
bash: /bin/echo: Argument list too long
しばらく遊んだ後、最大値は完全な16進数の桁より小さいことがわかりました。
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
マイナス1が削除されると、エラーが返されます。一見、単一の引数の最大値は実際にARG_MAX/16
あり-1
、引数配列の文字列の最後に置かれたヌルバイトを考慮しています。
別の問題は、引数が繰り返されると、引数配列の合計サイズがに近くなる可能性があるARG_MAX
が、それでもまだそこにはないということです。
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; do
args+=( ${args[0]} )
done
/bin/echo "${args[@]}" "${args[0]:6534}" >/dev/null
"${args[0]:6533}"
ここを使用すると、最後の引数が1バイト長くなり、Argument list too long
エラーが発生します。この違いは、与えられた環境のサイズによって説明されることはほとんどありません。
$ cat /proc/$$/environ | wc -c
1045
質問:
- これは正しい動作ですか、またはどこかにバグがありますか?
- そうでない場合、この動作はどこにも文書化されていますか?単一の引数の最大値を定義する別のパラメーターはありますか?
- この動作はLinux(または特定のバージョンでも)に制限されていますか?
- 引数配列の実際の最大サイズと環境のおおよそのサイズの間の追加の〜5KBの不一致の原因は何
ARG_MAX
ですか?
追加情報:
uname -a
Linux graeme-rock 3.13-1-amd64 #1 SMP Debian 3.13.5-1 (2014-03-04) x86_64 GNU/Linux
getconf ARG_MAX
は、現在のに依存していulimit -s
ます。無制限に設定すると、ARG_MAXの素晴らしい4611686018427387903が得られます。