為什麼我會在 /etc/environment 中定義的環境變數中得到這個額外的引號?
在我們的 CentOS 伺服器中,env 變數
NODE_OPTIONS
被設置為錯誤的值。我檢查了一些可能的文件,例如 /etc/environment、/etc/profile,但沒有運氣。我也嘗試從 /etc/ grep ,仍然沒有運氣。這讓我心煩意亂。我什至試過這個: https ://unix.stackexchange.com/a/154971/92712
驚訝地發現輸出中沒有這樣的變數。但它在
printenv NODE_OPTIONS set | grep NODE_OPTIONS echo $NODE_OPTIONS
(外殼是 bash)
有什麼辦法可以得到這個 NODE_OPTIONS 來自哪個文件?
更多資訊:
$ node -v node: invalid value for NODE_OPTIONS (unterminated string) $ echo $NODE_OPTIONS --max-old-space-size=5120" $ cat /etc/environment export NODE_OPTIONS="--max-old-space-size=5120"
更新:
謝謝 ilkkachu
$ declare -p NODE_OPTIONS declare -x NODE_OPTIONS="--max-old-space-size=5120\" "
更新2:額外的雙引號
env
也出現在輸出中:$ env NODE_OPTIONS=--max-old-space-size=5120"
更新 3:謝謝@Johan Myréen
$ od -c /etc/environment 0000000 \n e x p o r t N O D E _ O P T 0000020 I O N S = " - - m a x - o l d - 0000040 s p a c e - s i z e = 5 1 2 0 " 0000060 # i n c r e a s e t o 5 g 0000100 b \n \n 0000103
$ cat /etc/environment export NODE_OPTIONS="--max-old-space-size=5120"
所以,
/etc/environment
有點奇怪。它由 閱讀pam_env.so
,並且手冊頁說它應該包含*“單獨行上的簡單 KEY=VAL 對”,但手冊頁的某些版本說“可以指定導出指令以實現 bash 兼容性,但將被忽略。”*在任何情況下,它都不會被 shell 讀取,並且不支持所有的 shell 語法。手冊頁沒有提到引號,它不支持反斜杠轉義或擴展其他變數,即類似
PATH=$PATH:/some/path
或FOOPATH=$HOME/foo
不起作用的東西。但是,這還不是全部,因為它似乎確實將
#
符號視為註釋標記,即使在一行的中間,至少在我的 Debian 上,它確實會刪除值的開頭和結尾的引號,如果它們存在的話,但是不關心他們是否匹配。例如,左邊的兩行,我得到右邊的兩個值:
/etc/environment
結果變數 TEST1="hash#sign"
TEST1=hash
TEST2="mixed quotes'
TEST2=mixed quotes
根據您的
od
輸出,您/etc/environment
實際上包含以下行:export NODE_OPTIONS="--max-old-space-size=5120" #increase to 5gb
它在井號上被剪切,但由於結束引號後的空格,引號無法辨識或刪除,並且您在值中同時獲得空格和引號。
要遵循手冊中有關“簡單鍵=值對”的內容,您可以使用:
# increase to 5 GB NODE_OPTIONS=--max-old-space-size=5120
但根據上面的註釋
export
和觀察,這可能也會起作用:# increase to 5 GB export NODE_OPTIONS="--max-old-space-size=5120"
只需注意清理任何尾隨空格,它們可能會出現在值中或導致其他問題。
有關的: