![設定很長的環境變數會破壞很多指令](https://rvso.com/image/109248/%E8%A8%AD%E5%AE%9A%E5%BE%88%E9%95%B7%E7%9A%84%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8%E6%9C%83%E7%A0%B4%E5%A3%9E%E5%BE%88%E5%A4%9A%E6%8C%87%E4%BB%A4.png)
當弄亂環境變數時,我發現了一種奇怪的行為。我正在設定一個很長的環境變量,這會阻止啟動任何命令:
( 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 限制。
如果需要傳遞超過幾百位元組的訊息,請將其傳遞到文件中。