bash: /usr/bin/perl: パラメーターのリストが長すぎます。

bash: /usr/bin/perl: パラメーターのリストが長すぎます。

ここで何が起こっているのかを説明できる人はいますか?

$ export a
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long

(perl one linerは1,000,000 zsを含む文字列を生成します)。実行するたびにコマンドラインが長すぎるのはなぜですか?

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

編集する

実行に失敗したため$aがリセットされるようです。制限は131070のようです。この値の下にエラーはありません。

答え1

これは、渡される引数と環境変数のサイズの制限です。実装する

  • POSIXを指定してARG_MAX
  • 2.6.23より前のLinuxカーネルバージョンは32ページに制限されていました(MAX_ARG_PAGES)。 4kBページサイズの場合、制限は128kBです。
  • Linuxカーネル2.6.23以降、許容スタックサイズの1/4に制限されています。

制限もありますので参考にしてくださいexecveに渡される文字列の最大長と数。 Linuxのソースコードにハードコードされており、許容されるスタックサイズに関係なく適用されます。

あなたは見ることができます人2が実行されます。詳細については。

2回目の実行ではPerlプロセスが開始されないため、コマンド置換は空の`perl …`出力を生成し、anull値に設定され、環境を再び小さいサイズに縮小します。その後、3番目のコマンドが成功し、環境をサイズ制限に近づけます。

より明確に言えば、export a; a=$(yes | head -c128k)外部コマンドを実行することはできません。

関連情報