我的外部記憶區

2006年5月8日星期一

Unix痛恨者手冊2:第一章:歡迎來到元語法(metasyntacitic)動物園

C Shell的元語法操作符帶來了大量和引用有關的問題和混亂。元操作符在一個命令被執行前對其進行轉換。我們把這些操作符叫做元操作符是因為它們不屬於命令的語法成分,它們作用於命令本身。大多數程序員對元操作符(有時也叫做escape operators)並不陌生。比如,C字符串中的反斜槓(\)就是一個元語法操作符;它不代表自己,而是對其後的字符的說明。如果你不希望如此,你必須使用引用機制來告訴系統把元操作符當做一般字符來處理。回到剛才C字符串的例子,如果想得到反斜槓字符,你必須寫成。

簡單的引用機制在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

沒有留言: