> 與 < 差在哪?
談到I/O redirection,不妨先讓我們認識一下File Descriptor(FD)。程序的運算,在大部份情況下都是進行數據(data)的處理,這些數據從哪讀進?又,送出到哪里呢?這就是File descriptor(FD)的功用了。
在shell程序中,最常使用的FD大概有三個,分別為:
0: Standard Input(STDIN) 1: Standard Output(STDOUT) 2: Standard Error Output(STDERR)在標準情況下,這些FD分別跟如下設備(device)關聯:
stdin(0):keyboard stdout(1):monitor stderr(2):monitor我們可以用如下下命令測試一下:
$ mail -s test rootthis is a test mail.please skip.
^d(同時按crtl跟d鍵)
很明顯,mail程序所讀進的數據,就是從stdin也就是keyboard讀進的。不過,不見得每個程序的stdin都跟mail一樣從keyboard讀進,因為程序作者可以從檔案參數讀進stdin,如:
$ cat /etc/passwd
但,要是cat之后沒有檔案參數則又如何呢?哦,請您自己玩玩看啰….^_^
$ cat
(請留意數據輸出到哪里去了,最后別忘了按^d離開…)至于stdout與stderr,嗯…然后,讓我們繼續看stderr好了。
事實上,stderr沒甚么難理解的:說穿了就是“錯誤信息”要往哪邊送而已…比方說,若讀進的檔案參數是不存在的,那我們在monitor上就看到了:
$ ls no.such.filels: no.such.file: No such file or directory
若,一個命令同時產生stdout與stderr呢?那還不簡單,都送到monitor來就好了:
$ touch my.file$ ls my.file no.such.filels: no.such.file: No such file or directorymy.file
okay,至此,關于FD及其名稱、還有相關聯的設備,相信你已經沒問題了吧?那好,接下來讓我們看看如何改變這些FD的預設數據信道,我們可用<來改變讀進的數據信道(stdin),使之從指定的檔案讀進。我們可用>來改變送出的數據信道(stdout,stderr),使之輸出到指定的檔案。比方說:
$ cat < my.file
就是從my.file讀進數據
$ mail -s test root < /etc/passwd
則是從/etc/passwd讀進…
這樣一來,stdin將不再是從keyboard讀進,而是從檔案讀進了…嚴格來說,<符號之前需要指定一個FD的(之間不能有空白),但因為0是<的預設值,因此<與0<是一樣的!okay,這個好理解吧?
那,要是用兩個<<又是啥呢?這是所謂的HERE Document,它可以讓我們輸入一段文本,直到讀到<<后指定的字串。比方說:
$ cat <<FINISHfirst line heresecond line therethird line nowhereFINISH
這樣的話,cat會讀進3行句子,而無需從keyboard讀進數據且要等^d結束輸入。
新聞熱點
疑難解答