我刚刚编写了一个简单的记录器,该记录器随时间将消息附加到文件中。现在,我还想将错误添加到该日志文件中,以更好地了解出了什么问题。这是我当前的代码:
#!/bin/bash
logprint() {
echo "$(date +%T): $*" >> ./logfile
}
logdate() {
DATE=`date "+%d.%m.%Y"`
echo "-------------------- ${DATE} --------------------" >> ./logfile
}
日志打印功能接受参数,只需将日期和消息写入日志文件。日志日期功能只是将日期写在开头。
现在,我想将错误输出提供给日志打印功能。最好的方法是什么?
答案 0 :(得分:3)
您可以为此使用> >(cmd)
形式的流程替换技术。这使您可以将输出从标准错误流重定向到该函数。您可以做类似的事情
2> >(logprint)
但是,您无法像从位置参数中读取内容一样,从此过程替换的输出中读取内容,而需要读取的内容就像在读取标准输入内容一样。您可以将功能调整为如下所示。添加了一个用于演示目的的脚本
#!/usr/bin/env bash
logprint() {
args=""
if (( "$#" > 0 )); then
args="$*"
else
while IFS= read -r line; do
args+="$line"
done
fi
echo "$(date +%T): $args" >> ./logfile
}
logprint "foobar"
mv foobar nosuchfile 2> >(logprint)
答案 1 :(得分:0)
如果您需要将时间戳记在同一行中,那么我想到的最简单的方法是用时间戳记部分填充该行(不以换行符结尾),然后重定向错误输出。
echo -n "$(date) " >> error.txt
ls no_such_file_here 2>> error.txt # an error message is generated here
echo "" >> error.txt # add a newline (useful in case an error message is not produced above)
请注意,最后一个echo
是向当前行添加新行字符,因为它保证以后添加的任何内容都不会添加到同一行。
(但是,如果在上面的行中生成错误,则可能会导致空白行。)
更新: 我以为您是指STDERR流。但是,如果不是这种情况,则可以使用相同的想法。