Redirect and Pipe

什麼是 redirect?簡單的說,就是把目前所得的資料轉到其它地方。例如:

$ ls -al > test

就會把 ls -al 所得到的資料,全部轉到 test 這個檔案。要注意的是,如果 test 檔案原本不存在,執行上面這個指令後,會建立一個新的檔案;如果 test 檔案已經存在,那上面這個指令就會把 test 檔案覆蓋掉!!

如果是這樣的話:

$ ls -al >> test

兩個大於符號代表會把輸出的結果 append 到 test 檔案的最後面。

另外,輸出分成 stdoutstderr 兩種,stdout 就是一般的輸出結果,當在輸入過程有遇到錯誤時,就會送到 stderr,而 1>2> 分別就代表著 stdout 跟 stderr,要注意數字跟大於符號之間沒有空格。

$ ls -al 1> test 2> test.err

上面這行就是會把 ls -al 的結果輸出到 test 檔案,如果遇到錯誤的,就會導向 test.err 檔案。

redirect 是雙向的,除了「>」,也有「<」,例如:

$ mail -s “hello, eddie” eddie < /home/eddie/test

就是把這個 test 檔寄給指定的使用者。

$ mysql -u root -p mydb < sql.txt

就是把檔案 sql.txt 裡面的 sql 語法,輸入到 mysql 裡的 mydb 資料庫。

而 pipe(管線)跟 redirect 不太一樣,pipe 能處理前一個指令傳來的輸出資訊,處理完後再丟給下一個指令(如果有的話)。例如下面這個指令:

$ ps aux | grep java | more

意思就是說執行 ps 所輸出的結果,丟到 grep 裡面,然後 grep 會把含有java字串的那一行抓出來,grep 再把結果輸出給 more 指令,如果 grep 輸出的結果超過一頁,more 指令就會負責做分頁的動作。

差別:

$ cat test | mail -s “hi” eddie

這個是會把 test 檔案的內容,輸出給 mail 程式,再寄出去。

$ mail -s “hi” eddie < test

這個則是把 test 檔當作附加檔案寄出信件。

以上大致上是 redirect 跟 pipe 的介紹,這在很多地方都用得上,相信熟悉這些技巧將會對系統管理更得心應手。