歡迎您光臨本站 註冊首頁

在Linux中善用重定向提高工作效率

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

文件的輸入/輸出重定向是 Linux 系統中一個重要的機制。藉助於重定向用戶往往可以比較輕鬆地完成某些任務, 從而提高工作效率。本文結合作者的使用經驗, 列舉和總結了一些使用輸入/輸出重定向的實例和技巧。
文件輸入,輸出和錯誤輸出

當 Shell 運行一個新的應用程序或命令時,它會為進程自動創建三個文件描述符,即標準輸入(stdin),標準輸出(stdout)和標準錯誤輸出(stderr)。它們被分別賦值為 0,1 和 2。標準輸入通常默認為終端的鍵盤,標準輸出和標準錯誤輸出通常默認為終端的屏幕。在默認情況下,應用程序會從 stdin 中取得輸入數據,並把輸出數據和出錯信息分別傳送給 stdout 和 stderr。重定向就是要改變這些 stdin、stdout 及 stderr 默認的去向。重定向包括輸入重定向和輸出重定向。

輸出重定向

簡單地說,輸入重定向就是把應用程序的標準輸出或標準錯誤輸出重新定向到某個指定的文件,而不是原來默認的標準輸出,比如屏幕。它的操作符是">"或">>"。運用輸出重定向可以比較方便地生成,編輯某些文件;比較容易地和系統中的某些設備文件進行交互。下面是一些實例。

列出 home 目錄下所有的 csv 文件並把結果保存到文件 csv.out 中:




[wei@amt55 home]# find /home -name "*csv" > csv.out


獲取系統內存使用信息並追加到文件 sysinfo.out 中:




[root@amt55 info]# cat /proc/meminfo >> sysinfo.out


如果不想讓別人在網路上 ping 到自己的機器,可以這麼做:




[root@amt55 /]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


如果不想看到某個命令執行的結果,可以這樣將其丟棄:




[root@amt55 /]# ls -aR /home/wei > /dev/null


把文件 backup.tar 拷貝到軟盤裡:




[root@amt55 ladungmss]# cat backup.tar > /dev/fd0


迅速清空文件 parametertest.in 中的內容:




[root@amt55 ladungmess]# cat /dev/null > parametertest.in


想播放聲音文件 wallstart.au 嗎,太簡單了:




[root@amt55 sounds]# cat wallstart.au > /dev/audio


直接把文件 dma.ps 送到列印設備去列印:




[root@amt55 ladungmess]# cat dma.ps > /dev/lp


在當前目錄 ladungmess 下快速創建一個名為 rawdata.csv 的空文檔:




[root@amt55 ladungmess]# cd /home > rawdata.csv 或者[root@amt55 ladungmess]# cp wei001.csv /home/ > rawdata.csv


這是因為命令 cd 或 cp 是不產生輸出的,所以把它們運行的結果重定向到一個文件,文件自然是空的。下一節還將介紹一個利用輸入重定向來創建空文件的例子。

將當前目錄下包含的所有內容備份為一個文件 backup.tar:




[root@amt55 ladungmess]# tar cf - . > backup.tar


上面的命令巧妙地運用了兩個輸出重定向,即"-"和">"。對"-"的解釋可以參見下一節中關於 tar 的例子。

輸入重定向

輸入重定向是把應用程序的標準輸入重新定向到指定的文件。這就可以使程序的輸入源不限於鍵盤,也可以來自文件。輸入重定向的操作伏符是"<"或">>"。與輸出重定向相比,輸入重定向運用的地方要少一些。不過在某些情況下使用它們可以起到很好的效果。下面是一些實例。

在當前目錄下快速創建一個空文檔 rawdata.dat:




[root@amt55 ladungmess]# cat > rawdata.dat < /dev/null


在區域網上給其他人發送信息:




[root@amt55 ladungmess]# mail -s "The experiement results" user1 user2 < rawdata.dat


統計文件 ladvertest.out 中的行數和字數:




[root@amt55 ladungmess]# wc -l -w < ladvertest.out


利用 Here 文檔把兩個分隔符 END 之間的文本保存到文件 expfile:




[root@amt55 ladungmess]# cat > expfile << END
< The experiment file
< ladvertest.in ladvertest.out
< END


將當前目錄 ladungmess 下的所有東西打包壓縮,快速移動到另一個目錄 backup 下:




[root@amt55 ladungmess]# tar cf - . | (cd /home/wei/backup; tar xvfp -)


這個命令對於在不同目錄之間轉移文件很有用。需要注意的是這裡的重定向與前面那些例子不太一樣,其標誌是符號"-"'。 第一個"-"是一個輸出重定向,它要求 tar 的輸出(壓縮的包)不是某個磁碟文件,而是 stdout,這個 stdout 通過管道變為第二個命令 tar 的 stdin; 第二個"-"是一個輸入重定向,它要求第二個 tar 的輸入不是來自某個磁碟文件,而是來自 stdin,也就是由管道傳來的第一個 tar 的 stdout。

最後介紹一個目前實驗數據處理中碰到的使用重定向的例子。為了從測量數據中得中納米顆粒的電荷分佈,需要運行某些與用戶交互的程序。其中的一個程序是parameter,是用 C++ 編寫的。它用來讀取實驗數據,並按照用戶提供的與顆粒有關的各種參數去擬合出一個與實驗數據最接近的分佈。這實質上是一個不斷嘗試(trial-and-error)的過程。因為不能保證只通過一次或幾次運行程序就得到理想的結果。每次運行 parameter 我都要連續從鍵盤輸入十一個參數 (為了便於理解,我把 parameter 的源程序放在 這裡)。這樣做有幾個不合適的地方: 一是參數比較多,輸入一次要佔用不少時間。其次大部分參數在調整幾次后就不需要再變了,而文件名在某次實驗中一直都是不變的,但是下一次運行程序時所有這些都還要重新輸入。再有多次輸入也容易發生輸錯的情況。輸入重定向幫我很好解決了這一問題: 把這十一個參數按照它們在程序中出現的次序放在一個名為 parametertest.in 的文件中,格式如下(對應其中某一次輸入,第一行 parametertest.csv 是實驗數據文件名):




prametertest.csv11-6000 -5400
1.05 1.20.066 0.0681e3 1e5


然後運行:




[root@amt55 ladungmess]# ./parameter < parametertest.in


現在立刻就可以獲得計算結果了。如果不滿意,下一次嘗試我只要在文件 parametertest.in 中修改那些需要改變的參數就行了。很明顯,由於輸入重定向接管了每次從鍵盤輸入的工作,所以運行程序的效率大大提高了。如果對輸入的參數滿意了,可以再使用一個輸出重定向:




[root@amt55 ladungmess]# ./parameter < parametertest.in > parametertest.out


把計算結果保存到文件 parametertest.out 中。

結論

重定向能夠運用的場合很多,上面列舉的十幾個例子只是其中很小的一部分。不過從這有限的例子中不難發現,運用重定向處理某些問題是相當巧妙和簡潔的,善於利用重定嚮往往會給工作帶來許多方便,從而顯著地提高工作效率。

[火星人 ] 在Linux中善用重定向提高工作效率已經有546次圍觀

http://coctec.com/docs/linux/show-post-137760.html