ここで何が起こっているのかを説明できる人はいますか?
$ 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 …`
出力を生成し、a
null値に設定され、環境を再び小さいサイズに縮小します。その後、3番目のコマンドが成功し、環境をサイズ制限に近づけます。
より明確に言えば、export a; a=$(yes | head -c128k)
外部コマンドを実行することはできません。