2010-11-21 49 views
6
exec 3>&1       # Save current "value" of stdout. 
ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close fd 3 for 'grep' (but not 'ls'). 
#    ^^^^ ^^^^ 
exec 3>&-       # Now close it for the remainder of the script. 

我得到fd 3正在關閉的第3行。幫我理解這個簡單的io重定向在bash中從ABS指南

疑問:第1行將fd 3重定向到標準輸出,全局...對嗎?
問題:第二行發生了什麼?如果可能,請提供詳細的解釋。

+1

雖然人們可以在* sh中使用額外的描述符來完成複雜的技巧,但是對於下一次閱讀它的可憐的schlub(例如你)是否應該這樣做並不確定。 – msw 2010-11-21 22:49:08

+0

@msw我看着你的個人資料,你似乎對Linux/UNIX shell等有很好的瞭解。我很尊重你,但我不讚賞你稱我爲schlub。如果你不能幫助,請保持你的俏皮話。 – abc 2010-11-22 05:22:17

+1

我也是窮人schlub誰經常不得不重新閱讀我自己的代碼在以後的日期。對不起,你親自發表我的評論,因爲它是通用的,有點自我貶低,並且肯定不會**有意侮辱。我的大部分資料都是虛構的,除了我的時間太長了。 – msw 2010-11-22 05:52:54

回答

2

這可能是我找到的最好的Redirection Tutorial。每當我看到一些奇怪的重定向時,我都會參考這個來幫助我完成它。

+0

非常豐富的文章!我閱讀教程並做了分析。這是我得到的:對於ls:0到終端,1到終端,2到管道。對於grep:0管道,1到終端,2到終端。對 ? – abc 2010-11-22 06:49:55

3

重定向是將外部命令處理爲內部命令,並在從左至右的命令內處理。因此,ls -l 2>&1 >&3 3>&-最初獲取標準輸出到管道。然後,stderr被重定向到管道,stdout成爲原始stdout(unpiped),並且額外的fd被關閉。因此,ls -l的常規輸出保持不變,包含「bad」的錯誤輸出的行將發送到stdout,並且其餘的錯誤輸出將被丟棄。

+1

謝謝但: 這個'exec 3>&1'如何保存標準輸出的當前值? 第一行將fd 3分配給fd 1,然後在第二行中將fd 1分配給fd 3?那是什麼意思 ?我不明白。 爲什麼在第二行關閉fd 3兩次? – abc 2010-11-21 23:02:08

+1

fd 3已關閉兩次,因爲兩個新進程中的每一個都有自己的副本 – jilles 2010-11-21 23:06:29

+0

我閱讀了教程並進行了分析。這是我得到的:對於ls:0到終端,1到終端,2到管道。對於grep:0管道,1到終端,2到終端。對 ? – abc 2010-11-22 06:49:14