當前位置: 首頁>>技術教程>>正文


sudo:source:找不到命令

, , ,

問題描述

我一直在更新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命令(不是程序 – 如lsgrep)。我認為一種方法是以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。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/1922.html,未經允許,請勿轉載。