天天看點

[Linux]基本I/O重定向

在我們設定定時任務的時候經常會使用标準輸出和标準錯誤輸出。這個在Linux是一個非常重要的概念,而且這個很有用。程式應該有資料庫的來源端、資料的目的端,以及報告問題的地方,它們被稱為标準輸入、标準輸出以及标準錯誤輸出。

程式啟動的時候,預設情況下,标準輸出、輸入都會已經打開,且已準備好供其使用。我們使用Xshell連接配接并登陸上伺服器的時候,預設下終端就是标準輸入、輸出端。可以試試cat指令。

<a></a>

重定向與管道

Shell提供了數種文法,可以修改預設的IO的來源端和目的端,就是标準輸入和輸出的地方。

&lt;

修改标準輸入

sort &lt; ucid.txt

預設下,标準輸入為終端,此時可以更改為你想要的地方

&lt;&lt;

Command &lt;&lt; delimiter

從标準輸入中讀入,直到遇到delimiter分割符

&gt;

修改标準輸出

ls -l &gt; listinfo.txt

預設下,标準輸出為終端,此時可以修改預設輸出的地方。譬如可以将标準輸出的内容寫在檔案中。

如果檔案已存在,會被覆寫掉。

&gt;&gt;

 輸出附件到檔案

ls -l &gt;&gt; listinfo.txt

與[&gt;]不一樣的是,[&gt;]會清空原來的内容,而[&gt;&gt;]隻是将标準輸出追加到檔案結尾處。

|

建立管道

program1 | program2

1. program1的标準輸出為program2的标準輸入;

2. 管道的執行效率比使用臨時檔案的程式起碼高一個數量級;

[&lt;]例子

場景:對檔案内容的資訊進行排序

[&gt;]例子

場景:列印内容到檔案

在定時任務上面經常使用。因為定時任務執行的内容,不會列印到終端。如果需要檢視結果的話就很麻煩。而列印到檔案中的話,随時都可以檢視了。不過這裡往往用[&gt;&gt;]追加比較多。

[&gt;&gt;]例子

沒啥好說的,跟[&gt;]就是一個[&gt;]會覆寫原有的檔案,而[&gt;&gt;]隻是追加。

[|]管道例子

場景:查詢id為19217xxxx的玩家在1月15日使用道具的日志

這是查詢遊戲日志的一個例子。預設下,系統會将遊戲5天前的日志進行打包壓縮。而此時需要查詢5天前的日志的話,使用上面的方法無論在效率上還是友善上,管道都有使用臨時檔案無法比拟的又是。當然使用下面的方法:

也可以達到相同的結果,但相比使用管道,一、需要使用臨時檔案,讀寫在磁盤需要時間;二、臨時檔案還需要手動删除,比較麻煩。

注:bzcat 可以直接顯示壓縮檔案的内容

特殊檔案:/dev/null 與/dev/tty

/dev/null  傳送到此檔案的資料都會被系統丢掉,,就是輸出到一個空裝置的意思。

/dev/tty   程式打開此檔案時,Linux會自動将它重定向到一個終端。

檔案描述符

在定時任務,我們經常在重定向的時候,喜歡這樣操作。

後面的 2&gt;&amp;1是什麼意思呢,這裡就要了解檔案描述符和綁定重定向的概念了。

檔案

輸入檔案——标準輸入

0(預設為終端(網上有說預設為鍵盤的))

輸出檔案——标準輸出

1(預設為終端)

錯誤輸出檔案——标準錯誤

2(預設為終端)

綁定重定向

Commond &gt;&amp;m

标準輸出重定向到檔案描述符m中

Command &lt;&amp;-

關閉标準輸入

Command 0&gt;&amp;-

關閉标準輸出

此時我們再去了解[2&gt;&amp;1],就容易多了。[2]是标準錯誤的檔案描述符,而[&gt;&amp;1]的意思重定向到标準輸出。那麼定時任務的解釋就是,将[clear_logs.sh]執行的标準輸出和标準錯誤重定向到[/dev/null](就是丢掉輸出的内容)。

我是這樣了解(不一定正确)上面的定時任務的(分2部分):

 //-----------------------

以上為本次學習I/O重定向的筆記。

參考資料:1. 《Shell腳本學習指南》 Arnold Robbins &amp; Nelson H.F. Beebe著 機械工業出版社

              2. 《Linux shell的标準輸入、輸出和錯誤 》http://blog.csdn.net/cjfeii/article/details/10084343

共勉之

本文轉自 Ron Ngai 部落格園部落格,原文連結:http://www.cnblogs.com/rond/p/3530843.html  ,如需轉載請自行聯系原作者