Bash:捕获命令的输出并有条件地处理它

时间:2017-01-28 21:11:03

标签: bash

是否有更好的方法来处理以下有条件处理输出的标准方式?

output="$(program | grep -E 'some text')"
if [ ! -z "$output" ]; then
    echo "$output" | mail -s 'captured output' to
fi

我正在考虑明显错误的事情

program | grep -E 'some text' | { [[ $? == 0 ]] && mail -s 'captured output' to; }

3 个答案:

答案 0 :(得分:2)

有一种方法可以在不必捕获输出的情况下完成。在某些情况下(即巨大的输出),这可能是更可取的。像这样的东西,可以很容易地重复使用:

execute_on_input()
{
  local c=
  local r=0
  IFS= read -r -n 1 c  || r=$?
  [[ "$c" ]] || return 0
  { echo -n "$c" ; [[ $r != 0 ]] || cat ; } | "$@"
}


program | grep -E 'some text' | execute_on_input mail -s 'captured output'

该函数检查它是否可以读取某些东西,如果它不能退出而不启动位置参数(“$ @”)中传递的命令。如果找到输出,则通过管道传递给位置参数中接收的命令(首先读取第一个字符,然后使用cat读取未使用第一个read读取的输出的其余部分)。

答案 1 :(得分:1)

grep的退出状态会告诉您是否匹配。

if output=$(program | grep -E 'some text'); then
    printf '%s' "$output" | mail -s 'captured output' to
fi

但是,mail(至少我正在查看的版本)有一个选项-E,可防止发送空消息,从而无需进行检查。

program | grep -E 'some text' | mail -E -s 'captured output' to

答案 2 :(得分:0)

您可以将if [ ! -z "$output" ]替换为if [ -n "$output" ](或if [ -n "${output}" ])。其他可能性也会这样做,为什么要让它更难阅读呢? 明确使用test将显示您正在做的事情:

test -n "${output}" && echo "output filled"