Windows 命令列輸入輸出重定向問題

2021-10-02 00:17:01 字數 3730 閱讀 6090

重定向符號主要有:>,>>,<,>&,<&和|,以下只有前五個的介紹,最後乙個是管道,與unix亦完全一致。

第一節首先從乙個經典問題開始,「1>nul 2>nul」的意思是既遮蔽正常的輸出又遮蔽錯誤的輸出,那麼我們馬上就知道了這裡的1表示正常輸出(即所謂的「標準輸出」--stdout),2表示錯誤輸出(即所謂的「標準錯誤輸出」--stderr)。

1和2其實是控制代碼stdout和stderr的數字代號,至於什麼是控制代碼,我認為可以理解為某種事物的一種標識,或者說這個控制代碼指向某個事物。舉個例子來說,「標準輸出」以控制代碼stdout為標識,或者說控制代碼stdout指向「標準輸出」。

還有乙個控制代碼--stdin,它是所謂「標準輸入」的標識,數字代號是0。除此之外還有3~9可用,只是它們沒有定義。

「標準輸出」和「標準錯誤輸出」預設是要輸出到控制台con(即cmd視窗)的,而「標準輸入」預設是由控制台con(即鍵盤)輸入的,因此重定向的目的就是將輸入輸出流從預設位置重定向到新的位置。符號「>」和「>>」的預設控制代碼代號是1,而「<」的預設控制代碼代號是0。

「echo hhhhhh」類似於這樣的語句可以說是我們再熟悉不過的了,但這只是種預設的狀態,其實裡面還有一些內容。這一句完整的應該是這樣的:「echo hhhhhh 1>con 2>con」,意思是將echo命令的結果中的標準輸出和標準錯誤輸出輸出到控制台con中,只不過此時標準錯誤輸出是空的。

再看乙個例子,如果給dir乙個錯誤的引數,例如「dir /mm」,那麼寫全了就是「dir /mm 1>con 2>con」,只不過此時的標準輸出是空的。如果你這樣寫的話「dir /mm 1>hero.txt」,那麼螢幕上會照常顯示錯誤資訊但hero.txt中不會有內容。

再來乙個標準輸入的例子,「set /p var= 」其實應該是這樣的「set /p var= 0nul代表的是「空裝置」,是乙個不存在的裝置,將輸出流重定向到空裝置就相當於遮蔽掉了一樣。而如果從空裝置中讀取輸入,自然是讀不到東西的,但的確是輸入了,這也就是「set /p var=第二節

下面要講的是控制代碼**之間的「重定向」。 之前不是提到過還有3~9這7個控制代碼數字代號嗎,這些究竟有什麼用?說實話,基本沒什麼用,因此建議你如果不是迫切想知道這部分內容的話就不要往下看了。

「echo hero 1>hero.txt」這一句是將標準輸出重定向到檔案hero.txt,相當於將控制代碼代號1的指向由con變為hero.txt。「echo hero 3>hero.txt 1<&3」,這句的結果是生成了檔案hero.txt,其內容為hero,過程是這樣的:「3>hero.txt」是將控制代碼數字代號 3的指向由「空」變為hero.txt;「1<&3」是將控制代碼數字代號3的指向複製給1的指向,此時1的指向就為hero.txt了,因此標準輸出就被重定向到hero.txt中了。

「i<&j」和「i>&j」的效果都是把j的指向複製給i。「echo hero >hero.txt 2>&1」這句的意思是,無論是標準輸出還是標準錯誤輸出都會被重定向到hero.txt中,具體過程:1的指向由con轉為 hero.txt,「2>&1」是把1的指向複製給2,此時2的指向也變為了hero.txt,因此1和2都會被重定向到hero.txt 中。注意:1是符號「>」的預設控制代碼數字代號。

再看「echo hero 3>hero.txt」,這個為什麼就不能將結果重定向到檔案中呢?記住,我們要重定向的只有標準輸入、標準輸出和標準錯誤輸出,因此真正「幹活」 的就只有0、1和2,因為它們分別指代了前面的三者,而3沒有指代任何控制代碼只能作為間接量使用。

「more 3&3」這句是顯示檔案hero.txt,具體過程:「3&3」把3的指向複製給0,即0指向了hero.txt(只不過這次是從hero.txt中讀取資料)。強調一下,真正能讀取資料的是0而不是3,3只是作為中間量而已。剛才這句我們當然可以這麼寫:「more 0再來乙個例子「echo hero 5>hero.txt 4>&5 3<&4 1<&3」,結果輸出到了hero.txt中。具體過程:5的指向變成hero.txt,「4>&5」把5的指向複製給 4,「3>&4」把4的指向複製給3,「1>&3」把3的指向複製給1,最終1的指向就是hero.txt,則1所指代的標準輸出就被重定向到了hero.txt。

第三節注意:這一節的內容都是圍繞著下面這個例子進行敘述的。

複製內容到剪貼簿

**:@echo off

echo 英雄是好男人!!!

echo 1>nul 3>nul

echo 英雄是

echo 英雄是

echo 這是怎麼回事,難道就不能 1>con 4>con

pause

這究竟是怎麼回事?為什麼結果會如此出乎意料?

這裡涉及到乙個所謂「備份」的問題,就是在修改某個控制代碼代號的指向之前,系統會把該控制代碼代號原來的指向備份到截止到目前第乙個指向為空的控制代碼代號中。目的是當這一行的程式結束之後,系統可以通過備份找回原來的指向。

我們現在把焦點集中到這句「echo. 1>nul 3>nul」上來。這句究竟是如何工作的呢?

第一步:在執行「1>nul」之前,1的指向是預設值con,此時代號3~9的指向都是空(初始值),因此系統會把1的指向備份到3(因為3是第乙個為空的代號),3就指向了con。就是說系統把1原來的指向複製給了3,目的是語句結束後能找回原來的指向,這就相當於備份。

第二步:現在3的指向是con。然而由於要執行「3>nul」,因此還要備份3的指向。此時4是空的,系統就把3的指向con複製給了4,即4現在指向con。就是說3以4為備份。

第三步:由於「3>nul」使得3指向了nul。

第四步:這行語句結束時,1要找回原來的指向,從以上敘述我們知道,3是1的備份,因此1要通過3來恢復「原來」的指向,但此時3的指向已經變為了nul,故1就指向nul。

第五步:而3要恢復原來的指向就要找4,4指向con,故3恢復為con;4原始指向是空的,其備份在5中,故4的指向恢復到空。

至此我們理順一下,現在1指向nul,2指向預設值con,3指向con,4之後都是空指向。那麼在執行後兩句echo語句時由於1指向nul,即標準輸出被重定向到空裝置,故顯示被遮蔽。

再來看看這句 「echo 這是怎麼回事,難道就不能 1>con 4>con」 這句是怎麼工作的呢?

第一步:1當前指向是nul,由於要執行「1>con」,因此要進行備份。但此時3指向的是con非空,故系統將1的指向備份到4,即4指向nul。

第二步:又由於要執行「4>con」,故4現在的指向nul就又被備份到5中,5以後的事姑且省略。

第三步:執行完「4>con」之後4就指向con。

第四步:該行程式結束後,1要通過4來恢復指向。4指向con,故1指向con從而恢復了預設狀態。而4找5,5指向nul,故4指向nul。

我們再數一數現在的情況,0指向con,1指向con,2指向con,3沒動還是指向con,4指向nul,5以後都為空指向。

會不會有點亂?那就再好好的看幾遍吧,或者是看看這篇,講的更基礎一些:風_吟/blog/item/0b35a7db07615e47d1164ed8.html

第四節我們已經知道「echo hero」相當於「echo hero 1>con 2>con」,con表示控制台,可以把con看做是特殊的檔案,這就是我們無法建立名為con檔案的原因。

再對「>」和「>>」的重定向機制做個分析。當要重定向到的檔案有隱藏或系統屬性時,「>>」可以正常執行,而 「>」就無法操作了。據此我推測,對於「>」的重定向輸出,如果檔案不存在當然是建立檔案,而如果檔案存在就先將檔案刪除,然後再新建檔案,也就是說並非是覆蓋檔案的內容而是先刪除檔案再建立新檔案。

通過第三節的講解你應該明白為什麼類似這樣的語句「echo hero >nul >con >hero.txt >con」會以最後乙個為準了吧。

最後需要注意一點的是--重定向輸出無法輸出到唯讀檔案。

完。win下的大部分重定向與unix還是一致的,嗯

Linux Unix 命令列 輸入輸出重定向

在unix系統中,任何命令,包括shell本身,預設情況下總是讀取來自終端鍵盤輸入的資料,這個資料輸入源通常稱作標準輸入 stdin 其檔案描述符為0.預設情況下,命令的處理結果總是輸出到使用者終端的螢幕上,這個輸出目的通常稱作標準輸出 stdout 其檔案描述符為1.另外,在命令的執行期間,如果出...

linux命令列 二 輸入輸出流處理

格式如下 echo e 033 字背景顏色 文字顏色m字串 033 0m 例如 echo e 033 44 33m文字內容 033 0m 其中44的位置代表背景顏色,3的位置是代表文字的顏色 字串前後可以沒有空格,如果有的話,輸出也是同樣有空格 下面是相應的字和背景顏色,可以自己來嘗試找出不同顏色搭...

Windows 下 命令列 無法輸入中文

1.首先想到的是輸入的問題,新增了預設的 智慧型abc 輸入法後,還是無法輸入。看來是輸入法控制程式的問題!windows 的輸入法控制程式是 conime.exe 結果一搜尋,發現在系統中沒有 發現 conime.exe 當然無法切換輸入法了。從另一台電腦上拷貝 conime.exe 到我的 sy...