(010) Linux之I/O重定向
十年運維系列之基礎篇 - Linux
作者:曾林?
聯系:1494445739@qq.com
網站:www.jplatformx.com
版權:文章未經同意請勿轉載
一、引言
? ? ? 這里我們來討論Linux中命令行一個很酷的功能,那就是I/O重定向。I/O是輸入/輸出的縮寫。這個功能可以把命令行的輸入重定向為從文件中獲取內容,也可以把命令行的輸出結果重定向到文件中。如果我們將多個命令行關聯起來,將形成非常強大的功能——管道。
?
二、標準輸入、標準輸出和標準錯誤
? ? ? 到目前為止,我們使用過的很多程序生成了不同種類的輸出。這些輸出通常包含兩種類型。一種是程序運行的結果,即該程序生成的數據;另一種是狀態和錯誤信息,表示程序當前的運行情況。比如輸入ls這樣的命令,屏幕上將顯示它的運行結果或者是它的相關錯誤信息。
? ? ? 與UNIX“一切都是文件”的思想一致,類似ls的程序實際上把它們的運行結果發送到了一個稱為標準輸出(standard output,通常表示為stdout)的特殊文件中,它們的狀態信息則發送到了另一個稱為標準錯誤(standard error,表示為stderr)的文件中。默認情況下,標準輸出和標準錯誤都將被鏈接到屏幕上,并且不會被保存在磁盤文件中。
? ? ? I/O重定向功能可以改變輸出內容發送的目的地,也可以改變輸入內容的來源地。通常來說,輸出內容顯示在屏幕上,輸入內容來自于鍵盤。但是使用I/O重定向功能可以改變這一慣例。
?
三、標準輸出重定向
? ? ? I/O重定向功能可以重新定義標準輸出內容發送到哪里。使用重定向操作符“>",后面接文件名,就可以把標準輸出重定向到另一個文件中,而不是顯示在屏幕上。比如使用命令“ls -l /usr/bin > ls-output.txt”,將原本輸出到屏幕上的內容重定向到了文件ls-output.txt中。但是需要注意的是使用重定向操作符">"會重新改寫文件的內容,比如上面的命令如果執行第二遍的話,首先會將ls-output.txt原始內容刪除,然后再進行第二次輸出。事實上,如果我們需要刪除一個文件內容(或者創建一個新的空文件),可以采用這樣的方式。例如:"> ls-output.txt"命令僅僅使用了重定向符,并在它之前不加任何命令,就可以刪除一個已存在的文件內容或者創建一個新的空文件。
? ? ? 那么,我們如何能夠不從文件的首位置開始覆蓋文件,而是從文件的尾部開始添加輸出內容呢?可以使用重定向符“>>”來實現。比如:
? ? ? ls -l /usr/bin >> ls-output.txt
?
四、標準錯誤重定向
? ? ? 標準錯誤的重定向并不能簡單地使用一個專用的重定向符來實現。要實現標準錯誤的重定向,不得不提到它的文件描述符(file descriptor)。一個程序可以把生成的輸出內容發送到任意文件流。如果把這些文件流中的前三個分別對應標準輸入文件、標準輸出文件和標準錯誤文件,那么shell將在內部用文件描述符分別索引它們為0、1和2。shell提供了使用文件描述符編號來重定向文件的表示法。由于標準錯誤等同于文件描述符2,所以可用這種表示法來重定向標準錯誤。
? ? ? ls -l /bin/usr 2>ls-err.txt
? ? ? 文件描述符“2”緊放在重定向符之前,將標準錯誤重定向到ls-err.txt文件中。
?
五、將標準輸出和標準錯誤重定向到同一個文件
? ? ? 在許多情況下,我們會希望把一個命令的所有輸出內容都放在同一個獨立的文件中。為此,我們必須同時重定向標準輸出和標準錯誤。有兩種方法可以滿足要求。第一種是傳統的方法,在舊版本的shell中使用。
? ? ? ls -l /bin/usr > ls-output.txt 2>&1
? ? ? 使用這個方法,將執行兩個重定向操作。首先重定向標準輸出到ls-output.txt文件中,然后使用標記符2>&1把文件描述符2(標準錯誤)重定向到文件描述符1(標準輸出)中。
? ? ? 這些重定向操作的順序是非常重要的。標準錯誤的重定向操作通常發生在標準輸出重定向操作之后,否則它將不起作用。
? ? ? 最近的bash版本提供了效率更高的第二種方法來實現這一聯合的重定向操作。
? ? ? ls -l /bin/usr &> ls-output.txt
? ? ??在這個例子中,只使用一個標記符“&>”就把標準輸出和標準錯誤都重定向到了ls-output.txt文件中。
?
六、處理不想要的輸出
? ? ? 有時候“沉默是金”,命令執行后我們并不希望得到輸出,而是想把這個輸出丟棄,尤其是在輸出錯誤和狀態信息的情況下更為需要。系統提供了一種方法,即通過把輸出重定向到一個稱為/dev/null的特殊文件中來實現它。這個文件是一個稱為位桶(bit bucket)的系統設備,它接受輸入但是不對輸入進行任何處理。以下命令可以用來抑制(即隱藏)一個命令的錯誤信息。
? ? ? ls -l /bin/usr 2>/dev/null
? ? ? UNIX文化中的/dev/null,位桶(bit bucket)是一個古老的unix概念,由于它的普適性,它出現在unix文化的很多地方。因此當某人說他正在把你的意見發送到"dev null"的時候,現在你知道他是什么意思了:-)。
?
轉載于:https://www.cnblogs.com/jplatformx/p/4296717.html
總結
以上是生活随笔為你收集整理的(010) Linux之I/O重定向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 编译java并打包
- 下一篇: 使用shell脚本对Linux系统和进程