首先是关于顺序
以下方法可以将stdout
和strerr
重定向到nul
。
command 1>nul 2>&1
以下内容不会:
command 2>&1 1>nul
为什么顺序很重要?这些表达式如何用通俗易懂的语言阅读?
关于位置
这个可以工作。
command 1>nul 2>&1
还有这个
1>nul 2>&1 command
为什么?有任何官方的语法规则参考文档会很有帮助。
首先是关于顺序
以下方法可以将stdout
和strerr
重定向到nul
。
command 1>nul 2>&1
command 2>&1 1>nul
command 1>nul 2>&1
还有这个
1>nul 2>&1 command
为什么?有任何官方的语法规则参考文档会很有帮助。
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
1 2
将被输出到控制台,并且写入流3的数据(此命令中没有内容)将被发送到file
。3
和 >
之间),但是该空格将包含在输出中。如果不接受这种情况,则解决方案是将重定向放在命令开头。>file echo 1 2 3
CMD
简单地模拟了MSDOS 5
中的command.com
。添加的额外功能被应用为一个"shell",封装现有功能和怪癖,以确保现有批处理文件受到的影响最小。
开发人员做出了许多难以理解的决定。这似乎是一个低优先级的监督不力的项目,证据是内置文档中拼写错误和不一致性,选择将前导零字符串解释为八进制而不是十进制,并且没有使用类似于十六进制的H'123'
的O'123'
。日期/时间工具中没有通用日期格式的/u
开关,以及数十个其他需要解决的怪癖 - 这些都表明这是一个监督不力的项目,交给了一个对商业编程的现实没有经验的鲁莽开发者。
因此,2&1
语法是一个附加功能,被糟糕地应用于一个希望在点、击和傻笑的一代的压力下消失的产品上。因此,它并不是"工业强度"的 - 然而具有讽刺意味的是,它已经存活了这么长时间。
2>&1 >file
将错误信息发送到标准输出并将输出发送到文件。>file 2>&1
将错误和输出都发送到文件中。就像在编程语言中一样,顺序很重要,x = y; y = 2;
与 y = 2; x = y;
是不同的。 - Raymond Chenset /a
语句中使用0x
前缀来表示十六进制字符串,但不使用0O
来表示八进制,考虑到变量不能以数字开头,因此以0
开头表示“有些不寻常”。使用ISO8601提供了一种通用的日期格式,不是通过指定显示格式来实现的,而是通过提供一种基础方式来表达日期,从而使得日期可以无歧义地表示——将其转换为/从任何其他基础或格式都是相对简单的编程任务。我认为没有“美国中心主义”的理由。 - Magoo
1>nul 2>&1
来抑制输出,甚至没有理解它,可能是因为我从未找到更好的解释。但是,位置呢? - Jaime Hablutzel