Environment-Variables
設置一個長的環境變數會破壞很多命令
弄亂環境變數時,我一直看到一種奇怪的行為。我正在設置一個很長的環境變數,這會阻止啟動任何命令:
( 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
這裡發生了什麼?
程序啟動時,參數列表和命令環境將復製到記憶體中的同一空間中。錯誤資訊是“Argument list too long”,但實際上確切的錯誤是參數列表加上環境太長。
這作為
execve
系統呼叫的一部分發生。大多數(如果不是全部)unix 變體對此臨時空間的大小都有限制。這個限制的原因是為了避免錯誤或惡意程序導致核心使用該程序自己的記憶體空間之外的大量記憶體。POSIX 標準指定此記憶體空間的最大大小必須至少為
ARG_MAX
,並且該( ) 的最小值_POSIX_ARG_MAX
為 4096。實際上,大多數 Unix 變體允許超過此大小,但不允許 10MB。您可以使用 來檢查系統上的值getconf ARG_MAX
。在現代 Linux 系統上,最大值為 2MB(採用典型設置)。傳統上,許多系統都有 128kB 的限制。Linux對單個參數的值或環境變數的定義也有128kB 的限制。如果您需要傳遞超過幾百字節的資訊,請將其傳遞到一個文件中。