010 Linux之I O重定向

2022-09-01 20:51:11 字數 2398 閱讀 2420

十年運維系列之基礎篇 - linux

聯絡:[email protected]

**: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"的時候,現在你知道他是什麼意思了:-)。

linux入門之I O重定向

我們知道,執行乙個shell命令行時通常會執行乙個shell命令行時通常會自動開啟三個標準檔案,即標準輸入檔案 stdin 通常對應終端的鍵盤 標準輸出檔案 stdout 和標準錯誤輸出檔案 stderr 這兩個檔案都對應終端的螢幕。程序將從標準輸入檔案中得到輸入資料,將正常輸出資料輸出到標準輸出檔...

Linux學習之九(I O重定向)

一 管理及io重定向 1 系統設定 預設輸出裝置 標準輸出,stdout,1 預設輸入裝置 標準輸入,stdin,0 標準錯誤輸出 stderr,2 2 i o重定向 覆蓋輸出 追加輸出 set set c 禁止對已經存在的檔案使用覆蓋重定向 強制覆蓋輸出,則使用 set c 關閉上述功能 2 重定...

Linux Shell之IO重定向

一 io裝置 io是指資料的 端與資料的目的端,分別稱為標準輸入 標準輸出 及標準錯誤輸出。程式不必關心裝置的問題,無論是檔案 終端 磁帶機等。在linux預設情況下,會讀取標準輸入 寫入標準輸出,並將錯誤傳遞到標準錯誤輸出。預設情況下標準輸入 輸出 錯誤都是終端。通過下面可知 cat input ...