# Redirect and Pipe

> 

Published: 2005-01-26
URL: https://kaochenlong.com/redirect-and-pipe

---

什麼是 redirect？簡單的說，就是把目前所得的資料轉到其它地方。例如：

    $ ls -al &gt; test

就會把 ls -al 所得到的資料，全部轉到 test 這個檔案。要注意的是，如果 test 檔案原本不存在，執行上面這個指令後，會建立一個新的檔案；如果 test 檔案已經存在，那上面這個指令就會把 test 檔案覆蓋掉!!

如果是這樣的話：

    $ ls -al &gt;&gt; test

兩個大於符號代表會把輸出的結果 append 到 test 檔案的最後面。

另外，輸出分成 `stdout` 跟 `stderr` 兩種，stdout 就是一般的輸出結果，當在輸入過程有遇到錯誤時，就會送到 stderr，而 `1&gt;` 跟 `2&gt;` 分別就代表著 stdout 跟 stderr，要注意數字跟大於符號之間沒有空格。

    $ ls -al 1&gt; test 2&gt; test.err

上面這行就是會把 ls -al 的結果輸出到 test 檔案，如果遇到錯誤的，就會導向 test.err 檔案。

redirect 是雙向的，除了「&gt;」，也有「&lt;」，例如：

    $ mail -s “hello, eddie” eddie &lt; /home/eddie/test

就是把這個 test 檔寄給指定的使用者。

    $ mysql -u root -p mydb &lt; 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 &lt; test

這個則是把 test 檔當作附加檔案寄出信件。

以上大致上是 redirect 跟 pipe 的介紹，這在很多地方都用得上，相信熟悉這些技巧將會對系統管理更得心應手。


