【问题标题】:Bash redirect stdout to functionBash 将标准输出重定向到函数
【发布时间】:2015-10-21 23:30:00
【问题描述】:

我有 2 个日志函数:

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!";

为了记录我尝试做的另一个函数的标准输出:

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

但它不起作用。

我在这个问题上找到了记录管道的功能: Pipe output to bash function 但是缺少一些东西。

【问题讨论】:

  • 如果你使用bash 4.2,你可以避免使用printf '%([%Y-%m-%d %T])T %s\n" "$1"调用date

标签: bash logging stdout


【解决方案1】:

您正在写入一个名为“log_stream”的文件。 shell 不在那里寻找程序/函数名称。试试这个:

bgcommand --a --b 2>&1 | log_stream &
#......................^

或者,重定向到进程替换

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

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

【讨论】:

  • 似乎可以使用“|”。但我决定不使用它,因为这会影响“&”修饰符,并且只在后台发送“log_stream”命令而不是“bgcommand”。你能确认使用“|”吗不会只影响管道中最后一个命令的“&”吗?
  • & 会将整个管道发送到后台
猜你喜欢
  • 1970-01-01
  • 2013-07-31
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多