天天看點

檔案描述符stdin,stdout,stderr,重定向

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
           
檔案描述符stdin,stdout,stderr,重定向

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
           

繼續閱讀