當您運行“su -c”時,環境會發生什麼?

當您運行“su -c”時,環境會發生什麼?

當您運行“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(列印完整的環境)。

相關內容