首先,我們來認識一下linux系統中的幾種標準輸入和輸出
什么是標準輸入和輸出呢?
Linux給程序提供了三種I/O設備,即:
標準輸入(STDIN)? 0??????? ??? 默認接受來自鍵盤的輸入
標準輸出(STDOUT) 1????? 默認輸出到終端窗口
標準錯誤(STDERR) 2?????? 默認輸出到終端窗口
同時linux中使用“>”和“>>”將標準輸出和標準錯誤重新定向到文件中:
“>”后跟重定向文件,文件內容會被覆蓋
>?????? 把標準輸出重定向到文件
2>??? 把標準錯誤重定向到文件
&>??? 把標準輸出和錯誤都定向到文件
1>&2??????? 把標準輸出定向到標準錯誤(簡單來講,對的變成錯的)
2>&1??????? 把標準錯誤定向到標準標準輸出(錯的變成對的)
“>>”后跟重定向文件,是在原有內容基礎上,追加內容
>>??? 追加標準輸出重定向到文件
2>>? 追加標準錯誤重定向到文件
&>> 追加標準輸出和錯誤都定向到文件
那么下面我們來討論下幾種重定向的變形用法:
首先我們先建file1-6的6個空文件
這里我們看到:
ll /data/f1 顯示標準輸出(f1文件詳細信息);
ll /erorr顯示標準錯誤(提示無此目錄);
接下來我們來進行幾個小實驗:
實驗1.ll /data/f1 /erorr > /data/file1 2>&1
結果:屏幕無顯示,標準輸出和標準錯誤輸入到file1文件中
實驗2.ll /data/f1 /erorr 2>&1 > /data/file2
結果:屏幕顯示標準錯誤,標準輸出輸入到file2文件中
實驗3.ll /data/f1 /erorr 2> /data/file3 1>&2
結果:屏幕無顯示,標準輸出和標準錯誤輸入到file3文件中
實驗4.ll /data/f1 /erorr 1>&2 > /data/file4
結果:屏幕顯示標準錯誤,標準輸出輸入到file4文件中
實驗5.ll /data/f1 /erorr > /data/file5
結果:屏幕顯示標準錯誤,標準輸出輸入到file5文件中
實驗6.ll /data/f1 /erorr > /data/file6 1>&2
結果:屏幕顯示標準輸出和標準錯誤,file6文件為空
觀察6個小實驗我們發現:
實驗1,3得出的結果完全相同,屏幕無顯示,標準輸出和標準錯誤輸入到file文件中。得出此結果也有兩種
執行順序的可能性:
可能性1:實驗1可看做,標準輸出先重定向到file文件中,標準錯誤然后重定向為標準輸出再次重定向
到file文件中;實驗3可看做,標準錯誤先重定向到file文件中,標準輸出然后重定向為標準錯誤再次重定
向到file文件中,所以file文件中既有標準輸入又有標準輸出。
可能性2:實驗1可看做,標準輸出和錯誤都經過2>&1的重定向后,全變為標準輸出,再輸入進file1件中;
實驗3可看做,標準輸出和錯誤都經過1>&2的重定向后,全變為標準錯誤,再輸入file3文件中。
于是我們有了實驗6,ll /data/f1 /erorr > /data/file6 1>&2,得出結果屏幕顯示標準輸出和標準錯誤,file6
文件為空,由此可認為實驗6執行了可能性2的執行過程。
結論1:當有1>&2或2>&1處于重定向組合命令結尾時,輸出結果全部先執行1>&2或2>&1,再執行前面的重定向。
實驗2,4,5得出的結果完全相同,即屏幕顯示標準錯誤,標準輸出輸入到file5文件中
三條命令分別為:
ll /data/f1 /erorr 2>&1 > /data/file2
ll /data/f1 /erorr 1>&2 > /data/file4
ll /data/f1 /erorr > /data/file5
我們是否可以這樣認為:
結論2:當2>&1或1>&2處在重定向組合命令中間位置時,2>&1或1>&2是不起作用的,可以忽略掉(此結論待定)
現在再來看這個問題
下列哪個標準輸出結果與其他選項不同:(?? )
A.cmd >log 2>&1
B.cmd 2>&1 >log
C.cmd &> log
D,cmd 2>log 1>&2
小伙伴們,現在用以上結論去做這道題,是不是很easy了呢
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95033