linux中Shell標准輸出錯誤 >/dev/null 2>&1 分析【轉】


Shell中可能經常能看到:>/dev/null  2>&1

    eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print $4}'` 1>/dev/null 2>/dev/null

命令的結果可以通過%>的形式來定義輸出

/dev/null 代表空設備文件

    > 代表重定向到哪里,例如:echo "123" > /home/123.txt
    1 表示stdout標准輸出,系統默認值是1,所以">/dev/null"等同於"1>/dev/null"
    2 表示stderr標准錯誤
    & 表示等同於的意思,2>&1,表示2的輸出重定向等同於1

那么本文標題的語句:

1>/dev/null 首先表示標准輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。

2>&1 接着,標准錯誤輸出重定向等同於 標准輸出,因為之前標准輸出已經重定向到了空設備文件,所以標准錯誤輸出也重定向到空設備文件。

 

2>&1寫在后面的原因

    格式:command > file 2>&1   ==  command  1> file 2>&1

首先是command > file將標准輸出重定向到file中, 2>&1 是標准錯誤拷貝了標准輸出,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。

如果改成: command 2>&1 >file

2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是輸出到終端。當 >file 后,標准輸出才被重定向到file,但標准錯誤仍然保留了先前的設置,即保持輸出到終端。

 

腳本只使用標准輸入、標准輸出和標准錯誤

    Shell會自動為我們打開和關閉0、1、2這三個文件描述符,我們不需要顯式地打開或關閉它們。標准輸入是命令的輸入,默認指向鍵盤;標准輸出是命令的輸出,默認指向屏幕;標准錯誤是命令錯誤信息的輸出,默認指向屏幕。

    如果沒有顯式地進行重定向,命令通過文件描述符0從屏幕讀取輸入,通過文件描述符1和2將輸出和錯誤信息輸出到屏幕。但如果我們想從其他文件(再次強調,I/O設備在Unix/Linux中也是文件)讀取輸入或產生輸出,就需要對0、1、2使用重定向了。其語法如下:


command < filename                         把標准輸入重定向到filename文件中
command 0< filename                       把標准輸入重定向到filename文件中

command > filename                         把標准輸出重定向到filename文件中(覆蓋)
command 1> fielname                       把標准輸出重定向到filename文件中(覆蓋)

command >> filename                       把標准輸出重定向到filename文件中(追加)
command 1>> filename                     把標准輸出重定向到filename文件中(追加)

command 2> filename                       把標准錯誤重定向到filename文件中(覆蓋)
command 2>> filename                     把標准輸出重定向到filename文件中(追加)

command > filename 2>&1               把標准輸出和標准錯誤一起重定向到filename文件中(覆蓋)
command >> filename 2>&1             把標准輸出和標准錯誤一起重定向到filename文件中(追加)

command < filename >filename2        把標准輸入重定向到filename文件中,把標准輸出重定向

                                                        到filename2文件中
command 0< filename 1> filename2   把標准輸入重定向到filename文件中,把標准輸出重定向

                                                        到filename2文件中

重定向的使用有如下規律:

1)標准輸入0、輸出1、錯誤2需要分別重定向,一個重定向只能改變它們中的一個。
2)標准輸入0和標准輸出1可以省略。(當其出現重定向符號左側時)
3)文件描述符在重定向符號左側時直接寫即可,在右側時前面加&。
4)文件描述符與重定向符號之間不能有空格!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM