Cygwin中/dev/stdout异常,如何让脚本无参数时输出到stdout?
Cygwin下zsh脚本实现动态输出目标的解决方案
你的问题核心是Cygwin环境中,/dev/stdout在zsh的重定向处理中会被当作普通文件创建,而非指向进程的标准输出。可以通过以下两种方式解决:
方法一:使用/dev/fd/1替代/dev/stdout
直接修改outfile的赋值语句,用Cygwin中可靠的文件描述符路径:
outfile=${1:-/dev/fd/1} : > "$outfile" # 确保文件存在且为空(无参数时此操作不影响stdout) # 后续命令保持原重定向逻辑 command_x >> "$outfile" command_y >> "$outfile"
/dev/fd/1是Cygwin中直接指向当前进程标准输出的文件描述符入口,zsh会正确识别为输出流而非普通文件,不会创建额外文件。
方法二:用exec统一重定向脚本输出
如果不想每个命令都写重定向,可以在脚本开头通过exec一次性配置输出目标,更简洁:
if [[ -n "$1" ]]; then # 有参数时,清空目标文件并将后续所有输出追加到该文件 exec > "$1" else # 无参数时,保持输出到标准输出 exec >&1 fi # 后续命令直接输出即可,无需额外重定向 command_x command_y
这种方式会修改整个脚本的标准输出指向,后续所有命令的输出都会自动流向目标文件或终端。
测试验证
用你的测试用例验证:
echo x > /dev/fd/1
执行后会直接在终端输出x,不会创建/dev/stdout文件。
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

