cmd.exe重定向运算符的顺序和位置

时间:2014-08-28 23:10:53

标签: cmd io-redirection

首先关于订单

以下内容有助于将stdoutstrerr重定向到nul

command 1>nul 2>&1

以下没有

command 2>&1 1>nul

为什么订单很重要?如何用人类可理解的语言阅读这些表达?

关于职位

这有效

command 1>nul 2>&1

这也是

1>nul 2>&1 command

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

2 个答案:

答案 0 :(得分:7)

command 2>&1 1>nul无法正常工作。有用。但像往常一样,它会按照你的要求做你想做的事情

从左到右:

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

  • {1}}数据流1将发送到1>nul

重复是关键。数据不会发送到任何流1点,而是发送到流句柄的副本。当流1被重定向时,流2具有其自己的句柄,前一个流的副本1.改变流1不影响流2

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

  • nul设置流1中的句柄指向nul

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

关于职位

大多数时候,位置(在命令之前,在命令之后或两者之间)是无关紧要的。要执行命令,解析器必须首先准备命令将使用的流。在开始执行命令之前,如果认为有必要(尝试重定向nul命令输入或输出),则完成此准备工作。

唯一存在差异的情况是我们想要从命令中获取的内容以及解析器理解的内容不同。一个明显的例子是我们需要输出一个带有结束数字的字符串。代码为

rem

不会将完整字符串发送到目标文件。 echo 1 2 3>file 将回显到控制台,写入流3的数据(此命令中没有任何内容)将发送到1 2

当然,可以在数据末尾添加空格(file3之间),但此空间将包含在输出中。如果这是不可接受的,解决方案是将重定向放在命令的开头

>

答案 1 :(得分:1)

CMD只是模仿command.com中的MSDOS 5。添加的额外设施作为" shell"应用,封装现有功能和怪癖,以确保现有批次的影响最小。

开发人员做出了许多难以理解的决定。它似乎是一个低优先级严重监督的项目,正如内置文档中的不良和不一致的拼写所证明的那样,决定将前导零字符串解释为八进制而不是十进制,而不是使用O'123'类似十六进制到H'123'日期/时间实用程序中没有/u通用日期格式的开关和许多其他需要解决方法的怪癖 - 所有这些都指向了一个监管不力的项目,这个项目是在一个未被淹没的骑士开发者中商业节目的现实。

所以 - 2&1语法是一个很好地应用于产品的附加组件,希望它可以在点击和傻笑生成的压力下逐渐消失。因此,它不是"工业强度" - 但具有讽刺意味的是,幸存下来了。

过去十年或更长时间内几乎没有进一步发展的事实表明其表现不佳的表兄弟"状态。它没有钱,因为它并不华而不实,而且向后兼容,它最终必定会在20世纪50年代扎根。

因此,解决DOS5后改进引入的异常没有商业原因。顺序问题出现是因为程序员的心态,而不是考虑到任何人都会尝试以任何其他方式使用新设施,而不是那些特定的程序员合乎逻辑的。

因此,你以 程序员决定你应该的方式使用重定向,而且很快就不会有改变 - 除非你能想出一些我希望能为你想要的事业发展提供资金。