在批处理语句中,"> nul 2>&1" 是什么意思?

38

我目前有一个批处理语句,看起来像这样

findstr "PreprocessorDefinitions=.*%D_KEYWORD%" %PROJ% > nul 2>&1
if errorlevel 1 (
    set D_OPT=
) else (
    set D_OPT=/D%D_KEYWORD%
)

我想知道以下内容的含义?

> nul 2>&1
我查看了这里,它说明:
... >nul 2>nul

意思是忽略命令的输出和错误信息。

现在我的问题是如何修改这个命令

 findstr "PreprocessorDefinitions=.*%D_KEYWORD%" %PROJ% > nul 2>&1

展示所有内容,不要忽略错误信息。


2
标准输出被重定向到 nul,而标准错误输出(文件描述符 2)则被发送到标准输出(文件描述符 1),因此所有的错误和正常输出都会被发送到同一个地方。在 Windows 中,nul 是一个空设备,这意味着输出只是被清除了,你看不到它。因此,在这种情况下,所有的输出都被清除了。 - lurker
感谢您澄清这一点。 - MistyD
如果你想在屏幕上看到所有内容,只需删除 > nul 2>&1 - lurker
可能是重复的问题:在shell中,“2>&1”的含义是什么?(https://dev59.com/Z3RA5IYBdhLWcg3wzhXZ) - wesinat0r
1个回答

63

不要使用重定向运算符,">"就是其中之一。

所有程序都有三个流:

  • 标准输入(从控制台输入)
  • 标准输出(一般用于将日志/UI输出到控制台)
  • 标准错误(用于将日志/UI输出到控制台,用于错误消息或其他异常行为)

command >nul

^ 这里是将标准输出流传输到 null。

command 2>nul

^ 这里是将标准错误流传输到 null。

command 2>&1

^ 这里是将标准错误流传输到与标准输出流相同的位置。


19
你说不要用它,但你没有解释为什么。 - MushyPeas
7
">" 实际上是一个重定向运算符;"|" 是管道运算符。 - galaxis
@MushyPeas 同意。非常令人困惑。 - Idanref
@MushyPeas,这是对OP问题的直接回答。例如:如何查看输出?答案是:不要使用重定向运算符。可能措辞可以更好,但它是可以理解的。 - Peter Lieber

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