我有一些带有 STDOUT 和 STDERR 输出的脚本。默认情况下,STDOUT 和 STDERR 都会转到控制台:
./script.sh
我可以将 STDOUT 重定向到文件,将 STDERR 输出保留在控制台中:
./script.sh > log.txt
我可以将 STDOUT + STDERR 重定向到同一文件,但控制台中没有输出:
./script.sh > log.txt 2>&1
我可以同时在控制台和日志文件中包含 STDOUT 和 STDERR:
./script.sh 2>&1 | tee -a log.txt
我不想看到 STDOUT,但我想看到 STDERR,并且我必须将所有内容保存在日志文件中。我怎么可能在控制台+日志文件中包含STDERR,而仅在日志文件中包含STDOUT?像(伪代码,不起作用)之类的东西:
./script.sh > log.txt 2 > /dev/tty | tee -a log.txt
您必须将 STDERR 和 STDOUT附加到文件中。否则,另一个流会覆盖另一个流。
在哪里:
>> log.txt
将 STDOUT 附加到log.txt
.2> >
发送 STDERR 来处理(tee -a log.txt >&2)
。tee -a log.txt
log.txt
将其拆分为以append( ) 模式的文件-a
和>&2
.>&2
其放回 STDERR。注意事项
由于附加,如果您运行两次,您将在文件中获得两次输出 - 我认为这是目标,因为它是一个日志文件。如果您只想在日志文件中包含最新的运行,则必须先清空它,例如,
这些行不会按时间顺序出现,因为
>>
工作得更快一些tee -a
。因为后者必须派生另一个进程,所以 STDERR 的输出会延迟到达文件。如果正确的顺序至关重要,则无法使用此解决方案。