将输出行数保存到 shell 脚本中的变量而不消耗输出

将输出行数保存到 shell 脚本中的变量而不消耗输出

我有一个 shell 脚本,其中有一个基于另一个调用输出的数字输出行的 if 语句。 (就我而言,做某事有超过 1 行输出)。

LINES=$(function_call | wc -l)
if [ "$LINES" -gt 1 ]
  then
    do_stuff
fi

然而,我想要的不是消耗输出(即仍然让它出现在标准输出中),但仍然让脚本做同样的事情。

答案1

使用tee(这里假设系统支持/dev/fd/<n>):

{ 
  lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ];  then
  do_stuff
fi

在具有奇怪实现的 Linux 上/dev/fd/<n>,如果 stdout 重定向到文件,则输出将被插入在最后即使 stdout 在该文件中的脚本中的当前位置不在末尾(一般来说,这也没关系,因为 stdout 很少会去里面一份文件)。

或者,你可以这样做

{ 
  lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1

或者:

{ 
  lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1

(请注意,根据sed或 的awk实现,它可能比wc -liffunction_call在最后一个换行符之后输出额外的数据多给出一个)。

相关内容