儘管 echo 是 shell 內建函數,為什麼「$ sudo echo 'yo'」仍然有效?

儘管 echo 是 shell 內建函數,為什麼「$ sudo echo 'yo'」仍然有效?

我明白那個

sudo cd /directory

將返回:

sudo: cd: command not found

因為 cd 是 shell 內建指令,而不是二進位檔。但是,為什麼

sudo echo 'this is a test'

工作正常?

這裡究竟發生了什麼事?如果不是 shell,如何sudo找到該指令?echo

答案1

原因很簡單,cd是一個 shell 內建函數(以及某些 shell 中的 shell 函數),而echo它既是二進位檔案又是 shell 內建函數:

$ type -a cd  
cd is a shell builtin
$ type -a echo 
echo is a shell builtin
echo is /bin/echo

sudo無法處理 shell 內建指令,但可以處理$PATH.當您使用sudo echo,時,/bin/echo在 中找到$PATH,因此它使用該,同時在 中sudo cd找不到,因此失敗。cd$PATH

答案2

跑步

 which echo

給出

 /bin/echo

echo是一個普通的程序,並且sudo可以“找到”它。

附帶說明,必須有一些選項sudoers(5)

答案3

問題更多的是sudo cd在作業系統上失敗而不是sudo echo成功。

sudo cd /directory是一種非常合法的方法來檢查給定使用者(可能root在這裡)是否被允許cd存取某個目錄。這就是為什麼所有 Posix 相容作業系統提供 的可執行版本cd

因此,您問題的答案是sudo echo yo按設計工作的,因為echo它是由 shell 別名和可執行命令提供的,但sudo cd /directory不是因為您的作業系統(可能基於 Gnu/Linux)正在破壞Posix 標準在這個具體案例中。

對於您的系統來說,一個簡單的解決方法是運行sudo sh -c "cd /directory"

相關內容