bash - 如何收集程序的日志和输出并将它们传递给函数的参数

标签 bash shell sh embedded-linux

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

#!/bin/sh

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

Log "Test logging works"

效果很好!

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

SomeProgram >> SomeFile.txt

这也很好用!

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

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

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

环境:
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

不要check if stdin is a tty !这样做会导致 Log() 在任何时候以非交互方式调用脚本时使用 stdin。好的脚本在自动化和在管道中使用时表现良好;他们不坚持键盘输入。

关于bash - 如何收集程序的日志和输出并将它们传递给函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56834213/

相关文章:

python - 查找python脚本所需的模块

php - 通过 Bash 的 Mysql View 转储

java - 如何使用 docker 运行 shell 脚本和 java 应用程序?

linux - 如何 cat <<EOF >> 包含代码的文件?

python - 如何在 bash 中的一周中的特定一天只运行一次 python 脚本

bash - 如何在 Bash 中定义哈希表?

bash - 递归列出子目录

linux - 找到一个模式并修改下一行,而不修改文件中的其他内容。最好是基于 Linux 的命令(sed、awk 等)

bash - 为ssh获取短路

linux - 从 SH 运行命令