我知道我可以使用登录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> >(...)