Linux Shell 檔案描述符stdin,stdout,stderr,重定向
系統保留的三個檔案描述符分類
0 标準輸入 stdin /dev/stdin
1 标準輸出 stdout /dev/stdout
2 标準錯誤 stderr /dev/stderr
另外,當一個使用者程序被建立的時候,系統會自動為該程序建立三個檔案描述符0,1,2,對應的就是 stdin, stdout, stderr。當程序結束後,程序編号對應的目錄将被清理。
ps -ef |grep php // 找到要檢視的程序号,比如 9876
cd /proc/9876/fd
ll
pts/0
表示會話編号,以及輸入和輸出在那個會話上展示。
stdout 和 stderr 都是輸出到螢幕,他們的差別在于 stdout是有緩沖的,而stderr是無緩沖的,會直接輸出。
對檔案描述符進行重定位(重定位運算符)
> 替換原有内容
>> 内容追加到末尾
重定位運算符 ">" ">>" 的預設參數為标準輸出 stdout ,即 1 ;也就是說 > 和 >> 預設隻接收 stdout 。
是以 ">" 等價于 "1>"; ">>" 等價于 "1>>",也就是說 ls > out.log 就是 ls 1> out.log
注意 1和>之間不能有空格,使用數字來重定向都不能有空格。
解釋:
(0)、何為标準輸入和标磚輸出
标準輸入: /dev/stdin 檔案裡面的資料
标準輸出: /dev/stdout 檔案裡面的資料
(1)、當我們輸入“輸出指令”,例如 ls, echo 等傳回的資訊歸為stdout;
比如:
ls > out.log
cat out.log
有内容
比如:
ls + > out2.log
ls: 無法通路+: 沒有那個檔案或目錄
cat out2.log
空的,為什麼呢?那顯然傳回的内容不是stdout,而是stderr,我們可以使用 $? 擷取最後一條指令執行的傳回值,
當傳回值為零代表指令執行成功。
ls + > out2.log
echo $?
2
那麼我們可不可以把标準錯誤重定向到标準輸出呢,答案是可以的,2>&1 一般寫在後面,表示如果出錯了就重定向,
作為一種補救措施,畢竟誰也不能預知錯誤。
ls + > out3.log 2>&1
cat out3.log
ls: 無法通路+: 沒有那個檔案或目錄
或者使用 &>
ls + &> out3.log
(2)、可以同時重定向stdout與stderr到指定的檔案
cat out*.log 2>stderr.txt 1>stdout.txt
(3)、将stderr/stdout重定向到無底洞 /dev/null
ls + > /dev/null 2>&1
如果指令執行成功則将 stdout 定向到 /dev/null ,如果執行失敗,則将 stderr 定向到 stdout 然後
stdout 定向到 /dev/null