問題描述
我想要cd到/etc/docker,但是它給我一個權限不夠的錯誤,然後,我想到使用sudo cd /etc/docker時,它告訴我sudo: cd:找不到指令。
于是,郁悶的我就去上網找了下原因。
問題分析
shell
shell是一個指令解析器
所謂shell是一個互動式的應用程式。
shell執行外部指令的 時候,是通過fork/exec叉一個子程序,然後執行這個程式。
sudo
sudo 是一種程式,用于提升使用者的權限,在linux中輸入sudo就是調用sudo這個程式提升權限
sudo的意思是,以别人的權限叉起一個程序,并運作程式。
cd
cd是shell的内部指令。
也就是說,是直接由shell運作的,不叉子程序。
你在目前程序裡當然不能提升程序的權限(其實也可以,不過得程式設計的時候寫到代碼裡,然後再編譯,而我們的 shell沒有這個功能,否則豈不是太危險了?
黑客.sh
cd
不是一個應用程式而是Linux内建的指令,而
sudo
僅僅隻對應用程式起作用。
sudo foo
隻意味着以root權限運作foo程式
是以,
sudo cd /etc/docker
會報
sudo: cd:找不到指令。
驗證
> type cd
cd is a shell builtin
注意,關于cd是不是内建指令,OS X 10.8中cd不是内建指令(可以參考what-is-the-point-of-the-cd-external-command),具體其他的版本的OS X我就不清楚了,大部分的Linux系列(Ubuntu、CentOS和ArchLinux)中cd都是内建指令
解決方法
- 使用
指令提升使用者權限sudo -i
> sudo -i
> cd /etc/docker
- 使用
指令打開特殊shellsudo -s
> sudo -s
> cd /etc/docker