Linux下執行一些命令前加sudo時出現command not found的原因

鍾超發表於2012-01-28

轉載請註明來自“柳大的CSDN部落格”:http://blog.csdn.net/poechant


當我們用sudo來執行cd、ls等命令時,會出現command not found的提示:

sudo cd /home/michael
sudo: command not found

我們知道在執行Linux命令時,如果在其前面加上sudo,就表示以root許可權執行。但是這其實是有一個前提的,就是隻有那些Linux內建系統命令才可以用如此的形式來執行,而對於Shell內建命令或其他使用者自定義命令、別名等,是不能用sudo來使用root許可權的。為什麼呢?詳細說一下sudo幕後隱藏的過程才能明白。


因為當在Linux下用sudo執行某一命令時,是在原程式(parent process)的基礎上fork出來一個子程式(child process),這個子程式是以root許可權執行的。然後在子程式中,執行你在sudo後面跟的命令。


在子程式中是無法呼叫涉及到父程式的狀態的一些命令的,所以非系統內建命令會被拒絕。這就是為什麼會出現command not found的提示。具體來說,當我們執行:

sudo cd /home/michael

所在這個shell程式中(稱其為PP,表示parent process)fork出一個子程式(稱其為CP,表示child process),那麼在CP中是無法改變PP的所在目錄的。

sudo ls /home/michael

sudo後由PP產生了CP,CP是無法獲取PP所在的目錄的內容的(具體來說,是讀取該目錄的block data,可詳見《柳大的Linux遊記·基礎篇(2)Linux檔案系統的inode》一文)。


轉載請註明來自“柳大的CSDN部落格”:http://blog.csdn.net/poechant

-

相關文章