(3つの回答)
2年前に閉鎖されました。
質問のコンテキスト:POSIX仕様によると、ARG_MAXは最大長さです exec()
へのコマンドライン引数の例 関数のファミリー。それが実際の数だと私は信じるようになりました 議論の一部ですが、それは明らかに機能しませんでした:
$ ulimit -s
8192
$ touch {1..18000}.jpg
$ rm *.jpg
$
明らかに、これは8192アイテムを超える長さにもかかわらず、正常に機能します。 D.W.の回答によると、8192
おそらくkB単位のサイズです。したがって、明らかに以前の仮定は間違っていました。
ここで実際の質問が出てきます。実際になるアイテムの量を把握するにはどうすればよいですか。 8192 kBの制限を超えますか?つまり、*.jpg
を確実にするために、どのような計算を実行する必要があるかということです。 グロブのタイプは、Argument list too long
になります エラー?
これは、単一のコマンド引数の最大サイズを定義するものと重複していないことに注意してください。 getconf ARG_MAX
について知っています およびulimit -s
値、それは私の質問ではありません。 制限を超えるサイズの十分な引数を生成する方法を知る必要があります 。言い換えれば、エラーを回避するのではなく、エラーを取得する方法を見つける必要があります。
承認された回答:
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
このループはi=8
で終了します 。
したがって、すぐには説明できない4バイトがあります(8バイトのうち4バイトは名前である必要があります PATH
の 環境変数)。これらは、4つの文字列PATH
のヌルターミネータです。 、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