cmd.exeredirect操作符的顺序和位置

首先关于命令

以下工作将stdoutstrerrredirect到nul

 command 1>nul 2>&1 

以下不

 command 2>&1 1>nul 

为什么顺序很重要? 这些expression怎么能用一种人类可以理解的语言来阅读?

关于职位

这工作

 command 1>nul 2>&1 

这也是

 1>nul 2>&1 command 

为什么? 任何有关语法规则的官方参考文档都会有所帮助。

command 2>&1 1>nul不工作是不正确的。 有用。 但像往常一样,它是做你所要求的,而不是你想要的

从左到右:

  • 2>&1数据到stream2(stderr)将被发送到stream1(stdout)正在使用的句柄的副本

  • 1>nul数据stream1将被发送到nul

重复是关键。 数据不会发送到任何stream1点,而是发送到stream处理的副本 。 当stream1被redirect时,stream2具有自己的句柄,前一stream1的副本。改变stream1不影响stream2

现在,让我们看看工作代码,从左到右

  • 1>nul将stream1中的句柄设置为指向nul

  • 2>&1将stream2中的句柄设置为stream1中使用的句柄的副本,即句柄为nul

关于职位

大部分时间(在命令之前,在命令之后或两者之间)是不相关的。 为了执行命令,parsing器必须首先准备命令将使用的stream。 在开始执行命令之前, 如果认为有必要 (尝试redirectrem命令input或输出),则执行此准备。

唯一不同的情况是我们想从命令中获得什么以及parsing器理解的是不一样的。 一个明显的例子是我们需要输出一个结尾数字的string。 代码为

 echo 1 2 3>file 

不会将完整的string发送到目标文件。 1 2将被回显到控制台,并且写入stream3的数据(此命令中没有任何内容)将被发送到file

当然,可以在数据的末尾添加一个空格(在3>之间),但是这个空格将被包含在输出中。 如果这是不可接受的,解决方法是将redirect放在命令的开头

 >file echo 1 2 3 

CMD只是从MSDOS 5模拟command.com 。 所添加的额外设施被作为“shell”应用,封装了现有的function和怪癖,以确保现有的批次受到的影响最小。

开发人员有许多不可理解的决定。 这似乎是一个低优先级的严重监督项目,正如内置文档中拼写不佳和不一致的结果所certificate的那样,决定将前导零string解释为八进制而不是十进制,而不是使用O'123'类似于H'123'为hex。 在date/时间公用程序中没有通用date格式,需要变通办法的许多其他怪癖 – 所有这些都指向了一个糟糕的监督项目,这个项目给了一个在商业编程方面没有实际意义的骑士开发者。

所以 – 2&1语法是一个附加应用程序,对于一个产品,它希望会在点击和傻瓜一代的压力下消失。 因此,这不是“工业强度” – 但具有讽刺意味的是,

在过去十年甚至更长时间里没有进一步发展的事实表明了它的“可怜的堂兄弟”地位。 这里没有钱,因为它不华丽,而且向后兼容,所以最终在1950年代就会有根植的想法。

因此,DOS5以后的改进引入的exception问题没有任何商业原因可以解决。 顺序问题是因为程序员的思维方式而产生的,并没有考虑到任何人都会以任何其他方式尝试使用新的工具,而不是像那个特定的程序员那样使用新的工具。

因此,你按照程序员决定你应该使用的方式来使用redirect,除非你能拿出几百万来为你想要的开发提供资金,否则我预计不会有任何改变。