重定向的作用是將命令的執行結果輸出到指定的文件中。 重定向命令列表如下: 文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。 1、輸出重定向 將輸出重定向到file示例: 註意,任何file1內的已經存在的內容將被新內容替代,更改fil ...
重定向的作用是將命令的執行結果輸出到指定的文件中。
重定向命令列表如下:
文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
1、輸出重定向
將輸出重定向到file示例:
註意,任何file1內的已經存在的內容將被新內容替代,更改file1,再次重定向:
如果要將新內容添加在文件末尾,需要使用>>操作符:
2、輸入重定向
註意:上面兩個例子的結果不同:第一個例子,會輸出文件名;第二個不會,因為它僅僅知道從標準輸入讀取內容。
重定向輸入和輸出可以同時使用:
一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件:
- 標準輸入文件(stdin):stdin的文件描述符為0,Unix程式預設從stdin讀取數據。
- 標準輸出文件(stdout):stdout 的文件描述符為1,Unix程式預設向stdout輸出數據。
- 標準錯誤文件(stderr):stderr的文件描述符為2,Unix程式會向stderr流中寫入錯誤信息。
預設情況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以這樣寫:
$ command 2> file
如果希望 stderr 追加到 file 文件末尾,可以這樣寫:
$ command 2>> file
使用場景:
在項目中,經常需要查看日誌文件的錯誤信息,來進行排查問題,也就是說,我們需要解決如何把錯誤信息保存到文件中,而不是預設顯示在顯示器上。
示例1:(只重定向錯誤)
為什麼說如上只是重定向錯誤呢,為了證明,列出一個已存在加不存在的文件
可見只有nofile文件的錯誤信息保存到了nginx.log文件中。
如果希望將 stdout 和 stderr 合併後重定向到 file,可以這樣寫:
$ command > file 2>&1
或者
$ command &> file
示例:
註意一個細節,nodfile的錯誤輸出在hello.txt之前,這是因為shell自動賦予了錯誤消息更高的優先順序。
如果希望將 stdout 和 stderr 分別重定向到不同的file,可以這樣寫:
$ command 2>file1 1>file2
示例:
3、/dev/null 文件
如果希望執行某個命令,但又不希望在屏幕上顯示輸出結果,可以將輸出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;如果嘗試從該文件讀取內容,那麼什麼也讀不到。但是 /dev/null 文件非常有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。使用>&2
如果希望屏蔽 stdout 和 stderr,可以這樣寫:
$ command > /dev/null 2>&1
4、臨時重定向
使用符號: >&2
如果以如下方式執行,則兩句都會輸出
如果執行的時候又進行了錯誤重定向,則正常輸出一句到顯示器,錯誤日誌則寫入錯誤文件中,達到了分離的效果。
5、永久重定向(exec)
腳本中,exec將STDERR輸出重定向到error.log,所以執行This is the start of the script正常語句將輸出到顯示器,
接下來,把STDOUT重定向輸出到access.log中,所以This output should go to the access.log會顯示到access.log文件中,
但你仍然可以將echo語句輸出發給STDERR,所以but this should go to the error.log最終會寫入到error.log。
運行結果如下: