網路農夫 --  Home 網路農夫 --  Home
網路農夫 --  Home
wait.....

4-2-15 nonomatch 變數

在我們使用 C shell 的一般的情況下,大都不會放棄使用 wildcard 功能,因為它實在帶給我們相當多的便利。不過使用這項功能對某些指令的執行會造成一些負面的影響,讓我們來看幾個指令執行的錯誤例子:

% ls
aaa abc akira core
% rm *.tmp core
No match.
% ls
aaa abc akira core

我們看到指令“rm *.tmp core”在執行第一個引數“*.tmp”產生錯誤,因為工作目錄下並沒有這類檔名的檔案存在。不過指令 rm 卻會因為這項錯誤而終止執行下一個引數“core”。所以當我們在一次以指令 ls 來查看執行狀況時,你會驚訝地發現檔案“core”並沒有被清除。這或許在指令行模式下會被我們發現,但如果是在 C shell 文稿中,這可就是個嚴重的 bug 了。

 

在使用 C shell 時要消除這類因使用 wildcard 所產生的問題,有兩種方式。一是設定變數 noglob 乾脆放棄使用 wildcard 功能。另一個便是設定 nonomatch 變數,它可以消除這類問題,同時你也能繼續保有使用 wildcard 的功能。

% set nonomatch
% rm *.tmp core ; ls
rm: *.tmp: No such file or directory
aa abc test

我們可以看到在設定 nonomatch 變數後,檔案“core”被清除了。

當然在設定 nonomatch 變數後,因為指令執行上也的改變,也有一種情況會與未設定前不同,那就是指令的執行狀態也改變了。見下面說明:

% ls *.tmp ; echo $status
No match.
1
% set nonomatch
% ls *.tmp ; echo $status
*.tmp not found
0

在設定 nonomatch 變數之前,指令 ls 如果無法找到合符條件的檔案,它的指令執行狀態是失敗的,所以為“1”。但是設定了 nonomatch 變數之後,指令 ls 在相同的情況下,指令的執行狀態則是成功的,所以為“0”。這可是相當大的變化,請讀者在使用上也最好注意到這種設定後的變化情況。萬一你要使用指令的執行狀態來作為判斷依據時,可得小心!免得因為這個變化,使程式多出一個 bug。

 

版本:Beta-2001-05 -- 網路農夫