
當您運行“su -c”時,環境會發生什麼?
我問的原因是這種神祕的行為:
bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:...
bash$ su - user -c "firefox ..."
-bash: firefox: command not found
有任何想法嗎?
答案1
您所看到的事實是,在命令運行$PATH
之前,參數處理期間,第一個使用者 shell 中已展開,su(1)
因此看起來總是如此。如果您使用硬引號 ( 'echo $PATH'
),您應該會看到不同的內容,或者只是這樣做\$
。
這將保留$PATH
語法直到su(1)
命令運行之後。雖然它通常不會幹擾環境,但它確實會啟動新的 shell,因此您應該檢查PATH=
各種 shell 啟動腳本中的行。
你su(1)
有一個-c
選項,所以你看起來像是在 Linux 上。在 Mac 或 BSD 上,您將獲得簡化的PATH
登入信息,PATH
但您仍然會遇到相同的“我何時擴展 PATH?”問題。
答案2
當使用su -
或su -l
時,它會模擬登入會話,其中涉及將環境重置為乾淨狀態。
在 Arch Linux 上,su -
使用硬編碼字串/usr/ucb:/bin:/usr/bin:/etc
作為新的$PATH
.在其他系統上,它可能ENV_SUPATH
從讀取/etc/login.defs
,或依賴 PAM 來設定環境。
su ... "echo $PATH"
謊言,因為該部分是在啟動$PATH
之前由您目前的 shell 擴展的。su
請改用su ... 'echo $PATH'
(注意單引號)或su - -c env
(列印完整的環境)。