重定向與控制代碼備份

2021-06-16 07:05:29 字數 3778 閱讀 8268

重定向符號的作用如下表所示:

符號   作用

——————————————————————————————

>   將命令輸出寫入到檔案或裝置(如 prn 印表機)中。

>>   將命令輸出新增到檔案末尾而不刪除檔案中的資訊。

>&  將前乙個控制代碼的輸出寫成後乙個控制代碼的輸入。

|   讀取前乙個命令中的輸出作為後乙個命令的輸入。也稱作管道符。

——————————————————————————————

注意:控制代碼的輸入輸出只是其指向,真正的輸入輸出是靠裝置。

重定向符號的預設控制代碼,< 的預設控制代碼是 0,> 的預設控制代碼是 1。

可用控制代碼(0 - 9)如下表:

控制代碼    控制代碼號   說明

——————————————————————————————

stdin    0     標準輸入,預設從鍵盤輸入

stdout   1    標準輸出,預設輸出到命令提示符視窗

stderr   2       標準錯誤輸出,預設輸出到命令提示符視窗

undefined 3-9     這些控制代碼由應用程式和各個具體工具單獨定義。

——————————————————————————————

std 即 standard —— 標準的縮寫。

裝置標準輸入裝置為鍵盤,用 con 表示。

標準輸出裝置為控制台(即命令提示符),預設也用 con 表示。

常用的還有:

空裝置,用 nul 表示。

儲存裝置,檔案就歸到這類。

不常用的如:印表機 prn。

指向控制代碼實際上也是一組 0 1 資料,是儲存了乙個指向。

控制代碼 0 預設指向 con,這裡 con 為標準輸入裝置,即鍵盤。

控制代碼 1 預設指向 con,這裡 con 為標準輸出裝置,即控制台。

控制代碼 2 預設也指向 con,同 1。

此外,我們對控制代碼的指向重新設定(即所謂的重定向)時,可以改變控制代碼的指向。

如 1>nul 是讓「標準輸出」資料輸出到空裝置,效果就是遮蔽輸出。

特別之處: 3 - 9 預設是沒有指向的,我們可以用(空)來表示,注意是不同於空裝置 nul 的哦!

(圖示)

下面拿個簡單的例子來說明

pause>nul

後面的 >nul 的作用就是遮蔽了 pause 命令的預設輸出 「請按任意鍵繼續. . .」。

以上是簡單的描述,而實際的過程可沒那麼簡單:

首先確定重定向符號為 >;

接著檢查控制代碼號,發現沒有,控制台為其加上預設控制代碼 1,此時變成 pause 1>nul;

由於控制代碼 1 的預設指向 con,此時要被臨時設定為指向 nul,為了之後取回原來的指向,所以要先對 1 的指向進行備份,備份到控制代碼 3,備份過後臨時設定 1 指向 nul;

(為什麼要備份,為什麼要備份到 3 而不是 4?見下文)

到這時這條語句才被執行,效果就是批處理暫停,沒有輸出只有乙個游標閃阿閃。

執行完後 1 要取回原來的指向,1 的指向在上面被備份到 3,不管 3 的指向有沒有改變 1 要取回它的指向來,取回後 1 指向 con;3 的指向被取走,由於 3 沒有備份,所以恢復到原來的(空),即無指向。

至此整個過程描述完畢。

可以發現這時的情況與最初是相同的,所有控制代碼的指向都是其預設值。

接著引出 控制代碼(指向)備份理論。

當指向為非空的控制代碼被重新設定時要進行備份,而且是備份到第乙個沒有指向的控制代碼。

語句執行完後要取回其備份,而不管備份中的控制代碼指向有沒有改變。

如果當前狀態下 3 - 9 這七個控制代碼都有了指向,這時新設定的控制代碼其原指向將不再備份。

另一種表述:也就是說當指向為(空)的控制代碼被設定時是不需要備份的。如:複製控制代碼時源控制代碼不備份,因為沒有被再次設定。

補充說明:乙個控制代碼只能儲存乙個指向。

示例三與示例二有什麼異同呢?

基本上相同,只有執行的這句,示例三是有輸出的,示例二卻沒有。

有沒有發現示例四和示例三是一樣的,那用複製控制代碼的方法能不能和示例二一樣呢?

可以,自己想吧。^_^

還有乙個特別的例子:

echo 你好!>nul >hello.txt >prn >con

它使用的是相同的控制代碼 1,這時要以最後乙個為準,其他的忽略。把它存為批處理執行,能夠清楚的看到前面的三種指向直接被剪掉了。

同理:echo 你好! 1nul

也以後面的 」>nul「 為準,即不顯示 」你好!「

具體例子講解

@echo off

echo 哇,這就是傳說中的樹葉嗎?>con 3>nul

echo 我有一片神奇的樹葉(吹口哨),

echo 你看不見我,

echo 我現身,>con

echo 我又隱身啦。

echo 誰偷了我的葉子,快還我。>con 4>con

echo 沒穿褲褲被你們看到了!

pause>nul

哇,這就是傳說中的樹葉嗎?

這句用了 「>con >nul」 同示例三,首先 控制代碼 1 指向要被設為 con,先備份到 3 再設定;第二步 這時 3 指向為 con,現在又要設為 nul,先備份 con 到 4;最後 1 指向 con,3 指向 nul,4 指向 con;所以這句執行時是要顯示的。

執行完後返回,1 取回 3 的指向 nul,3 取回 4 的指向 con,4 恢復(空),所以返回結束時 1 指向 nul,3 指向 con。假設這時狀態為 a。

因此接下來兩句 「我有一片神奇的樹葉(吹口哨),」,「你看不見我,」 是不顯示的。

「我現身,」 這句設定為 「>con」。執行時 1 為 con,原來的 nul 備份到 4(因為前面 3 已經為 con 不是沒有指向了);執行完後 1 取回備份 nul,4 恢復(空)。這時的狀態還是 a。

所以下一句 「我又隱身啦。」 還是不顯示。

倒數第二句 「誰偷了我的葉子,快還我。」

設定為 「>con 4>con」,首先 控制代碼 1 指向要被設為 con,3 已經不為(空)了,所以備份 nul 到 4;第二步 這時 4 指向為 nul,現在又要設為 con,先備份 nul 到 5;最後 1 指向 con(3 指向 nul)4 指向 con,5 指向 nul;所以這句顯示。

返回時 1 取回 4 的指向 con,4 取回 5 的指向 nul,5 恢復(空)。而這時狀態已經不同於 a 了,設為狀態 b。最後一句 「沒穿褲褲被你們看到了!」 使用的是狀態

b 的控制代碼指向,所以也顯示。

如果要用處理來表示就是這樣 補充

我們可以比較一下下面兩句的差別

echo 你好!>con 2>con

echo 你好!

(有人會問了 「你不是說控制代碼 1 和 2 預設指向為 con 嗎?」)

沒錯,我來解釋一下。

第一句對控制代碼 1 和 2 進行了重新設定(雖然是和預設一樣的),因此要有備份和取回的過程;

而第二句沒有設定,直接取預設值作為當前設定(不需要備份什麼的哦);

這樣第二句就比第一句快一點,如果在乙個迴圈多次的程式中使用,速度差別就很明顯了。

應用一次性遮蔽錯誤輸出(加在開始遮蔽的語句後面)

2>nul 3>nul

一次性將輸出寫入檔案 a.txt(不包括錯誤反饋,用法同上)

>&3 3>a.txt

此帖中就有應用(是一次性遮蔽錯誤輸出的,大大加快了程式的執行速度)

以上一些個不實用的東西大家沒必要深究,了解了解就行了,應用為上嘛。

實在需要研究的人例外。

問題:經過重定向後控制代碼的指向已經不同於預設指向了,還能恢復成原來的預設指向嗎?

回答:因為指向不能設定或複製成空,所以語句執行完後的指向如果改變了是不能回到預設指向的。

控制代碼與重定向

命令的結果可以通過 的形式來定向輸出,表示檔案描述符 1為標準輸出stdout 2為標準錯誤stderr。系統預設 值是1,也就是 1 而1 可以簡寫為 也就是預設為 stdout的預設目標是終端,stderr的預設目標為也是終端。我們在批處理中執行 echo text result.txt 我們就...

windows輸入重定向中 控制代碼備份 原理

重定向是指使用重定向符號對輸入或輸出位置進行重新指定。以下是理論說明,懂的可以跳過,也可以先看例子,遇到不明白的再倒回來看。重定向符號有 和 共六個。重定向符號的作用如下表所示 符號 作用 從檔案或裝置 如預設的con 鍵盤 中讀取命令輸入。將命令輸出寫入到檔案或裝置 如prn 印表機 中。將命令輸...

Linux中重定向 追加重定向與輸入重定向

簡單介紹一下重定向 追加重定向與輸入重定向,輸入追加重定向的用法 重定向 我們可以將想要輸出的內容通過重定向新增到某個檔案中 ps 將hello寫入到當前資料夾下的a.txt檔案中,然後檢視a.txt檔案內容 追加重定向 追加重定向和重定向大致相同,不同點是追加重定向在檔案的基礎上繼續新增內容 ps...