問題の背景:によるとPOSIX仕様、ARG_MAXは最大値です。長さ関数系列のコマンドライン引数ですexec()
。これは本当だと信じています。数字しかし、これは明らかに動作しません。
$ ulimit -s
8192
$ touch {1..18000}.jpg
$ rm *.jpg
$
明らかに8192以上のアイテムがあるにもかかわらずうまくいきます。 ~によるとDWの回答、8192
サイズはkB単位と呼ばれます。明らかに、前の仮定は間違っていました。
実際の質問は次のとおりです。実際のアイテム数はどのようにわかりますか?〜する8192kBの制限を超えていますか?つまり、この*.jpg
タイプのglobがArgument list too long
エラーを引き起こすためにどのような計算を行う必要がありますか?
重複ではないので参考にしてください単一コマンド引数の最大サイズを定義する。私はそれを理解getconf ARG_MAX
してulimit -s
大切にします。それは私の問題ではありません。私は方法を知る必要がありますサイズが制限を超える十分なパラメータを生成します。。つまり、エラーを回避するのではなく、エラーを取得する方法を見つける必要があります。
ベストアンサー1
getconf ARG_MAX
長いリスト生成を使用しx
、それを引数として外部ユーティリティを呼び出すと、「パラメータリストが多すぎる」というエラーが生成されます。
$ /bin/echo $( perl -e 'print "x" x $ARGV[0]' "$(getconf ARG_MAX)" )
/bin/sh: /bin/echo: Argument list too long
エラーが発生する原因には環境と文字列の長さが/bin/echo
含まれているため、以下を引くことで可能な最大数を見つけることができます。
$ env
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
(このシェルをで始めたので、env -i sh
環境には変数のみがあります)PATH
$ /bin/echo $( perl -e 'print "x" x ($ARGV[0] - length($ENV{"PATH"}) - length("/bin/echo"))' "$(getconf ARG_MAX)" )
sh: /bin/echo: Argument list too long
まだ長すぎます。どのくらい?
i=0
while ! /bin/echo $( perl -e 'print "x" x ($ARGV[0] - length($ENV{"PATH"}) - length("/bin/echo") - $ARGV[1])' "$(getconf ARG_MAX)" "$i" )
do
i=$(( i + 1 ))
done
ループはforを終了しますi=8
。
だからすぐに解釈できない4バイトがあります(8バイトのうち4バイトは名前環境PATH
変数)。これは、4つの文字列、PATH
値、および長い文字列のnull終端文字です。PATH
/bin/echo
x
気づく各パラメーターはnullで終わるため、コマンドにパラメーターが多いほど、結合された長さは短くなります。
また、一般環境の効果を示すために、
$ export BIG=$( perl -e 'print "x" x $ARGV[0]' "$( getconf ARG_MAX )" )
$ /bin/echo hello
sh: /bin/echo: Argument list too long
$ /bin/echo
sh: /bin/echo: Argument list too long