追加文本到stderr在bash
现在我使用EXEC标准错误重定向到一个错误日志追加文本到stderr在bash
exec 2>> ${errorLog}
唯一的缺点就是重定向,我要开始一个时间戳每次运行以来高管只是推文本直接进入日志文件。有没有办法重定向stderr,但允许我附加文本,如时间戳?
这非常有趣。我问,谁知道庆典相当不错一个人,他告诉我这样说:
foo() { while IFS='' read -r line; do echo "$(date) $line" >> file.txt; done; };
首先,创建了一个函数读取从标准输入原始输入的一行,而分配给IFS使得它doesn”不要忽视空白。读完一行后,它会输出预先输入的适当数据。然后,你必须告诉bash重定向标准错误信息到该功能:你写到标准错误
exec 2> >(foo)
现在一切都将通过foo的功能。注意当你在一个交互式shell中做这件事时,你将不会再看到提示,因为它被打印到stderr,并且在foo中的读取是行缓冲的:)
我只是在寻找相同的小东西。看到这个帖子后,我看到了另一个办法,看起来很有希望,太:http://utcc.utoronto.ca/~cks/space/blog/unix/PipingJustStderr
你可以简单的只使用:
exec 1> >(sed "s/^/$(date '+[%F %T]'): /" | tee -a ${LOGFILE}) 2>&1
这并不能彻底解决您就提示未显示(ITT会后显示问题很短的时间,但不是实时的,因为管道会缓存一些数据......),但是会在标准输出和文件中显示1:1的输出。
唯一的问题是,我没能解决,就是从一个功能做到这一点,因为这将打开一个子shell,其中EXEC是无用的主程序...
cat q23123 2> tmp_file ;cat tmp_file | sed -e "s/^/$(date '+[%F %T]'): /g" >> output.log; rm -f tmp_file
这示例重定向标准输出和标准错误而不丢失原始标准输出和标准错误。 stdout处理程序中的错误也会记录到stderr处理程序中。文件描述符保存在变量中并在子进程中关闭。 Bash保重,没有碰撞发生。
#! /bin/bash
stamp()
{
local LINE
while IFS='' read -r LINE; do
echo "$(date '+%Y-%m-%d %H:%M:%S,%N %z') $$ $LINE"
done
}
exec {STDOUT}>&1
exec {STDERR}>&2
exec 2> >(exec {STDOUT}>&-; exec {STDERR}>&-; exec &>> stderr.log; stamp)
exec > >(exec {STDOUT}>&-; exec {STDERR}>&-; exec >> stdout.log; stamp)
for n in $(seq 3); do
echo loop $n >&$STDOUT
echo o$n
echo e$n >&2
done
这需要电流击版本,但由于Shellshock一个可以依靠这个时下。
$ foo(){while IFS =''read -r line;做echo“$(date)$ line”>> file.txt;完成; }; $ exec 2 >>(foo) 警告:程序'/ bin/bash'崩溃。 哎呦 – Peter 2012-04-19 11:56:12
但如果我改变:echo 2 |发球>(foo),那么它工作正常。 – Peter 2012-04-19 11:57:44