2014-08-28 85 views
0

我試着將輸出重定向到標準輸入,如bash >&0,如問題are there uses for '>&0' (redirect to stdin)?中的特色所示。是否有用於在Windows命令行中用`>&0`重定向到標準輸入?

我有The system cannot write to the specified device.

我也試過>&1出於好奇這給

The handle could not be duplicated 
during redirection of handle 1. 

據我所知,有Windows上的多個終端既不在那裏的DOS。

什麼是即使歷史,在Windows中允許重定向到0

+0

它*不被允許。這就是爲什麼你得到了錯誤信息。 – 2014-08-29 11:53:39

+0

@HarryJohnston我不同意。該消息是關於失敗的嘗試。它沒有系統地被禁止。它試圖做或模擬試圖做到這一點,並失敗。有一個允許它的基礎設施。如果不允許的話,應該說該嘗試是**無效**,沒有失敗。 – n611x007 2014-08-29 13:23:46

+0

這將需要'cmd.exe'明確檢測到你正在做的事情是不允許的,並阻止你。爲什麼要麻煩? – 2014-08-29 23:39:42

回答

3

重定向本身>&0不會失敗,也不打印錯誤消息。它導致標準輸出文件句柄被標準輸入句柄的副本所取代。當某些東西嘗試寫入新的標準輸出句柄時,您看到的失敗發生。大概你做了像echo foo >&0這樣的事情,所以它是echo失敗並導致錯誤消息,而不是重定向。

原因echo寫入新的標準輸出句柄時失敗,原因是句柄只允許讀取訪問。當Windows創建命令窗口時,它打開CONIN$,這是一個只讀設備,並分配給標準輸入。由於新的標準輸出句柄引用此只讀設備,因此echo命令失敗。

同樣,Windows也會打開CONOUT$,這是一個只寫設備,並將句柄分配給標準輸出和錯誤。值得注意的是,這種行爲與Unix上的不同之處在於,同一個「tty」設備爲讀寫訪問打開一次,並被複製成初始shell的標準輸入,輸出和錯誤文件描述符。這就是爲什麼>&0通常在Unix上工作,並且通常在Windows上失敗。

基本上有兩種可能的方式>&0可以沒有錯誤地使用。第一個是簡單的重定向程序,不會寫入它。例如type nul >&0不會導致錯誤。那麼一個只能從標準輸出讀取的程序,雖然這樣的程序通常會失敗。

另一種情況是之前的某些事情已經重定向了標準輸入。在這種情況下,標準輸入不會是CONIN$,並且不一定是隻讀的。如果通過其他進程的讀/寫訪問打開(cmd只顯然打開文件只讀或只寫),那麼>&0重定向將按預期工作。

因此,使用>&0沒有太多合法的理由,但它只是涉及其他手柄對的重複重定向中的一種可能的處理方式之一。特別是2>&1是非常有用的。由於>&0可以在某些情況下工作,沒有理由特別對待它,並讓cmd徹底拒絕它。

+0

msdn「Console Handles」:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682075%28v=vs.85%29.aspx – n611x007 2014-08-31 20:38:33

相關問題