高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

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的介紹,這在很多地方都用得上,相信熟悉這些技巧將會對系統管理更得心應手。

Comments