Linux之管道與重新導向 一、重新導向輸出 可以通過操作符>將標準輸出1和標準錯誤輸出2重新導向到某個檔案,比如: #ls -l > lsoutput.txt 上面命令將標準輸出重新導向到檔案lsoutput.txt中。 當然,也可以將標準檔案描述符以外的檔案描述符進行重新導向,不過這種情況很少見。 預設情況下,如果lsoutput.txt檔案已經存在,則它的內容將被覆蓋,如果想將輸出內容附加到一個檔案中,則可以使用>>操作符進行輸出重新導向,比如: #ls -l >> lsoutput.txt 上面命令將輸出附加到指定檔案的尾部。 有時候會用重新導向輸出將命令產生的錯誤重新導向輸出到某個檔案以屏蔽螢幕輸出。 下面命令將標準輸出和錯誤輸出分別重新導向到不同的檔案中: #kill -HUP 1234 > killout.txt 2>killerr.txt 如果想把兩組輸出都重新導向到一個檔案中,你可以使用>&操作符來結合兩個輸出,比如: #kill -l 1234 >killouterr.txt 2>&1 這條命令將標準輸出和標準錯誤輸出都重新導向到同一個檔案中。請注意操作符出現的順序,這條命令的含義是“將標準輸出重新導向到檔案killouterr.txt,然後將標準錯誤輸出重新導向到與標準輸出相同的地方。”如果順序有誤,重新導向將不會按照預期執行。 還有一種將標準輸出或標準錯誤輸出丟棄的好辦法,比如: #kill -l 1234 >/dev/null 2>&1 資源回收筒/dev/null就像黑洞一樣,任何東西進入後都肉包子打狗有去無回。 二、重新導向輸入 我們還可以重新導向標準輸入,比如: #more < killout.txt 不過上面的命令似乎意義不大,因為more本來也可以接受檔案名稱為參數,我就是刷一下存在感而已。 三、管道 我們 可以用管道操作符|來串連進程。Linux與MS-DOS不同,在Linux下通過管道串連的進程可以同時運行,並且隨著資料流在它們之間的傳遞可以自動地進行協調。 下面以使用sort命令對ps命令的輸出進行排序來說明管道的意義,假設不用管道就必須要分幾個步驟來實現: #ps > psout.txt #sort psout.txt > pssort.out 更精巧的一個解決方案是用管道來串連進程,比如: #ps | sort > pssort.out 如果想在螢幕上分頁顯示輸出結果,我們可以再串連第三個進程more,將它們都放在同一個命令列上,可以如此: #ps | sort | more 允許串連的進程數目是沒有限制的。假設我們想看看所有系統中啟動並執行進程的名字,但不包括shell本身,可以如此: #ps -xo comm | sort | uniq | grep -v sh | more 這個命令首先按字母順序排序ps命令的輸出,再用uniq命令去除重複的內容,然後用grep -v sh命令刪除名為sh的進程,最終將結果分頁顯示在螢幕上。 如你所見,與使用一系列分離的命令並且每個命令都帶有自己的臨時檔案相比,這是一個更精巧的解決方案。但這裡有一點需要引起注意,如果你有一系列的命令需要執行,相應的輸出檔案是在這一組命令被建立的同時立刻被建立或寫入的,所以絕不要在命令流中重複使用相同的檔案名稱。如果嘗試執行如下命令: #cat mydata.txt | sort | uniq | > mydata.txt 你最終將得到一個空檔案,因為你在讀取檔案mydata.txt之前就已經覆蓋了這個檔案的內容。