免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
重定向中的秘密(句柄備份)



以下是理論說明,懂的可以跳過,也可以先看例子,遇到不明白的再倒回來看。

重定向符號有 < 、> 、>> 、<& 、>& 和 | 共六個。

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

符號   作用
——————————————————————————————
<   從文件或設備(如默認的 con 鍵盤)中讀取命令輸入。
>   將命令輸出寫入到文件或設備(如 prn 打印機)中。
>>   將命令輸出添加到文件末尾而不刪除文件中的信息。
<&  從后一個句柄讀取輸入并寫入到前一個句柄輸出中。
>&  將前一個句柄的輸出寫成后一個句柄的輸入。
|   讀取前一個命令中的輸出作為后一個命令的輸入。也稱作管道符。
——————————————————————————————
注意:句柄的輸入輸出只是其指向,真正的輸入輸出是靠設備。
重定向符號的默認句柄,< 的默認句柄是 0,> 的默認句柄是 1。

可用句柄(0 - 9)如下表:

句柄    句柄號   說明
——————————————————————————————
STDIN    0     標準輸入,默認從鍵盤輸入
STDOUT   1    標準輸出,默認輸出到命令提示符窗口
STDERR   2     標準錯誤輸出,默認輸出到命令提示符窗口
UNDEFINED 3-9    這些句柄由應用程序和各個具體工具單獨定義。
——————————————————————————————
STD 即 Standard —— 標準的縮寫。

設備
標準輸入設備為鍵盤,用 con 表示。
標準輸出設備為控制臺(即命令提示符),默認也用 con 表示。
常用的還有:
空設備,用 nul 表示。
存儲設備,文件就歸到這類。
不常用的如:打印機 prn。

指向
句柄實際上也是一組 0 1 數(shù)據(jù),是存儲了一個指向。
句柄 0 默認指向 con,這里 con 為標準輸入設備,即鍵盤。
句柄 1 默認指向 con,這里 con 為標準輸出設備,即控制臺。
句柄 2 默認也指向 con,同 1。
此外,我們對句柄的指向重新設定(即所謂的重定向)時,可以改變句柄的指向。
如 1>nul 是讓“標準輸出”數(shù)據(jù)輸出到空設備,效果就是屏蔽輸出。

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


下面拿個簡單的例子來說明
pause>nul
后面的 >nul 的作用就是屏蔽了 pause 命令的默認輸出 “請按任意鍵繼續(xù). . .”。
以上是簡單的描述,而實際的過程可沒那么簡單:
首先確定重定向符號為 >;
接著檢查句柄號,發(fā)現(xiàn)沒有,控制臺為其加上默認句柄 1,此時變成 pause 1>nul;
由于句柄 1 的默認指向 con,此時要被臨時設定為指向 nul,為了之后取回原來的指向,所以要先對 1 的指向進行備份,備份到句柄 3,備份過后臨時設定 1 指向 nul;
(為什么要備份,為什么要備份到 3 而不是 4?見下文)
到這時這條語句才被執(zhí)行,效果就是批處理暫停,沒有輸出只有一個光標閃阿閃。
執(zhí)行完后 1 要取回原來的指向,1 的指向在上面被備份到 3,不管 3 的指向有沒有改變 1 要取回它的指向來,取回后 1 指向 con;3 的指向被取走,由于 3 沒有備份,所以恢復到原來的(空),即無指向。
至此整個過程描述完畢。
可以發(fā)現(xiàn)這時的情況與最初是相同的,所有句柄的指向都是其默認值。

  接著引出 句柄(指向)備份理論。
當指向為非空的句柄被重新設置時要進行備份,而且是備份到第一個沒有指向的句柄。
語句運行完后要取回其備份,而不管備份中的句柄指向有沒有改變。
如果當前狀態(tài)下 3 - 9 這七個句柄都有了指向,這時新設置的句柄其原指向將不再備份。
復制代碼
另一種表述:也就是說當指向為(空)的句柄被設定時是不需要備份的。如:復制句柄時源句柄不備份,因為沒有被再次設置。
補充說明:一個句柄只能存儲一個指向。
復制代碼
舉例說明:


示例三與示例二有什么異同呢?
基本上相同,只有執(zhí)行的這句,示例三是有輸出的,示例二卻沒有。

有沒有發(fā)現(xiàn)示例四和示例三是一樣的,那用復制句柄的方法能不能和示例二一樣呢?
可以,自己想吧。^_^

還有一個特別的例子:
echo 你好!>nul >hello.txt >prn >con
它使用的是相同的句柄 1,這時要以最后一個為準,其他的忽略。把它存為批處理運行,能夠清楚的看到前面的三種指向直接被剪掉了。
同理:
echo 你好! 1<&3 >nul
也以后面的 ”>nul“ 為準,即不顯示 ”你好!“。

具體例子講解
@echo off
echo 哇,這就是傳說中的樹葉嗎?>con 3>nul
echo 我有一片神奇的樹葉(吹口哨),
echo 你看不見我,
echo 我現(xiàn)身,>con
echo 我又隱身啦。
echo 誰偷了我的葉子,快還我。>con 4>con
echo 沒穿褲褲被你們看到了!
pause>nul
復制代碼
哇,這就是傳說中的樹葉嗎?
這句用了 “>con >nul” 同示例三,首先 句柄 1 指向要被設為 con,先備份到 3 再設定;第二步 這時 3 指向為 con,現(xiàn)在又要設為 nul,先備份 con 到 4;最后 1 指向 con,3 指向 nul,4 指向 con;所以這句執(zhí)行時是要顯示的。
執(zhí)行完后返回,1 取回 3 的指向 nul,3 取回 4 的指向 con,4 恢復(空),所以返回結束時 1 指向 nul,3 指向 con。假設這時狀態(tài)為 A。
因此接下來兩句 “我有一片神奇的樹葉(吹口哨),”,“你看不見我,” 是不顯示的。
“我現(xiàn)身,” 這句設定為 “>con”。執(zhí)行時 1 為 con,原來的 nul 備份到 4(因為前面 3 已經(jīng)為 con 不是沒有指向了);執(zhí)行完后 1 取回備份 nul,4 恢復(空)。這時的狀態(tài)還是 A。
所以下一句 “我又隱身啦?!?還是不顯示。
倒數(shù)第二句 “誰偷了我的葉子,快還我?!?br>設定為 “>con 4>con”,首先 句柄 1 指向要被設為 con,3 已經(jīng)不為(空)了,所以備份 nul 到 4;第二步 這時 4 指向為 nul,現(xiàn)在又要設為 con,先備份 nul 到 5;最后 1 指向 con(3 指向 nul)4 指向 con,5 指向 nul;所以這句顯示。
返回時 1 取回 4 的指向 con,4 取回 5 的指向 nul,5 恢復(空)。而這時狀態(tài)已經(jīng)不同于 A 了,設為狀態(tài) B。最后一句 “沒穿褲褲被你們看到了!” 使用的是狀態(tài) B 的句柄指向,所以也顯示。

到些講解結束。(以上紅色為顯示的,淡藍色為不顯示的)

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


補充
我們可以比較一下下面兩句的差別
echo 你好!>con 2>con
echo 你好!
(有人會問了 “你不是說句柄 1 和 2 默認指向為 con 嗎?”)
沒錯,我來解釋一下。
第一句對句柄 1 和 2 進行了重新設定(雖然是和默認一樣的),因此要有備份和取回的過程;
而第二句沒有設定,直接取默認值作為當前設定(不需要備份什么的哦);
這樣第二句就比第一句快一點,如果在一個循環(huán)多次的程序中使用,速度差別就很明顯了。

應用
一次性屏蔽錯誤輸出(加在開始屏蔽的語句后面)
2>nul 3>nul

一次性將輸出寫入文件 a.txt(不包括錯誤反饋,用法同上)
>&3 3>a.txt

  此帖中就有應用(是一次性屏蔽錯誤輸出的,大大加快了程序的運行速度)
  http://bbs.bathome.net/viewthread.php?tid=2372&page=1#pid14024

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

問題:經(jīng)過重定向后句柄的指向已經(jīng)不同于默認指向了,還能恢復成原來的默認指向嗎?
回答:因為指向不能設定或復制成空,所以語句運行完后的指向如果改變了是不能回到默認指向的。
(如有錯誤,歡迎指出。)

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
從 >nul 講起-3
bat批處理 if 命令示例詳解
DOS的管道、重定向等 - Fish - 博客大巴
批處理技術內幕:重定向與句柄 | Demon's Blog
tee命令用法
本人常用的批處理實用技巧
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服