1.linux 的標准輸入與輸出
linux標准輸入設備指的是鍵盤,標准輸出設備指的是顯示器,標准錯誤輸出指的是顯示器。
設備 | 設備名 | 文件描述符 | 類型 |
鍵盤 | /dev/stdin | 0 | 標准輸入 |
顯示器 | /dev/stdout | 1 | 標准輸出 |
顯示器 | /dev/stderr | 2 | 標准錯誤輸出 |
2.Linux 文件描述符
文件描述符可以理解為 Linux 系統為文件分配的一個數字,范圍是 0-3 ,用戶也可以自定義文件描述符,但是自定文件描述符不在這里的討論范圍
一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件:
-
標准輸入文件(stdin):stdin的文件描述符為0,Unix程序默認從stdin讀取數據。
-
標准輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數據。
-
標准錯誤文件(stderr):stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。
3.什么是輸入重定向
輸入重定向:是指不使用系統提供的標准輸入端口,而進行重新的指定。換言之,輸入重定向就是不使用標准輸入端口輸入文件,而是使用指定的文件作為標准輸入設備。(重定向簡單理解就是使用 “<”符來修改標准輸入設備)
比如,默認情況下,cat命令會接受默認標准輸入設備鍵盤的輸入,並顯示到控制台,但是可以通過“<”符號修改標准輸入設備,指定文件作為標准輸入設備,那么cat命令將指定的文件作為輸入設備,並將文件中的內容讀取並顯示到控制台。
輸入重定向 | ||
類型 | 符號(語法) | 功能 |
標准輸入 | 命令<文件1 | 命令把文件1的內容作為標准輸入設備 |
標識符限定輸入 | 命令<<標識符 | 命令把標准輸入中讀入內容,直到遇到“標識符”分解符為止 |
輸入輸出重定向(同時使用) | 命令< 文件1 >文件2 | 命令把文件1的內容作為標准輸入,把文件2作為標准輸出。 |
#cat /etc/passwd # 它是以鍵盤作為標准輸入設備,並將文件內容顯示到控制台
語法1:
# cat < /etc/passwd # 而輸入重定向,cat < /etc/passwd ,它是將passwd文件指定為輸入設備,並將內容顯示到控制台。
語法2.
# cat << delimiter
# cat < <delimiter #(這個字符串字符是任意的,沒有任何含義)
它的作用是將這個 delimiter 字符之前的內容(document) 作為輸入傳遞給 cat
碰到delimiter將自動結束輸入,並將輸入的內容顯示出來;
語法3:
# cat /etc/passwd < a > b.txt :將文件passwdt輸入重定向到a,輸出重定向到b.txt文件
4.輸出重定向:(通俗的講,重定向輸出就是把要輸出的文件信息寫入到一個文件中去,而不是將要輸出的文件信息輸出到控制台(顯示屏))
在linux中,默認的標准輸出設備是控制台(或稱為顯示器),用戶輸出的信息默認情況下都會顯示到控制台,
比如:cat /etc/passwd ,它是使用控制台顯示內容。 默認情況下,標准輸出設備是控制台,所以cat命令將文件信息輸出到控制台,但是,我們可以使用“>”修飾符修改標准輸出設備,使用指定的文件做為標准輸出設備,來顯示文件。輸出重定向的概念就出現了。
4.1什么是輸出重定向?
輸出重定向就是指不使用linux默認的標准輸出設備顯示信息,而是指定某個文件做為標准輸出設備來存儲文件信息。
(以覆蓋的方式把指定文件的信息輸出到指定文件)
例如
cat /etc/passwd >a
表示,把a作為標准輸出設備,並把文件信息輸入到文件a中去,在使用cat a命令將信息在控制台中顯示出來。
注意,如果文件a中有內容,此時內容被覆蓋掉(清除掉)。
輸出重定向的作用:
我們不想輸出在終端上,想導出一個文件,方便以后查看,便需要輸出重定向了。> 的作用就是把原本要輸出在終端上的信息重定向導出到指定的地方。
輸出重定向的幾種用法
1.
2.使用重定向將查詢的文件信息發送到其它控制台。
3.使用重定向將查詢的文件信息發送到其它控制台。
其它控制台受到的消息
4.利用輸出重定向清空文件、創建新文件:
當a文件中有內容,當執行 cat >a命令后,進入編輯模式,我們
輸入什么內容,都會保存進去,使用ctrl+D命令結束,但如果文件a中有內容則會覆蓋掉原來的內容
如果a是一個不存在的文件,則結束命令后悔添加一個名稱為a的文件,剛才輸入的內容會保存在這個文件中。
另一種情況,a文件存在,a文件中有內容,執行 cat >a命令后沒有添加任何能容,而是直接按ctrl+d結束命令,此時
a文件中的內容會自動清空。
5.利用重定向導出一個文件
那么當我們不想輸出在終端上,想導出一個文件,方便以后查看,便需要輸出重定向了。> 的作用就是把原本要輸出在終端上的信息重定向導出到指定的地方。
如果文件a.txt已近存在,則會將里面的內容覆蓋掉。
如果不存在,將會創建一個a.txt文件,並將內容保存在這個文件中去。
使用 cat a.txt命令就可以查詢到里面的內容了
6.追加內容
使用重定向輸出的時候,如果原文家中有內容,則會被覆蓋,現實中有時候不想覆蓋其中的文件,
在使用重定向輸出的使用可以使用">>",可以再源文件中追加內容
例如:
7.禁止覆蓋
如果在工作中,我們想要在文件中追加內容時>>,卻不小心只寫入> 就執行了,那么我們的文件被覆蓋了,因此就有了,禁止覆蓋的命令,set –C
划藍線的地方:明確表示不能覆蓋。
當然我們也可以解除這種禁止 set +C ,很好理解禁止 –C ,解除+C
4.2標准錯誤輸出重定向:
stderr描述符用來處理錯誤信息,Bash Shell會將腳本運行過程中的錯誤信息輸出到stderr,默認情況下stderr與stdout描述符都是輸出到控制台
上面的例子顯示,以列表的方式顯示b.txt 和errfile文件的信息並重定向文件信息到b.txt文件中,當前目錄下不存在errfle文件,所以在控制台顯示了警告信息,注意到這些警告信息沒有輸出到文件中而是控制台因為我們只重定向了標准輸出到文件沒有重定向標准錯誤輸出,所以警告信息輸出到了控制台。標准錯誤輸出和標准輸出默認情況下都是將信息輸出到控制台。另外,重定向標准輸出不會重定向表准錯誤輸出。
標准錯誤輸出重定向:
錯誤信息默認輸出到控制台,也可以重定向到其他設備,從上面的表中可以看到錯誤輸出描述符是2,只要在重定向符>之前加上一個2(如:2>),Bash Shell會將錯誤信息重定向到指定的設備,如下:
這個例子中將錯誤信息重定向到文件而標准輸出還是默認的輸出設備控制台.
如果同時重定向錯誤信息和重定向標准輸出到文件必須使用兩個重定向符號,並且必須在重定向符前加上相應的文件描述符,如下
此時errfile 文件是不存在的,錯誤文件信息被重定向輸出到b.txt文件。而a.txt文件是事先存在的,被重定向到b2.txt文件
使用cat 查看,b.txt 文件存儲的時錯誤信息,cat b2.txt 查看,是重定向輸出的文件
命令 2>>文件1 1>>文件2 | 以追加方式,把命令的正確輸出保存在文件2中;以追加的方式,把命令的錯誤輸出內容保存到文件
1中 |
如果想將標准輸出和錯誤信息重定向到一個日志文件,Bash Shell提供了&符,就不需要使用兩個重定向符了,如下:
使用兩個重定向符將標准輸出和錯誤信息重定向到同一個文件中去:
使用&符將標准輸出和錯誤信息重定向到同一個文件中去:
&>file是一種特殊的用法,也可以寫成>&file,二者的意思完全相同,
也可以這樣寫
2>&1就是將標准錯誤輸出重定向到與標准輸出同一個文件中保存
&表示全部文件,文件不管對錯,1表示標准輸出文件,2表示標准錯誤輸出。
做個總結:一下內容為截圖:來源於第三方網站,如有侵權,請聯系刪除
參考:
[1] linux 輸入、輸出重定向的概念和用法詳解(Day01)