天天看點

2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的差別

2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的差別

林建龍 2019-05-24 17:05:08 13149 收藏 35

展開

一、差別:

2>/dev/null

意思就是把錯誤輸出到“黑洞”

>/dev/null 2>&1

預設情況是1,也就是等同于1>/dev/null 2>&1。意思就是把标準輸出重定向到“黑洞”,還把錯誤輸出2重定向到标準輸出1,也就是标準輸出和錯誤輸出都進了“黑洞”

2>&1 >/dev/null

意思就是把錯誤輸出2重定向到标準出書1,也就是螢幕,标準輸出進了“黑洞”,也就是标準輸出進了黑洞,錯誤輸出列印到螢幕

二、解釋:

1、檔案描述符

Linux系統預留可三個檔案描述符:0、1和2,他們的意義如下所示:

0——标準輸入(stdin)

1——标準輸出(stdout)

2——标準錯誤(stderr)

标準輸出——stdout

假設:在目前目錄下,有且隻有一個檔案名稱為ljl.txt的檔案,這時我們運作這個指令【ls ljl.txt】,就會獲得一個标準輸出stdout的輸出結果:ljl.txt

在這裡插入圖檔描述

錯誤輸出——stderr

按照上面的假設,我們運作另一條指令【ls gss.txt】,這樣我們就會獲得一個标準錯誤stderr的輸出結果“ls:無法通路gss.txt:沒有那個檔案或目錄”。

2、重定向

重定向的符号有兩個:>或>>,兩者的差別是:前者會先清空檔案,然後再寫入内容,後者會将重定向的内容追加到現有檔案的尾部。舉個例子:

(1)、重定向标準輸出stdout

如上圖所示,對比沒有添加重定向的操作,這條指令在使用之後并沒有将123.txt列印到螢幕。在緊接的cat操作後,可以發現本來應該被輸出的内容被記錄到stdout.txt中。

(2)、重定向标準錯誤stderr

如上圖所示,檔案描述符2,标準錯誤的重定向也是同樣的原理被記錄在了檔案stderr.txt這個檔案裡面了。

(3)、可以将stderr單獨定向到一個檔案,stdout重定向到另一個檔案

cmd 2> stderr.txt 1>stdout.txt

(4)、也可以将stderr和stdout重定向到同一個檔案

cmd > output.txt 2>&1

或采用下面的方法,可以少寫幾個字,能達到同樣的效果

cmd &> output.txt

cmd >& output.txt #兩個表達式效果一樣的

3、Linux特殊檔案

/dev/null是一個特殊的裝置檔案,這個檔案接收到任何資料都會被丢棄。是以,null這個裝置通常也被稱為位桶(bit bucket)或黑洞。

是以,2>/dev/null的意思就是将标準錯誤stderr删掉。

附:linux中單程序的檔案資料結構圖

上圖是linux中單程序的檔案資料結構圖,最左邊使我們熟悉的fd标志,也就是檔案描述符,一個程序内所有的檔案描述符按照順序排列構成一張檔案描述符表,其中包括fd0,fd1,fd2。(注意:這裡并沒有說标準輸入,标準輸出,錯誤輸出,原因後面講)

  那麼,問題來了,假如我們想fd1寫入資料時,最終資料會到哪兒呢?事實上fd1作為檔案描述符,它本身并不是檔案的真正的“入口”,檔案真正的“入口”在檔案描述符表的第二列:記錄了每個檔案描述符所對應檔案位置的檔案指針。換言之,如果我們更換fd1所對應的檔案指針,就改變了fd1指向檔案的”真正位置”。

  fd0,fd1,fd2指向的檔案預設情況下分别是/dev/stdin、/dev/stdout和/dev/stderr,這才是真正的标準輸入,标準輸出,錯誤輸出,如果将資料寫入到/dev/stdout中,就會在螢幕上顯示資料,fd0,fd1,fd2隻是标志而已,真正起作用的是他們對應的檔案指針!

  是以重定向指令’>’所做的工作就是就是改變了fd所對應的檔案指針!

參考來自:https://blog.csdn.net/gramdog/article/details/80374119,https://blog.csdn.net/zhongqi2513/article/details/78613768,https://blog.csdn.net/a1439458305/article/details/79586567

————————————————

版權聲明:本文為CSDN部落客「林建龍」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/longgeaisisi/article/details/90519690

上一篇: 密碼學
下一篇: 密碼學基礎