第二节
下面要讲的是句柄代码之间的“重定向”。 之前不是提到过还有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<hero.txt 0>&3”这句是显示文件hero.txt,具体过程:“3<hero.txt”把3的指向变为 hero.txt,“0>&3”把3的指向复制给0,即0指向了hero.txt(只不过这次是从hero.txt中读取数据)。强调一下,真正能读取数据的是0而不是3,3只是作为中间量而已。刚才这句我们当然可以这么写:“more 0<hero.txt”或直接“more <hero.txt”。
再来一个例子“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
这究竟是怎么回事?为什么结果会如此出乎意料?
这里涉及到一个所谓“备份”的问题,就是在修改某个句柄代号的指向之前,系统会把该句柄代号原来的指向备份到截止到目前第一个指向为空的句柄代号中。目的是当这一行的程序结束之后,系统可以通过备份找回原来的指向。









