bash - 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

标签 bash logging shell

我有一个脚本,非技术用户可以交互运行。该脚本将状态更新写入 STDOUT,以便用户可以确定该脚本运行正常。

我希望 STDOUT 和 STDERR 都重定向到终端(以便用户可以看到脚本正在运行以及是否存在问题)。我还希望两个流都重定向到一个日志文件。

我在网上看到了很多解决方案。有些不起作用,有些则非常复杂。我已经开发出一个可行的解决方案(我将作为答案输入),但它很笨拙。

完美的解决方案是将一行代码合并到任何脚本的开头,将两个流发送到终端和日志文件。

编辑: 将 STDERR 重定向到 STDOUT 并将结果通过管道传输到 tee 是可行的,但这取决于用户是否记得重定向和通过管道传输输出。我希望日志记录是万无一失的和自动的(这就是为什么我希望能够将解决方案嵌入到脚本本身中。)

最佳答案

使用“tee”重定向到文件和屏幕。根据您使用的 shell,您首先必须使用

将 stderr 重定向到 stdout
./a.out 2>&1 | tee output

./a.out |& tee output

在 csh 中,有一个称为“脚本”的内置命令,它会将进入屏幕的所有内容捕获到一个文件中。您可以通过键入“script”启动它,然后执行您想要捕获的任何内容,然后按 control-D 关闭脚本文件。我不知道 sh/bash/ksh 的等价物。

此外,由于您已经指出这些是您可以修改的自己的 sh 脚本,因此您可以通过用大括号或方括号括起整个脚本来在内部进行重定向,例如

#!/bin/sh
{
    ... whatever you had in your script before
} 2>&1 | tee output.file

关于bash - 如何让 STDOUT 和 STDERR 都转到终端和日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/363223/

相关文章:

ruby-on-rails - 有没有办法自动将用户添加到gitlab?

Bash 别名和点文件

c# - 寻找一个好的 C# 异常记录工具

linux - tr "[1-9]" "[' 0 1'-' 0 9']"无法正常工作

linux - 为什么在先前的命令在Linux中完成之前执行此Shell命令?

linux - bash 引用通过管道传入的参数/变量

bash - 如何增加 travis CI 中的无事件等待时间?

java - 将日志写入文件 java.util.logging.Logger

java - 用于调试和错误的不同 log4j 布局?

最后添加一个新列的 shell 脚本