什麼是redirect? 簡單的說,就是把目前所得的資料轉到其它地方。例如:
> ls -al > test
就會把ls -al所得到的資料,全部轉到test這個檔案。要注意的是,如果test檔案原本不存在,執行上面這個指令後,會建立一個新的檔案;如果test檔案已經存在,那上面這個指令就會把test檔案覆蓋掉!!
如果是這樣的話:
> ls -al >> test
兩個大於符號代表會把輸出的結果append到test檔案的最後面。
另外,輸出分成stdout跟stderr兩種,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的介紹,這在很多地方都用得上,相信熟悉這些技巧將會對系統管理更得心應手。