Bash為什麼環境變數與
為什麼環境變數與bash -c
不同
為什麼會出現以下內容,即
$PATH
直接從以下內容回顯bash -c
:docker exec -i -t my_container bash -c "echo $PATH"
返回的值不同於後面的值
$PATH
,即啟動互動式 bash 會話並回顯$PATH
?docker exec -i -t my_container bash root@21e6d898c3c2:/# echo $PATH
為了給這個問題提供一些背景資訊,我想在容器中執行一個命令,
docker exec
如果我啟動一個互動式 bash 會話,這個命令就在路徑上,但如果我只是執行命令就不是。在這種情況下,使用執行檔的完整路徑不是一種解決方法,因為該命令依賴於其他環境變數,就像
PATH
在 bash 互動式會話中設置的那樣,但如果我直接執行命令則不會。
When
-c
is specifiedbash
不作為互動式或登錄shell 執行,因此它不會讀取相同的啟動腳本。任何設置在/etc/profile
,~/.bash_profile
,~/.bash_login
, or中的東西~/.profile
肯定會被跳過。此外,如
bash
手冊頁所述:Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,例如由遠端 shell 守護程序(通常
rshd
)或安全 shell 守護程序執行時sshd
。如果 bash 確定它正在以這種方式執行,它會從~/.bashrc
和 讀取並執行命令~/.bashrc
,如果這些文件存在並且是可讀的。因此,如果它認為您沒有通過網路連接,它可能也不會讀取
.bashrc
文件,這將跳過上一步未跳過的所有內容。解決方案
要解決此問題,我將創建一個腳本,將其設置
PATH
為合適的值,然後執行該命令。如果您想使用現有.profile
文件或其他文件,則可以在腳本中獲取它。