查看完整版本: 關於 > (redirection) 的疑問
頁: [1]

zachary61611925 發表於 2014-8-20 11:33 AM

關於 > (redirection) 的疑問

請問一下假設我在command line裡面打
ls -l abc.txt haha.txt
會出現一個錯誤訊息一個檔案訊息
然後我想要把這兩種訊息都傳進一個檔案裏面
在網路上看到的解釋是
ls -l abc.txt haha.txt > Result.txt 2>&1

我不太理解的是
為什麼2>&1要放在目的地檔名的後面啊
這樣感覺好像是先把檔案訊息傳進目的地檔裡面
然後再把error output傳進standard output的stream裡面
可是error output沒有再一次被傳進目的地檔案裏面啊
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

chevylin0802 發表於 2014-8-20 12:44 PM

本帖最後由 chevylin0802 於 2014-8-20 12:46 PM 編輯

你誤解了 命令列的操作不具備順序性的問題

因為它是pipe line的方式
管線導向
從某個角度來說就像是一種替換作用

把原本的標準輸出應該輸出的內容 轉換導向到檔案裏
而也包括將錯誤輸出的內容 導向到標準輸出上
但是由於標準輸出已經從營幕改成了檔案
所以就會按照時間順序
寫入檔案

在命令列裏
stdout被替換成檔案
stderr此時只要再指向到stdout
就會一樣指向到被替換的檔案上


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

zachary61611925 發表於 2014-8-20 01:00 PM

那為什麼沒辦法先 2>&1 再 > Result.txt 呢
如果順序沒有差別的話
這樣感覺應該要行得通才對啊

B1DE49FC 發表於 2014-8-21 12:45 AM

ls -l abc.txt haha.txt > Result.txt 2>&1

分成幾個步驟來看
在程式還沒有執行時
stdout 和 stderr 的對象大致如下:

stdout (1) :  /dev/pts/x  (螢幕或某個終端機)
stderr (2) :  /dev/pts/x

執行「ls ... > Result.txt」後
系統會重新設定輸出目標變成

stdout (1) : Result.txt
stderr (2) : /dev/pts/x

指令最後「2>&1」執行後
會在將 stderr 指到 stdout
stdout 此時已是 Result.txt
所以執行後的設定會是

stdout (1) : Result.txt
stderr (2) : Result.txt

# -----------------------------

在把 pipe line 的順序調換

比較一下執行上的差異
ls -l abc.txt haha.txt 2>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

zachary61611925 發表於 2014-8-21 01:55 AM

B1DE49FC 發表於 2014-8-21 12:45 AM static/image/common/back.gif
ls -l abc.txt haha.txt > Result.txt 2>&1

分成幾個步驟來看


所以兩者的差別是不是在於把stdout指到Result.txt的時間點前後呢
錯誤的例子裡面
先執行2>&1的結果是把stream2 (stderr) 指定到和 stdout 相同的地方
也就是螢幕
之後再執行的>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

winnet 發表於 2014-8-25 03:11 AM

我覺得樓主說的應該就是問題的所在!!
我記得把2>&1指令放前面的時候,stderr不會有導向的動作,但是我也不知道原因,所以就一直照著放後面,我也很想知道為什麼stderr沒有跟過去,是因為stderr一直指向stdout嗎?
頁: [1]