2016-12-26 90 views
1

我看到這個問題: Shell redirection i/o orderShell IO重定向命令,管版

但我還有一個問題。如果此行未能重定向錯誤輸出到file

ls -xy 2>&1 1>file 

那麼,爲什麼這條線可以重定向錯誤輸出到grep

ls -xy 2>&1 | grep ls 

我想知道它是如何實際上被下運行。

據說2>&1將stderr重定向到stdout的副本。 「stdout的副本」是什麼意思?什麼是實際複製?

終端註冊自己(通過操作系統)發送和接收通過它創建的進程的標準流,對吧?其他重定向是否也通過操作系統(我不這麼認爲,因爲終端本身可以處理這個問題)?

+1

stdout的副本:它是_duplicated_,因爲它使用'dup'。 –

+0

'dup' ??你的意思是堆棧操作?在哪個堆棧上? –

+1

'dup'是一個系統調用:'man 2 dup'。 [或這裏](http://pubs.opengroup.org/onlinepubs/9699919799/functions/dup.html)。 –

回答

1

這回答我的第一個問題。其他人呢?

那麼,你的第二個問題已經在評論中回答了。 (什麼是重複的文件描述符)。

關於你的最後一個問題(S),

終端寄存器本身(通過OS),用於發送和通過它創建的過程的標準流接收,是嗎?其他重定向是否也通過操作系統(我不這麼認爲,因爲終端本身可以處理這個問題)?

它是其附着它創建的過程的標準流(第一管,然後<>的,因爲你剛學)。在默認情況下,它將它們附加到它自己的流上,這些流可能會連接到一個tty,您可以通過多種方式進行交互,通常是終端仿真窗口或串行控制檯。 終端是一個非常含糊的詞。

+0

你的意思是'2>&1'會做類似'close(2); dup2(1,2);'? –

+0

是的,功能如此。通常,在'dup2()'之前不需要'關閉()';我不知道在bash源代碼中使用的確切代碼。 – Dario

+0

謝謝。維基百科頁面[dup(系統調用)](https://en.wikipedia.org/wiki/Dup2)幫助我理解了這一點。 –

3

管道重定向(一個命令的標準輸出連接到下一個的標準輸入)之前發生命令進行重定向。 這意味着在2>&1發生時,標準輸出ls已經設置爲連接到grep的標準輸入。

man page of bash

管道

命令的標準輸出經由配管連接到命令2的 thestandard輸入。此連接在 命令指定的任何重定向之前執行(請參閱下面的重定向)。如果 |使用&時,除 標準輸出外,命令的標準錯誤通過 管道連接到command2的標準輸入;它是2> & 1 |的簡寫。標準輸出的標準錯誤的這種隱式重定向在 命令指定的任何重定向之後執行。

(強調我的)。

而在前一種情況下(ls -xy 2>&1 1>file),沒有發生類似情況,即當執行2>&1時,ls的stdout仍然連接到終端(並且尚未重定向到該文件)。

+0

這回答我的第一個問題。其他人呢? –