Linux shell I/O 重定向 簡單示例

Linux shell I/O 重定向 簡單示

代碼: 

  1. exec 9>&1 
  2. comd1 2>&1 >&9 9>&- | comd2 9>&-
  3. exec 9>&-
複製代碼

comd1和comd2代表任意的命令。 
該腳本使comd1的錯誤輸出通過管道作爲comd2的輸入,comd1的正常輸出仍然保持。

exec 9>&1 #把fd1的指針複製到fd9,即dup(1,9),或者乾脆理解爲fd9=fd1
#注意,此時fd9和fd1同時指向一個文件。也可認爲將fd1的指針保存在fd9中一份
comd1 2>&1 >&9 9>&- | comd2 9>&-
#這一句比較麻煩
#首先shell創建一個pipe,然後分別folk兩個subshell
#看看第一個subshell做了什麼?
#首先每個subshell都精確拷貝一份父進程的fd表,即0,1,2和9都複製過來了
#然後將fd1指向pipe文件,此時fd9仍然保存着父進程中fd1的文件指針,如果父進程沒有重定向的話,就是stdout
#然後處理這段2>&1 >&9 9>&重定向命令。既
#fd2=fd1; fd1=fd9; fd9=null
#結果是fd2指向fd1原先指向的pipe文件,fd1指向fd9指向的文件,即stdout,然後將fd9關閉,由於這時fd1和fd9同時指向同一個文件stdout,所以stdout並沒有真正關閉,只是減少打開次數。
#最後subshell執行comd1命令,comd1要輸出時取fd1中的指針,即stdout,輸出錯誤時,取fd2中的指針,即pipe,這樣comd2從pipe中只得到了comd1輸出的錯誤信息。
#再看看第二個subshell做了什麼?
#同樣精確拷貝一份父進程的fd表
#然後將fd0指向pipe文件。
#然後處理這段 9>&重定向命令。既關閉fd9。

exec 9>&- #回到父進程,關閉fd9

注:

for example
一開始
fd1=stdout
fd2=stderr
fd9=stdout

有pipe後(subshell)
fd1=pipe
fd2=stderr
fd9=stdout

cmd1 2>&1 >&9 9>&− | cmd2 ... 等價於
fd2=fd1 (fd2=pipe)
fd1=fd9 (fd1=stdout)
fd9=null

(轉貼自:http://bbs.chinaunix.net/thread-221848-1-1.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章