( 在继续阅读之前建议你准备好纸笔,以便能记录下各个代号指向的变化,这样不至于混乱)
我们现在把焦点集中到这句“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以后都为空指向。
会不会有点乱?那就再好好的看几遍吧,或者是看看这篇,讲的更基础一些:
第四节
我们已经知道“echo hero”相当于“echo hero 1>con 2>con”,con表示控制台,可以把con看做是特殊的文件,这就是我们无法建立名为con文件的原因。
再对“>”和“>>”的重定向机制做个分析。当要重定向到的文件有隐藏或系统属性时,“>>”可以正常运行,而 “>”就无法操作了。据此我推测,对于“>”的重定向输出,如果文件不存在当然是建立文件,而如果文件存在就先将文件删除,然后再新建文件,也就是说并非是覆盖文件的内容而是先删除文件再建立新文件。









