1. 程式人生 > >Linux sudo一些命令出現 command not found 的原因

Linux sudo一些命令出現 command not found 的原因

當我們用 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的所在目錄的。