作者 主題: 很難懂的邏輯,bash redirection 的疑惑  (閱讀 3468 次)

0 會員 與 1 訪客 正在閱讀本文。

jade-rabbit

  • 鑽研的研究生
  • *****
  • 文章數: 833
  • 性別: 男
    • 檢視個人資料
代碼: [選擇]

       Note  that  the order of redirections is significant.  For
       example, the command                                      

              ls > dirlist 2>&1

       directs both standard output and  standard  error  to  the
       file dirlist, while the command                          

              ls 2>&1 > dirlist

       directs  only the standard output to file dirlist, because
       the standard  error  was  duplicated  as  standard  output
       before the standard output was redirected to dirlist.    


我怎麼樣還是不能領悟上面那段 bash manual page,有好心人能解釋一下嗎?

不是都有 2>&1 , standard error duplicated as standard output 嗎?

覺得應該反過來才對,雖然我知道實際上不是如此。
這個錯誤常見喔,像下述 URL 就是一例。
http://www.study-area.org/cyril/scripts/scripts/node32.html
--(中也者天下之大本也,和也者天下之達道也)--

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 很難懂的邏輯,bash redirection 的疑惑
« 回覆 #1 於: 2002-10-03 12:31 »
代碼: [選擇]

              ls > dirlist 2>&1

       directs both standard output and  standard  error  to  the
       file dirlist, while the command                          


   先把 ls 的 stdout (1) 轉向到 dirlist, 然後複製 stdout (1) 給 stderr (2)
   因為複製的動作是在轉向之後做的, 所以 stderr 會是轉向過的那一個,
   因此, stderr (2), stdout (1) 都會轉到 dirlist 中.

代碼: [選擇]

              ls 2>&1 > dirlist

       directs  only the standard output to file dirlist, because
       the standard  error  was  duplicated  as  standard  output
       before the standard output was redirected to dirlist.    


    這個與上面的差別在於, 複製的動作是在轉向之前做的. 所以複製過去的
     那個 handle 並不會因為後面的轉向而跟著轉向.

   知道 fork() 的運作嗎 ?
   這兩個的情形很類似, 如果你知道 fork() 之後兩個 process 的差異, 就會
    知道為什麼先後會有差別.