我有一个 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 -l
iffunction_call
在最后一个换行符之后输出额外的数据多给出一个)。