GNU/Linux >> Linux の 問題 >  >> Linux

「引数リストが長すぎる」エラーを発生させる方法は??

この質問にはすでに回答があります :コマンドの単一引数の最大サイズを定義するものは何ですか?

(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の長い文字列 文字。

関連:Linux – USBスティックの検出に時間がかかるのはなぜですか?

それぞれに注意してください 引数は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

Linux
  1. / usr/binと/usr/ local / bin Linuxの場合?

  2. / usr / bin / chmodなしでchmodする方法は?

  3. Linux – / usr/binと/usr/sbinを/bin(gnu / linux)にマージしますか?

  1. bash:/bin/tar:tar で多数のファイルを圧縮すると、引数リストが長すぎます

  2. シェル文字列内の単語のリストを逆にする方法は?

  3. プロセスが実行されているフォルダーを見つける方法は?

  1. 公開鍵をサーバーにコピーする方法

  2. /bin の内容を /usr/bin に移動しました。元に戻すことはできますか?

  3. echo または print /dev/stdin /dev/stdout /dev/stderr