Linux sudo一些命令出現 command not found 的原因
阿新 • • 發佈:2019-02-14
當我們用 sudo 來執行 cd、source、type 等命令時,會出現 command not found 的錯誤提示:
$ sudo cd ~
sudo: cd: command not found
我們知道在執行 Linux 命令時,如果在其前面加上sudo,就表示以root許可權執行。但是這其實是有一個前提的,就是隻有那些 Linux 內建系統命令才可以用如此的形式來執行,而對於 Shell 內建命令或其他使用者自定義命令、別名等,是不能用sudo來使用root許可權的。為什麼呢?詳細說一下sudo幕後隱藏的過程才能明白。
這裡首先插一句:
一個命令是 Linux 內建系統命令還是 shell 內建命令的判斷依據,可通過 type 命令進行判斷:
$ type cd
cd is a shell builtin
$ man cd
No manual entry for cd
$ sudo cd ~
sudo: cd: command not found
$ type cp
cp is /bin/cp
$ sudo cp
因為當在Linux下用sudo執行某一命令時,是在原程序(parent process)的基礎上 fork 出來一個子程序(child process),這個子程序是以 root 許可權執行的。然後在子程序中,執行你在sudo後面跟的命令。
在子程序中是無法呼叫涉及到父程序的狀態的一些命令的,所以非系統內建命令會被拒絕。這就是為什麼會出現command not found的提示。具體來說,當我們執行:
$ sudo cd ~
所在這個shell程序中(稱其為PP,表示parent process)fork出一個子程序(稱其為CP,表示child process),那麼在CP中是無法改變PP的所在目錄的。