Windows版OpenConnect 8.10重定向stderr到文件为何结果为空?
问题根因
你用的这个Windows版OpenConnect 8.10,会把不同类型的输出拆到两个独立的系统输出通道:
- 短错误提示文本(也就是
No server specified)走 标准错误流(stderr,对应句柄ID 2) - 大段帮助说明文本走 标准输出流(stdout,对应句柄ID 1)
你之前两次重定向的异常,本质是每次只重定向了单个流,没覆盖全部输出通道,再加上cmd的流处理特性触发了程序的缓冲问题,对应你观察到的现象:
- 执行
openconnect.exe 1> openconnect.log时:这条命令只把stdout通道的内容重定向到文件,所以走stdout的全部帮助文本都会写进文件;走stderr的No server specified不受这个规则影响,直接打到屏幕上,和你看到的效果完全一致。 - 执行
openconnect.exe 2> openconnect.log时:这条命令只把stderr通道的内容重定向到文件,所以No server specified不会再出现在屏幕上;走stdout的大段帮助文本不受这个规则影响,直接打到屏幕上。你看到最后文件是空的,是因为这个基于MSYS/Cygwin编译的Windows程序,在单独重定向stderr时,程序退出阶段没有正常刷新内存里的stderr输出缓冲区,本该落盘的内容留在内存中没写到文件里。
正确操作
要把两个通道的全部输出完整写到同一个日志文件,在cmd环境下必须用合并重定向的写法,单独重定向任意单个流都拿不到完整内容:
openconnect.exe > openconnect.log 2>&1
这条命令的执行逻辑是:先把stdout的所有输出重定向到openconnect.log文件,再把stderr的输出指向和stdout同一个目标地址,两个通道的内容都会被完整捕获写进文件,不会出现内容漏接、生成空文件的问题。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

