next up previous
Next: 在 shell script 中要怎麼讓終端機發出聲音呢? Up: 初學者可能會問的基本問題 Previous: 在 Bourne shell script 裡要怎麼找出最後一個參數?

為什麼有人說 $PATH 裡不可以放 '.' 呢?

背景知識: 環境變數 PATH 是一串用冒號隔開的目錄。當你下一個指令而 沒有指定所在的目錄,例如 "ls" 而非 "/bin/ls",則你的 shell 就會在  PATH 所指定的目錄中去找尋指令。

你可以在 PATH 裡面放入目前所在的目錄 "." 。或者,在 PATH 中加入一 個空的目錄,這兩者是等效的

for csh users:
	        setenv PATH :/usr/ucb:/bin:/usr/bin
	        setenv PATH .:/usr/ucb:/bin:/usr/bin
for sh or ksh users
	        PATH=:/usr/ucb:/bin:/usr/bin export PATH
       		PATH=.:/usr/ucb:/bin:/usr/bin export PATH
把 "." 放在 PATH 中是很方便的,若要執行 "./a.out" 只要打 "a.out" 即可,但是這麼做會有大麻煩。

當把 "." 放在 PATH 的最前面情況下。若你目前所在目錄是如 "/tmp" 這 樣大家都可以寫的地方。如果有別的使用這放了一個名為 "ls" 的程式在 那裡,而你打入 "ls" 那你可能就死得非常難看了。

把 "." 放到 PATH 的結尾是個比較好的做法:

	        setenv PATH /usr/ucb:/bin:/usr/bin:.
這麼一來,當你在 "/tmp" 中打 "ls" 時, shell 就會先找 "/usr/ucb",  "/bin" 與 "/usr/bin" 裡的 "ls"。減少了一點危險。不過仍然不是百分之 百安全。假如你是個笨拙的打字者,有一天你把 "ls -l" 打成 "sl -l", 而又有一個聰明的使用者能猜到這種常見的打字錯誤,在 "/tmp" 底下放 了一隻 "sl",你還是得死。所以啊,千萬要小心。

有許多 Unix 老手都不把 "." 放在 PATH 裡:

	        setenv PATH /usr/ucb:/bin:/usr/bin
要用目前目錄裡的 "program" 就打 "./program"。他們認為犧牲一點方便換 取安全是值得的。



Tan Koan-Sin
1999-03-02