首页 > 解决方案 > 如何从程序中收集日志和输出并将它们传递给函数的参数

问题描述

我有一个 shell 脚本,它具有记录语句的功能

#!/bin/sh

Log() {
    echo $1 >> /some/logfile
}

Log "Test logging works"

这很好用!

接下来,我有一个记录语句的程序,如果我想将那里的日志添加到文件中,我可以这样做

SomeProgram >> SomeFile.txt

这也很好用!

但是,如果我想在从同一个 shell 脚本调用时将日志传递SomeProgram到我的函数中怎么办。那可能吗?以下是我尝试过的一些技巧,但没有奏效。LogSomeProgram

Log "SomeProgram >> SomeFile.txt"
Log(SomeProgram >> SomeFile.txt)

问题
那么,如何从程序中收集日志并将它们传递给函数的参数?

环境:
Linux

标签: bashshellshembedded-linux

解决方案


如果这是一次性的情况,我会写一个循环。

SomeProgram | while IFS= read -r line; do
    Log "$line"
done

如果你打算做很多,你可以添加第二种模式到Log它从标准输入而不是它的参数读取的地方。

Log() {
    case $1 in
        --stdin)
            while IFS= read -r line; do Log -- "$line"; done
            return;;

        --)
            shift;;
    esac

    echo "$*" >> /some/logfile
done
SomeProgram | Log --stdin

不要检查 stdin 是否是 tty!这样做会Log()在任何时候以非交互方式调用您的脚本时消耗标准输入。好的脚本在自动化并在管道中使用时表现良好;他们不坚持键盘输入。


推荐阅读