无需使用tee:将命令输出同时重定向至终端和文件并保留输入功能
不用tee实现交互式命令的输出分流(终端显示+日志追加)
因为目标应用与tee配合时输入处理异常,我们可以用纯shell重定向语法实现需求,确保应用的输入交互不受影响,同时支持日志追加:
核心方案(无外部依赖,仅用shell内置功能)
command > >(cat >> foo.log) 2> >(cat >> foo.log >&2)
方案说明
>(cat >> foo.log):利用shell的进程替换创建匿名管道,将命令的标准输出(stdout)传递给cat进程,cat会把内容追加写入foo.log,同时默认输出到当前终端。2> >(cat >> foo.log >&2):对标准错误(stderr)做同样处理,确保错误信息同时记录到日志并显示在终端,>&2保证错误信息输出到终端的stderr通道,保留原输出格式/颜色。- 全程未使用管道
|,目标应用的标准输入(stdin)直接连接当前终端,完全保留原有输入交互能力。
进阶:临时全局重定向(适用于多命令场景)
如果需要连续执行多个命令都实现输出分流,可通过exec设置全局重定向,之后恢复:
# 保存当前终端的stdout/stderr到文件描述符3/4 exec 3>&1 4>&2 # 将后续所有命令的stdout/stderr同时追加到日志并输出到终端 exec 1> >(cat >> foo.log) 2> >(cat >> foo.log >&2) # 执行你的命令 command1 command2 # 恢复原有的stdout/stderr exec 1>&3 2>&4 3>&- 4>&-
替代方案(适配需检测TTY的应用)
如果目标应用需要识别真实TTY终端(进程替换的管道可能被判定为非TTY),可直接将输出指向当前终端设备:
# 获取当前终端路径 TTY=$(tty) # 同时输出到日志和终端 command > >(cat >> foo.log > "$TTY") 2> >(cat >> foo.log > "$TTY")
内容的提问来源于stack exchange,提问作者T. Smith
相关产品推荐
相关产品推荐

