首頁歷史 > 正文

每天三分鐘搞定linux shell指令碼18 shell的輸出

2022-01-28由 碼享客 發表于 歷史

每天三分鐘搞定linux shell指令碼18 shell的輸出

之前接觸的shell輸出是把內容列印到螢幕或者重定向到檔案中,這次對其原理介紹一下。

標準檔案描述符

linux系統中一切皆檔案,透過檔案描述符來表示一個檔案。之前經常接觸的有3個,分別是

標準輸入0,標準輸出1,標準錯誤2

標準輸入

標準輸入就是鍵盤的輸入,不過也可以使用重定向用指定的檔案來代替檔案描述符。比如使用重定向輸入到

cat命令

sort命令

cat < testfile

sort < testfile

標準輸出

標準輸出就是輸出到顯示器,不過也可以透過重定向輸出到檔案,比如

date > testfile

date >> testfile

這兩個都是重定向,在testfile檔案中能看到兩行date輸出的結果。但是,如果命令返回碼

$?

非零,這個命令的輸出結果就不能重定向到相應的檔案中,比如

abcdef >testfile

結果為:

abcf:未找到命令

並且testfile檔案中為空,並沒有“abcf:未找到命令”這句話,看著像是重定向到檔案的操作失敗了,這裡需要了解標準錯誤。

標準錯誤

預設情況下,標準錯誤是輸出到螢幕上的。如果想要把錯誤也重定位到檔案中,可以在重定位符號前面加上

2

這個數字,比如:

acbdef 2> testfile

執行後螢幕上什麼都不顯示,testfile中內容為:

未找到 ‘abcdef’ 命令,您要輸入的是否是:

命令 ‘abcde’ 來自於包 ‘abcde’ (universe)

abcdef:未找到命令

箭頭前面的2意思是把標準錯誤重定向到testfile中。

注意:如果夾雜著正確的命令和錯誤的命令,那麼就需要把標準輸出和標準錯誤都進行重定向,比如:

ll testfile abed 1> file1 2> file2

執行後,file1的內容為:

-rw-rw-rw- 1 aitian aitian 78 12月 22 22:54 testfile

file2的內容為:

ls: 無法訪問‘abed’: 沒有那個檔案或目錄

如果想要把標準輸出和標準錯誤都輸出到同一個檔案中,可以使用

&>

進行重定向,比如

ll testfile abc &> file3

執行後,file3的內容為:

ls: 無法訪問‘abc’: 沒有那個檔案或目錄

-rw-rw-rw- 1 aitian aitian 78 12月 22 22:54 testfile

可以發現,

錯誤日誌被優先放到了前面

頂部