Windows cmd失败命令管道输出问题:重定向stderr后tee无输出
问题分析与解决办法
首先,这不是预期行为,问题根源在于Windows命令提示符(cmd)对错误输出的特殊处理逻辑:
为什么你的命令没生效?
当你输入一个不存在的命令(比如CommandNameWithATypo)时,弹出的错误提示是cmd自身输出的,而不是那个不存在的命令进程产生的stderr。你写的2>&1是试图重定向目标命令的错误输出,但目标命令根本没启动,这个重定向规则对cmd自己的错误输出完全无效——cmd的错误信息不会进入管道,tee接收不到任何输入,自然不会创建文件或输出内容。
解决办法
要让cmd的错误输出被捕获并通过管道传递给tee,你需要把命令放在一个子cmd进程中执行,这样子进程的错误输出就能被正常重定向:
cmd /c "CommandNameWithATypo" 2>&1 | tee test.txt
原理说明
cmd /c "命令":启动一个新的cmd子进程来执行指定命令,子进程会处理“命令不存在”的错误,并将错误输出到它自己的stderr流。2>&1:将子cmd进程的stderr重定向到它的stdout,这样错误信息就会进入管道传递给后续的tee。tee test.txt:此时就能接收到管道传来的内容,同时在屏幕显示信息并写入test.txt文件。
如果需要处理包含空格或特殊字符的复杂命令,只要把整个命令用双引号括起来即可,比如:
cmd /c "echo Test Message & NonExistentCommand" 2>&1 | tee output.txt
内容的提问来源于stack exchange,提问作者SiLiKhon
相关产品推荐
相关产品推荐

