我的外部記憶區

2006年5月8日星期一

Unix痛恨者手冊2:第二章:多向前掃瞄一個編輯字符真的這麼困難麼?

哪怕是Unix「專家」,也要暈菜了。下面再來看看Milt Epstein的這個例子,他想寫個shell腳本獲得實際被敲入的命令行,而不是那個經shell處理後的結果。他最後發現這並不容易,因為shell為命令做了太多的「好事」。要做到這一點,需要各種稀奇古怪的變形技術,連Unix專家也會望而卻步。這就是Unix的典型做法:把簡單的東西搞得異常複雜,這只是因為這些東西在Unix誕生之時從沒被仔細考慮過:

日期: 19 Aug 91 15:26:00 GMT 發信人: Dan_Jacobson@att.com 主題: ${1+"$@"} in /bin/sh family of shells shell scripts 收信人: comp.emacs.gnu.emacs.help, comp.unix.shell  On Sun, 19 Arg 91 18:21:58 - 0500 Milt Epstein  寫到:  Milt> "${1+"$@"}"究竟是什麼意思?我估計這是用來 Milt> 讀取其餘的命令行參數,但我不敢肯定。  這是/bin/sh裡用來完整複製命令行參數的一種方法。  它的意思是:如果有至少一個參數(${1+),那麼用所有參數("$@")來替代以保留所有的空白字符。  如果我們只使用"$@",那麼在沒有參數的情形下會得到""而不是我們想要的空參數。  那麼,為什麼不使用"$*"呢?sh(1)的man手冊是這樣說的:  雙引號之間的參數和命令會被替換,shell會對結果加上引用,以避免解析空格或生成文件名。如果$*出現在雙引號之中,各個參數之間的空格會被加上引用("$1 $2 ..."),而如果$@出現在雙引號之中,各個參  數 之間的空格不會被加上引用("$1""$2" ...)。  我認為${1+"$@"}一直可以兼容到「版本7」的shell。  老天!一直兼容到「版本7」。

沒有留言: