如何实现错误输出重定向不覆盖文件并同步打印内容
问题修正方案
你当前使用的命令存在几处不符合需求的问题:
tee命令默认以覆盖模式写入文件,会清空output.log原有内容,不符合不覆盖旧内容的要求- 命令缺少执行完成后打印
output.log全量内容的逻辑 - 重定向逻辑如果仅需收集错误信息的话存在错误,会把正常输出也一并写入日志
仅保存命令错误信息的正确命令
如果需求是只把命令运行产生的错误信息存入日志,正常输出不写入,执行以下命令:
script ./src/ 2>&1 >/dev/null | tee -a output.log && cat output.log
各部分作用:
>/dev/null:将命令正常的标准输出直接丢弃,不进入后续传输链路2>&1:把标准错误流重定向到标准输出通道,错误信息会通过管道传给后续命令tee -a output.log:-a是追加写入参数,会把收到的错误信息追加到output.log末尾,不会覆盖原有内容,同时会把接收到的内容实时打印到终端&& cat output.log:等前面的命令执行完毕、所有内容写入日志后,打印output.log的全部内容
保存命令全部输出(含正常输出+错误)的正确命令
如果实际需要把命令的所有输出(正常运行输出+报错信息)都存入日志,执行以下命令:
script ./src/ 2>&1 | tee -a output.log && cat output.log
各部分作用:
2>&1:将标准错误流合并到标准输出流,所有运行输出都会通过管道传输tee -a output.log:追加写入所有内容到output.log,同时实时在终端打印输出&& cat output.log:命令执行完成、日志写入结束后,打印output.log全量内容
补充说明:
script命令默认会把终端会话内容录制到后面跟的文件路径参数里,如果你的./src/是要执行的目标路径而非录制保存文件,需要加-c参数指定要执行的命令,比如script -c "ls ./src/" 2>&1 | tee -a output.log && cat output.log,这部分可以根据你实际要执行的操作调整。
内容的提问来源于stack exchange,提问作者chillin
相关产品推荐
相关产品推荐

