重定向本身>&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徹底拒絕它。
它*不被允許。這就是爲什麼你得到了錯誤信息。 – 2014-08-29 11:53:39
@HarryJohnston我不同意。該消息是關於失敗的嘗試。它沒有系統地被禁止。它試圖做或模擬試圖做到這一點,並失敗。有一個允許它的基礎設施。如果不允許的話,應該說該嘗試是**無效**,沒有失敗。 – n611x007 2014-08-29 13:23:46
這將需要'cmd.exe'明確檢測到你正在做的事情是不允許的,並阻止你。爲什麼要麻煩? – 2014-08-29 23:39:42