非常に長い環境変数を設定すると、多くのコマンドが中断されます。

非常に長い環境変数を設定すると、多くのコマンドが中断されます。

環境変数を操作するときに奇妙な動作が見つかりました。どのコマンドも実行されないようにする非常に長い環境変数を設定しています。

( 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にも1つあります単一パラメータ値または環境変数定義の制限は128kBです。

数百バイトを超える情報を渡す必要がある場合は、その情報をファイルに渡してください。

おすすめ記事