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之前就已經覆蓋了這個文件的內容。