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

Jai*_*zel 2 cmd io-redirection

首先是关于订单

以下工作重定向stdoutstrerrnul.

command 1>nul 2>&1
Run Code Online (Sandbox Code Playgroud)

以下不是

command 2>&1 1>nul
Run Code Online (Sandbox Code Playgroud)

为什么订单很重要?如何用人类易懂的语言阅读这些表达方式?

关于位置

这有效

command 1>nul 2>&1
Run Code Online (Sandbox Code Playgroud)

这也是

1>nul 2>&1 command
Run Code Online (Sandbox Code Playgroud)

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

MC *_* ND 7

command 2>&1 1>nul不起作用是不正确的.有用.但是像往常一样,它会做你不问你想要的东西

从左到右:

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

  • 1>nul流1的数据将被发送到nul.

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

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

  • 1>nul 将流1中的句柄设置为nul

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

关于位置

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

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

echo 1 2 3>file 
Run Code Online (Sandbox Code Playgroud)

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

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

>file echo 1 2 3
Run Code Online (Sandbox Code Playgroud)