如何从脚本内部与标准输出一起记录

如何从脚本内部与标准输出一起记录

我知道我可以使用登录tee

但我想从我的脚本内部登录,同时在stdout.

例如,我的代码如下所示:

    names=$(print("name1 name2 name3 name4"))

    for name in names
    do
       echo "Current Name: " $name 
       related_job= ps -ef | grep $name | awk '{print $9}' >> File.dat
       echo "related job: " $related_job
    done 

现在,这个块肯定会echo在标准输出上,但我什至想将其记录到日志文件中,例如script_name.log.

另外,我通过调度程序调用脚本并起诉我无法使用的约束script_name | tee log_file。我可以通过脚本名称来调用脚本。

有什么办法可以解决这个问题?

答案1

如果您使用bash,您还可以结合 bash 的exec >&, 来重定向脚本的所有输出,并进行进程替换。

例如,在脚本的开头添加类似以下内容:

LOGFILE='/tmp/teelog.log'
savelog "$LOGFILE"
exec &> >(tee "$LOGFILE")

这会将 stdout 和 stderr 重定向到 stdout 和 $LOGFILE,用于savelog在每次运行脚本时轮换并保留较旧的日志(默认为 7)。

答案2

很简单;tee与其选项标志一起使用里面脚本,而不是当您调用脚本时。

在任意行的末尾echo添加| tee -a logfile

> file您还可以使用| tee file将文本发送到标准输出来代替任何重定向。 (这会覆盖文件而不是附加文件,就像> file重定向一样。)

>> mylog.log您可以使用来代替任何重定向| tee -a mylog.log

如果您有很多行涉及输出,我建议在脚本中创建一个简单的函数来替换 echo,它看起来像echo $* | tee -a logfile. (不确定这$*部分;我没有对脚本中的函数做太多工作。)

答案3

tee可能就是你想要的。在脚本的开头添加以下行:

exec 1> >(tee -a logfile)
exec 2>&1

第一行重定向并附加 ( -a) 从标准输出流到的所有内容,logfile并将其打印到屏幕上。第二行将标准错误重定向到标准输出。


也可以使用awk.特别是如果您希望输出到屏幕,但记录了日期:

exec 1> >(awk -W interactive '{"date" | getline d; print $0; print d, $0 >> "logfile"}')
exec 2>&1

awk必须设置为交互式,awk 将无缓冲写入标准输出。如果您愿意,可以通过以下方式将标准错误重定向到不同的内容(可能是另一个日志文件):

exec 2> >(...)

相关内容