簡單的引用機制在C Shell中很難工作,這是因為Shell和它執行的程序之間各執一詞,無法統一。例如,下面是個簡單的命令:
grep string filename;
參數string包含了grep定義的字符,比如?, [, 和]等等,但這些字符是shell的元操作符。這意味著必須對它們進行引用。然而,有些時候可能不需要如此,這和你使用什麼樣的shell以及環境變量有關。
如果想在字符串中尋找包含點(.)或其他以橫槓(-)開頭的模式,這就更為複雜了。
一定要記住對元字符進行正確引用。不幸的是,和模式識別一樣,操作系統的各個部分都充斥著互不兼容的引用標準。
C Shell的元語法動物園裡飼養著七種不同的元操作符家族。斗轉星移,轉眼間動物園裡已經人滿為患了,籠子使用的不再是鋼鐵,而是用錫了。動物間的小磨擦不斷。這七種針對shell命令行的轉換方式是:
別名 alias, unalias
命令輸出替代 `
文件名替代 *, ?, []
歷史替代 !, ^
變量替代 $, set, unset
進程替代 %
引用 ',"
這一「設計」的結果是,問號(?)永遠被shell當成單字符匹配符,它永遠無法被作為命令行參數傳給用戶程序,所以別想使用問號來作為幫助選項。
如果這七種元字符有著清晰的邏輯順序和定義,那麼情況也不會太糟糕。可事實並非如此:
日期: Mon, 7 May 90 18:00:27 - 0700
發信人: Andy Beals
主題: Re: today's gripe: fg %3 (今天之不爽事:fg %3)
收信人: UNIX-HATERS
你可以使用%emacs或者%e來恢復一個任務(如果唯一的話),也可以使用%?foo,如果"foo"出現在命令行中。
當然,!ema和!?foo也可以用於歷史命令替換上。
但是,UCB的豬頭(pinheads)們沒有想到!?foo後面可能伴隨的編輯命令:
!?foo:s/foo/bar&/:p
沒有留言:
發佈留言