問題描述
我一直在更新bash的一些默認配置文件,並從我正在關注的教程中看到我可以使用以下命令重新加載新配置文件和新環境設置:
source /etc/bash.bashrc
唯一的事情是 – 新環境變量僅供我當前用戶使用 – 並且在使用sudo時被忽略。當我關閉終端會話並重新加入時,它們才可用於sudo。
當我嘗試使用時:
sudo source /etc/bash.bashrc
我收到錯誤:
sudo: source: command not found
是否有一種簡單的方法可以加載sudo的新bash配置文件設置而無需關閉終端並重新啟動?
– 最初,我使用了一些引用變量的安裝程序腳本。我發現當我直接調用腳本時他們可以訪問變量(雖然這會導致后來創建目錄的問題,因為我需要root),使用sudo調用安裝腳本不會。
我用這些簡單的命令測試證明了這一點:
echo $ENV_VARIABLE sudo echo $ENV_VARIABLE
第一個輸出變量的值,但第二個不輸出任何值。
最佳解決辦法
問題是source
是一個bash build-in命令(不是程序 – 如ls
或grep
)。我認為一種方法是以root用戶身份登錄,然后執行source命令。
sudo -s source /etc/bash.bashrc
次佳解決辦法
問題不在於source
是shell內置命令。它實際上是扔你command not found
錯誤的事實,但並不意味着它會起作用。
實際問題是環境變量如何工作。它們的工作方式如下:每次啟動新進程時,如果沒有任何反應,它將繼承其父進程的環境。因此,使用子shell(例如在bash實例中鍵入bash
)並查看env
的輸出應該得到與其父級相似的結果。
但是,由於sudo
的工作方式(如其聯機幫助頁中所述),sudo嘗試剝離用戶的環境並為替換用戶創建”default”環境,以便運行命令運行,就像調用它的用戶一樣調用用戶(這是預期的行為),因此運行nautilus作為sudo nautilus
應該在/root
文件夾中打開一個文件夾,而不是/home/yourusername
。
所以:
做一些像sudo source script.sh
然后再做sudo command
的事情,即使它起作用,它也不會成功地將任何變量設置為后面的sudo command
。
為了傳遞環境變量,您可以告訴sudo保留環境(通過-E
開關;在sudoers文件中具有適當的權限)和/或將命令設置為sudo VAR1=VALUE1 VAR2=VALUE2 command
。
第三種解決辦法
作為Marcos says,您的主要問題是source
是一個shell內置命令,它只影響運行它的shell進程。
簡單的解決方案是以root身份啟動一個新的shell,bash會在啟動時自動讀取/etc/bash.bashrc
。這就像說的一樣簡單
sudo bash
第四種辦法
關閉和重新開放終端不應該改變事情。默認情況下,sudo剝離環境。要禁用它,請將-E添加到sudo。