Bash将标准输出重定向到函数

Bash将标准输出重定向到函数,bash,logging,stdout,Bash,Logging,Stdout,我有两个日志函数: log_msg() { if [ ! -e $LOG_FILE ]; then touch $LOG_FILE chmod 0640 $LOG_FILE fi echo "$(date +'[%Y-%m-%d %T]') $1" >> $LOG_FILE } log_stream() { while read data; do printf "$(date +'[%Y-%m-%d %

我有两个日志函数:

log_msg()
{
    if [ ! -e $LOG_FILE ]; then
        touch $LOG_FILE
        chmod 0640 $LOG_FILE
    fi

    echo "$(date +'[%Y-%m-%d %T]') $1" >> $LOG_FILE
}
log_stream()
{
    while read data; do
        printf "$(date +'[%Y-%m-%d %T]') $data" >> $LOG_FILE
    done
}
要记录消息,请执行以下操作:

log_msg "Hello World!";
为了记录另一个函数的stdout,我尝试执行以下操作:

bgcommand --a --b 2>&1 > log_stream &
但它不起作用

我在这个问题上找到了记录管道的函数:
但是缺少了一些内容。

您正在写入一个名为“log\u stream”的文件。shell没有在那里寻找程序/函数名。试试这个:

bgcommand --a --b 2>&1 | log_stream &
#......................^
或者,重定向到进程替换

bgcommand --a --b 2>&1 > >(log_stream) &

您可能需要查看名为的实用程序,其目的是向其输入添加时间戳。

您正在写入名为“log\u stream”的文件。shell没有在那里寻找程序/函数名。试试这个:

bgcommand --a --b 2>&1 | log_stream &
#......................^
或者,重定向到进程替换

bgcommand --a --b 2>&1 > >(log_stream) &

您可能需要研究一个名为的实用程序,其目的是向其输入添加时间戳。

似乎可以使用“|”。但我决定不使用它,因为这会影响“&”修改器,并且只在后台发送“log_stream”命令,而不是“bgcommand”。您能确认使用“|”不会影响管道中最后一个命令的“&”吗?
&
会将整个管道发送到后台。似乎可以使用“|”。但我决定不使用它,因为这会影响“&”修改器,并且只在后台发送“log_stream”命令,而不是“bgcommand”。您能确认使用“|”不会影响管道中最后一个命令的“&”吗?
&
会将整个管道发送到后台如果您使用
bash
4.2,您可以通过使用
printf%%([%Y-%m-%d%T])T%s\n“$1避免调用
date“
。如果您使用的是
bash
4.2,则可以通过使用
printf%%([%Y-%m-%d%T])T%s\n”“$1”来避免调用
date