我明白那個
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"