環境変数をいじっていると奇妙な動作が見られるようになりました。非常に長い環境変数を設定しているのですが、これが原因でコマンドが起動できません。
( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )
$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long
ここで何が起きてるの ?
答え1
プログラムの起動時に、コマンドの引数リストと環境がメモリ内の同じ領域にコピーされます。エラー メッセージは「引数リストが長すぎます」ですが、実際の正確なエラーは、引数リストと環境が長すぎるということです。
これは、execve
システム コール。ほとんどの UNIX バリアントでは、この一時領域のサイズに制限があります。この制限の理由は、バグのあるプログラムや悪意のあるプログラムによって、カーネルがそのプログラム自身のメモリ領域外で大量のメモリを使用することを回避するためです。
のPOSIX標準このメモリ空間の最大サイズは少なくとも でなければならないことARG_MAX
、および最小値そのうち ( _POSIX_ARG_MAX
) は 4096 です。実際にはほとんどの Unix 系ではそれ以上の容量が許容されますが、10MB は許容されません。システム上の値は で確認できますgetconf ARG_MAX
。最近の Linux システムでは、最大値は 2MB です (一般的な設定の場合)。従来、多くのシステムでは 128kB の制限がありました。Linux には、単一の引数の値または環境変数の定義には 128kB の制限があります。
数百バイトを超える情報を渡す必要がある場合は、ファイルで渡します。