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

3-8-3 source [-h] filename 指令

[-h] 選項 將所讀取的指令列入過去指令使用記錄(history list)中,但並不執行所讀入的指令。

source 指令能從指定的檔案中讀取指令來執行,常用以執行修改過後的特殊檔案,如“.cshrc”、“.login”檔案等。比方你以 vi 指令更改“.cshrc”的 path 變數後,要如何來“執行”呢?你必須使用 source 這個內建指令來執行它。如下:

% source ~/.cshrc

執行後 path 變數便是你所更新的設定值。這可是一個相當重要的內建指令。

 

在使用 source 指令來讀取檔案的執行過程中,請注意一個特殊情況。就是一但產生指令無法執行或產生錯誤時,則執行的動作將會在該指令行被終止,未執行部份將不再執行。關於這種情況,我們用指令 source 來執行一個分離的別名檔案來做說明:

假定檔案“.aliases”內容為下:

2 % cat -n .aliases
1 alias rmr rm -r
2 alias cd 'cd \!*;set prompt = "\! <$cwd>
3 alias vicsh 'vi \!:1 ; chmod u+x \!:1'
4 alias lsa ls -asF
3 % source .aliases
Unmatched '.
4 % alias
rmr rm -r
5 %

當我們以執行指令“source .aliases”時,產生錯誤訊息“Unmatched '.”。表示檔案“.aliases”中有不合語法的 alias 設定,產生了無法執行的情況。此時我們用指令 alias 來看我們執行成功的別名時,發現僅第一行設定成功,而第二至第四行均沒有被設定。這是因為我們用指令 source 執行檔案“.aliases”時,讀取檔案的第二行要執行時,產生了的語法錯誤,指令 source 於是便停止以下各行指令的“執行”所造成的結果。當然第二行以後便不會執行讀取的動作了。

 

此外在不加選項情況下使用 source 指令,執行時所讀取執行的指令並不會加入 history list 中。如果有需要加入 history list 中,必需加選項 -h。但加上選項 -h 的執行方式與不加選項 -h 時,有相當大的差異。首先是它只讀取整個檔案的所有指令行進入 history list 中,但並不執行指令行。其次是它也不會檢查指令行的語法是否正確。所以在產生像上述的錯誤時,加上選項 -h 的指令 source,依然會繼續讀取下一行直到整個檔案讀取完畢為止。讓我們再利用上面的檔案“.aliases”來說明:

18 % csh -v
1 % alias
alias

首先我們執行 csh -v,用意在產生一個可觀看執行情況的 subshell。當執行指令 alias  查看時發現到並沒有任何別名已設定。

2 % source -h .aliases
source -h .aliases
alias rmr rm -r
alias cd 'cd \!*;set prompt = "\! <$cwd>
alias vicsh 'vi \!:1 ; chmod u+x \!:1'
alias ls ls -asF

此時我們執行指令 source -h .aliases,可明顯得看出檔案內容被全部讀取,而且也沒有錯誤訊息產生了。

7 % alias
alias
8 % history ; exit
history ; exit
1 alias
2 source -h .aliases
3 alias rmr rm -r
4 alias cd 'cd \!*;set prompt = "\! <$cwd>
5 alias vicsh 'vi \!:1 ; chmod u+x \!:1'
6 alias ls ls -asF
7 alias
8 history ; exit
9 % 19 %

我們再用指令 alias 查看別名設定,結果依舊是沒有任何設定。然後用指令 history 卻清楚看到所讀取的指令行已列入其中。我們可清楚地了解到 source 指令加上選項 -h 之後的執行情況,與原先的差別是相當大的。在使用上請多加注意。

 

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