将标准错误流输出传递给函数

时间:2019-05-07 07:58:38

标签: linux bash

我刚刚编写了一个简单的记录器,该记录器随时间将消息附加到文件中。现在,我还想将错误添加到该日志文件中,以更好地了解出了什么问题。这是我当前的代码:

#!/bin/bash

logprint() {
echo "$(date +%T): $*" >> ./logfile
}

logdate() {
DATE=`date "+%d.%m.%Y"`
echo "-------------------- ${DATE} --------------------" >> ./logfile
}

日志打印功能接受参数,只需将日期和消息写入日志文件。日志日期功能只是将日期写在开头。

现在,我想将错误输出提供给日志打印功能。最好的方法是什么?

2 个答案:

答案 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流。但是,如果不是这种情况,则可以使用相同的想法。