標準輸入/輸出/錯誤
linux下每個進程在運行的過程中都會打開一系列的文件,可以通過lsof -p $pid來查看進程號為pid打開的文件,在/proc/pid/fd/下是該進程打開的文件的鏈接。其中有三個比較特殊的文件是每個進程都會打開,其文件描述符分為0,1,2,默認分別鏈接到標準輸入(STDIN_FILENO)設備(/dev/stdin)、標準輸出(STDOUT_FILENO)設備(/dev/stdout)、標準錯誤(STDERR_FILENO)(/dev/stderr)設備。
進程在運行的過程中默認情況下產生的輸出會寫到stdout文件,產生的錯誤信息寫到stderr文件,默認這兩個文件會鏈接到屏幕設備,許多進程從標準輸入stdin獲取輸入,默認鏈接為鍵盤設備。如果更改這幾個文件的鏈接位置,就可以實現對其他文件的輸入輸出。
更換標準輸入/輸出/錯誤
- >: 輸出重定向到一個文件或設備,覆蓋原來的內容
- >>:輸出重定向到一個文件或設備,追加到末尾
- <: 輸入重定向一個程序
- <<
- 輸出
# echo hello > out.log
# echo hello 1> out.log 這兩個命令的作用是相同的,都是講echo進程的輸出重定向到out.log文件,在這里>左邊的1可以省略。
- 錯誤
# echo hello 2> err.log
hello
# echoo hello 2> err.log 2>表示將進程的錯誤信息重定向到err.log文件,第一行的命令沒有錯誤信息,因此會輸出hello到標準輸出,即會顯示到屏幕上,第二行輸出了一個不存在的指令,這時的錯誤輸出信息會輸入到err.log中。
如果需要把輸出信息和錯誤信息都重定向到某個文件:
# echoo hello 1> err.log 2>&1這里的1>和前面的用法相同,2>&1是將錯誤信息追加到標準輸出中。>&是一個整體,不可分開。
一些例子:
# 錯誤信息重定向到標準輸出,輸出重定向到out.log
# cat file 2>&1 >out.log
# 將輸出重定向到out.log,錯誤定向到輸出
# cat file >out.log 2>&1
# 將錯誤和輸出重定向更簡單的寫法
# cat file &> out.log - 輸入
將一個命令的輸入重定向為其他文件。
# cat < file.in另外還有一種<<的方式,稱為here文檔,它會從標準輸入中持續讀入字符,直到匹配到指定的token讀取結束。例如cat命令:
cat << EOF > out.log
> hello
> world
> EOF這種方式是將cat 命令的輸出重定向到out.log中,其內容是從第二行開始到EOF之前結束,EOF是結束token,可以人為指定為其他字符,例如:
cat << ENDOFFILE > out.log
> 1
> 2
> 3
> ENDOFFILE 另一種寫法是
cat > out.log << EOF
> 1
> 2
> 3
> ENDOFFILE
結果和上面的一致。