linux 重定向命令詳解(如1>/dev/null 2>&1)


基礎

0:表示標准輸入stdin
1:表示標准輸出stdout,系統默認為1,可省略(即1>/dev/null等價於>/dev/null)
2:表示標准錯誤stderr

>:表示重定向(即將輸出定向到指定路徑文件,>/dev/null表示將標准輸出重定向到空設備文件,即不輸出任何信息到終端,即不顯示任何信息。)
2>&1:其中的&表示等同於的意思,即2(標准錯誤stderr)的重定向等同於1

cmd 1>a 2>a 和cmd 1>a 2>&1的區別

  • cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件會被打開兩遍,由此導致stdout和stderr互相覆蓋。

  • cmd >a 2>&1 :stdout直接送往文件a ,stderr是繼承了FD(File Descriptor)1的管道之后,再被送往文件a 。a文件只被打開一遍,就是FD1將其打開。

    個人感覺有點C++中指針的意思(換湯不換葯)

兩者的不同點在於:

  • cmd >a 2>a 相當於使用了FD1、FD2兩個互相競爭使用文件 a 的管道;

  • cmd >a 2>&1 只使用了一個管道FD1,但已經包括了stdout和stderr。

    從IO效率上來講,cmd >a 2>&1的效率更高。

2&>1實際用途(即錯誤的輸出被合並)

  • 清理系統郵件日志(比如crontab處理)

    cmd >/dev/null 2&>1
    其中0表示鍵盤輸入1表示屏幕輸出2表示錯誤輸出,把標准出錯重定向到標准輸出,然后扔到/dev/null(代表空設備文件)下面去。
    
  • 將標准錯誤stderr與stdout一同顯示出來

    ./test.sh > test2.log 2>&1
    


免責聲明!

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



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