相關知識
標准輸入默認為鍵盤,也可以使用文件和管道(pipe |);
標准輸入默認輸出到終端(terminal),但是也可以重定向到文件、管道或後引號;
標准錯誤默認輸出到終端,但是也可以重定向到文件中;
標准的輸入、輸出和錯誤在C中分別表示為STDIN、STDOUT、STDERR,也可以使用0,1,2來表示。
/dev/null空設備文件,也稱為位桶(bit bucket),它可以看作是一個“黑洞”,等價於一個只寫的文件,所有的寫入內容都會永遠的消失。
/dev/zero是一個輸入設備,可以使用它來初始化文件(寫入字符串0),它實際上產生連續不斷的null流,主要用於創建一個指定長度的初始化空文件。
重定向到null設備文件
在shell中可能經常能看到>/dev/null 2>&1,分解這個組合為下面的五部分:
1:>表示重定向到那裡;
2: /dev/null表示空設備文件
3: 2>表示重定向標准錯誤STDERR
4: &表示等同於的意思,2>&1表示標准錯誤的輸出重定向到等同於標准輸出
5: 1表示標准輸出STDOUT,系統默認輸出為1,所以>/dev/null等同於1>/dev/null。
其執行過程為:
1>/dev/null:首先將標准輸出重定向到空設備文件,也就是不輸出任何信息到終端(即不顯示任何信息);
2>&1:然後標准錯誤輸出重定向到標准輸出上,因為之前已經重定向標准輸出到空設備文件,此時標准錯誤也重定向到空設備文件中。
# command >file 2>file將產生的標准錯誤和標准輸出送到file中,此時file會打開2次,STDOUT和STDERR會相互覆蓋,使得兩個管道FD1和FD2同時搶占file的管道。
# command >file 2>&1 功能與上面的一樣,但是file只打開一次,也使用一個管道FD1。
從IO效率上說,前一條命令效率明顯比後一條命令效率要低。此外,還有一個非常有用的重定向操作符“-”,示例如下:
# (cd /src/dir && tar cf - .) | (cd /dst/dir && tar xvfp -)
該命令是把/src/dir目錄下所有文件通過壓縮後,快速的全部移動到/dst/dir目錄中。
下面還有幾種不常見的用法:
n<&- 表示將n號輸入關閉;
<&-表示關閉標准輸入(鍵盤);
n>&-表示將n號輸出關閉;
>&-表示將標准輸出關閉。
注:清除日志文件內容命令# cat /dev/null > /var/log/messages
重定向
重定向符號為>,它的使用方法有下面一些:
l 1>2 表示把標准輸出STDOUT重定向到文件2中;
l 1>&2 表示把標准輸出STDOUT重定向到標准錯誤STDERR。
l command > log 表示將標准輸出重定向到log文件中,標准錯誤輸出到終端上;
l command > log 2>1 表示將標准輸出重定向到log文件中,標准錯誤重定向到文件1中;
l command >log 2>&1 表示將標准輸出重定向到log文件中,www.linuxidc.com把標准錯誤重定向到標准輸出上。
l command 2>/dev/null 表示把標准錯誤信息重定向到空設備文件;
l command >/dev/null 表示把標准輸出重定向到空設備文件;
l command >/dev/null 2>&1 表示把標准錯誤和標准輸出全部重定向到空設備;