bash - 如何从程序中收集日志和输出并将它们传递给函数的参数
问题描述
我有一个 shell 脚本,它具有记录语句的功能
#!/bin/sh
Log() {
echo $1 >> /some/logfile
}
Log "Test logging works"
这很好用!
接下来,我有一个记录语句的程序,如果我想将那里的日志添加到文件中,我可以这样做
SomeProgram >> SomeFile.txt
这也很好用!
但是,如果我想在从同一个 shell 脚本调用时将日志传递SomeProgram
到我的函数中怎么办。那可能吗?以下是我尝试过的一些技巧,但没有奏效。Log
SomeProgram
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
不要检查 stdin 是否是 tty!这样做会Log()
在任何时候以非交互方式调用您的脚本时消耗标准输入。好的脚本在自动化并在管道中使用时表现良好;他们不坚持键盘输入。
推荐阅读
- lisp - 奇数和偶数之和
- reactjs - 条件中的条件
- php - Composer 诊断:Curl 错误 60 问题,代理问题?
- python - 是否可以从另一个扩展添加 vscode-python linter?
- python - 获取并压缩 txt 文件,然后将内容压缩到最大长度值为 50
- javascript - 如何使用数组 JavaScript 访问对象上的嵌套键?
- assembly - x86-64 在线汇编,带有 IDE,例如 https://www.mycompiler.io/new/asm-x86_64
- xcode - NSLocalizedDescription=模拟器不支持远程通知
- c++ - c++模板方法定义不能识别使用别名
- python - Difference between torch.flatten() and nn.Flatten()