我在Windows CMD.EXE
环境中工作,想更改stdout
的输出以匹配stderr
的输出,以便我可以在没有文件中介的情况下将错误消息传递给其他程序。
我知道2>&1
表示法,但是它将stdout
和stderr
组合到一个流中。
我在想的是这样的:
program.exe 2>&1 | find " "
但这结合了stdout和stderr,就像:
program.exe | find " " 2>&1
我意识到我可以...
program 2>file
type file | find " "
del file
但这不具有
program | find " "
这种表示法的灵活性和功能。为此,必须先完成program
的输出,然后才能处理该输出。 最佳答案
有趣的问题:-)
CMD处理从左到右的重定向。您想要先将2(stderr)重定向到&1(stdout),然后将1(stdout)重定向到其他内容。此时,stderr仍将重定向到stdout的先前定义。该管道仍将使用旧的stdout定义(现在包含stderr)工作。
如果您不关心stdout,则可以重定向到nul
program.exe 2>&1 1>nul | find " "
如果要将stdout捕获到文件,请重定向到文件
program.exe 2>&1 1>yourFile | find " "
如果您仍然想在控制台上看到stdout,但只想将stderr传递给FIND,则可以将1重定向到con:
program.exe 2>&1 1>con: | find " "
请注意,stdout和con:的原始定义之间有细微的差别。例如,
cls >con:
不会清除屏幕,而是将有趣的字符打印到屏幕上。如果使用第3个(最初未使用的)文件句柄,则可以真正交换stdout和stderr。 1和3将包含stderr的原始定义,而2将包含stdout的原始定义。
program.exe 3>&2 2>&1 1>&3 | find " "
实际上,每次执行重定向时都会定义一个附加的文件句柄。原始定义保存在第一个可用的未使用文件句柄中。假设在发出上述命令之前没有任何重定向。
3>&2
不会保存3的原始定义,因为先前未定义3。但是2>&1
将stderr的原始定义保存为4(已使用3),而1>&2
将stdout的原始定义保存为5。因此,从技术上讲,交换stderr和stdout不需要显式重定向3
program.exe 2>&1 1>&3 | find " "
2>&1
将stderr保存在3中,并将2重定向到&1(stdout)。 1>&3
将stdout保存为4,并将1重定向到&3(stderr)。但是,只有当您确定在发出命令之前尚未定义3时,以上内容才能正常工作。如我之前的代码示例中那样显式定义3更为安全。
请参阅Why doesn't my stderr redirection end after command finishes? And how do I fix it?,了解一些真正的带有重定向的冒险过程:-)
关于windows - 有没有一种方法可以仅将stderr重定向到stdout(不将两者结合在一起),以便可以将其通过管道传输到其他程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12273866/