Bash

為什麼環境變數與bash -c不同

  • May 10, 2019

為什麼會出現以下內容,即$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 -cis specifiedbash不作為互動式登錄shell 執行,因此它不會讀取相同的啟動腳本。任何設置在/etc/profile, ~/.bash_profile, ~/.bash_login, or中的東西~/.profile肯定會被跳過。

此外,如bash手冊頁所述:

Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,例如由遠端 shell 守護程序(通常rshd)或安全 shell 守護程序執行時sshd。如果 bash 確定它正在以這種方式執行,它會從 ~/.bashrc 和 讀取並執行命令~/.bashrc,如果這些文件存在並且是可讀的。

因此,如果它認為您沒有通過網路連接,它可能也不會讀取.bashrc文件,這將跳過上一步未跳過的所有內容。

解決方案

要解決此問題,我將創建一個腳本,將其設置PATH為合適的值,然後執行該命令。如果您想使用現有.profile文件或其他文件,則可以在腳本中獲取它。

引用自:https://serverfault.com/questions/816709