http://bbs.chinaunix.net/forum/24/20031030/191375.html
這次我就不重寫了,將貼子的內容"抄"下來就是了...
--------------
11.1
談到 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
我們可以用如下下命令測試一下:
[Copy to clipboard] [ - ]
CODE:
$ mail -s test root
this is a test mail.
please skip.
^d (同時按 crtl 跟 d 鍵)
很明顯,mail 程式所讀進的數據,就是從 stdin 也就是 keyboard 讀進的。
不過,不見得每個程式的 stdin 都跟 mail 一樣從 keyboard 讀進,
因為程式作者可以從檔案參數讀進 stdin ,如:
[Copy to clipboard] [ - ]
CODE:
$ cat /etc/passwd
但,要是 cat 之後沒有檔案參數則又如何呢?
哦,請您自己玩玩看囉.... ^_^
[Copy to clipboard] [ - ]
CODE:
$ cat
(請留意數據輸出到哪裡去了,最後別忘了按 ^d 離開...)
至於 stdout 與 stderr ,嗯... 等我有空再續吧... ^_^
還是,有哪位前輩要來玩接龍呢?
--------------
11.2
沿文再續,書接上一回... ^_^
相信,經過上一個練習後,你對 stdin 與 stdout 應該不難理解吧?
然後,讓我們繼續看 stderr 好了。
事實上,stderr 沒甚麼難理解的:說穿了就是"錯誤信息"要往哪邊送而已...
比方說,若讀進的檔案參數是不存在的,那我們在 monitor 上就看到了:
[Copy to clipboard] [ - ]
CODE:
$ ls no.such.file
ls: no.such.file: No such file or directory
若,一個命令同時產生 stdout 與 stderr 呢?
那還不簡單,都送到 monitor 來就好了:
[Copy to clipboard] [ - ]
CODE:
$ touch my.file
$ ls my.file no.such.file
ls: no.such.file: No such file or directory
my.file
okay,至此,關於 FD 及其名稱、還有相關聯的設備,相信你已經沒問題了吧?
那好,接下來讓我們看看如何改變這些 FD 的預設數據通道,
我們可用 < 來改變讀進的數據通道(stdin),使之從指定的檔案讀進。
我們可用 > 來改變送出的數據通道(stdout, stderr),使之輸出到指定的檔案。
比方說:
[Copy to clipboard] [ - ]
CODE:
$ cat < my.file
就是從 my.file 讀進數據
[Copy to clipboard] [ - ]
CODE:
$ mail -s test root < /etc/passwd
則是從 /etc/passwd 讀進...
這樣一來,stdin 將不再是從 keyboard 讀進,而是從檔案讀進了...
嚴格來說,< 符號之前需要指定一個 FD 的(之間不能有空白),
但因為 0 是 < 的預設值,因此 < 與 0< 是一樣的﹗
okay,這個好理解吧?
那,要是用兩個 << 又是啥呢?
