CMD或批处理BNF语法或解析器参考

3
我是一名有帮助的助手,可以为您进行翻译。以下是需要翻译的内容:

我正在查看一些由同事编写的批处理文件,并遇到了一些奇怪的语法,他在命令开头调用重定向运算符。

这个:

> output.txt ECHO something like this

而不是:

ECHO something like this > output.txt

它让我有点困惑。它能用,所以我认为它是有效的。我去查找官方参考资料以确认,但没有找到。

我找到了这个关于操作符本身使用的参考资料。

我在这里找到了这个bash版本的我要找的内容链接:POSIX sh EBNF grammar

批处理中使用>和>>操作符的正确语法是什么?

编辑: 澄清一下,我不是在寻找文档的例子。我想看到解释如何特定地解析cmd.exe命令和.bat文件与重定向操作符相关的文档。


4
回音命令"echo This is > file.txt" 也是有效的。 - Aacini
1
@aschipfl 那个问题是在寻找关于重定向的文档,但是针对的是不同方面的行为。他们的问题涉及到在同一命令中有多个重定向运算符时的位置和顺序。 - Pete
这不仅关乎它们相对顺序,也涉及到命令行中的绝对位置;请参见已接受答案中的“关于位置”一节。 - aschipfl
1
我在提一个不同的问题,即使它有相同的答案。他们展示了重定向操作符在行首的使用示例。这并没有真正回答我的问题。我知道它能用,我只是寻找一些关于cmd.exe解析器语法的文档。 - Pete
1个回答

4

命令重定向运算符的官方文档演示了它们在行末的使用。但是,在行首放置重定向同样是正确的(管道输出除外)。

将重定向放在echo行的开头的好处是避免将尾随空格回显到文件中。

echo Hello world! > out.txt

15字节,包括尾随空格。
> out.txt echo Hello world!

14字节,不包括尾随空格。

您也可以使用括号来避免尾随空格。

(echo Hello world!) > out.txt

14字节

括号也可以用于将多个命令的输出分组,而不必为每行关闭和重新打开文件句柄。

rem // option 1
> out.txt (
    echo Hello world!
    echo Another line
)

rem // option 2
(
    echo Hello world!
    echo Another line
) > out.txt

这两个括号内的代码块执行的是相同的操作,且都比下面的代码更有效率:

rem // option 3
>out.txt echo Hello world!
>>out.txt echo Another line

在上述选项1和2的括号示例中,仅一次打开、写入和关闭“out.txt”,而选项3的示例则在打开、写入、关闭后再打开以进行追加写入、写入和关闭。当向文本文件转储大量数据时,这样的优化可以产生巨大影响。

真的吗?我经常做相反的事情,例如>output.txt set /P "=line without trailing CrLf" <NUL - rojo
1
你们官方文档与我在问题中提供的链接是一样的。它定义了如何使用运算符,我也理解了那部分内容。但我正在寻找定义批处理命令语法以及在命令中哪里可以使用该运算符的相关内容。 - Pete
@rojo:这完全是个人偏好的问题,但当块由许多行组成时,输入命令通常放在开头,输出命令放在结尾。我发现按照这个顺序更容易匹配从文件中读取命令放在开头,而将写入命令放在结尾(就像一个“开头输入,结尾输出”的块)。 - Aacini
1
@rojo:你的披萨评论让我想起了一个关于字节序列在更大数据单元中使用的术语起源的故事,取自乔纳森·斯威夫特的小说《格列佛游记》:在利利普特王国中,有一道法令命令所有臣民,在极大的惩罚下,在吃鸡蛋之前打破它们的小端,所以他们被称为“小端”(_较小的部分先_)。叛徒被称为“大端”(_最大的部分先_),被流放并在利利普特的敌人布雷福斯库王国中寻求庇护。 - Aacini
@aschipfl:你错了。整个块都会被首先解析,包括重定向,无论它们放在哪里,然后在执行命令之前启用重定向... 你应该因为这样的话被流放到布鲁菲斯库!**^_^** - Aacini
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接