Use tee
(aqui assumindo um sistema com suporte para /dev/fd/<n>
):
{
lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ]; then
do_stuff
fi
No Linux que tem uma implementação ímpar de /dev/fd/<n>
, se o stdout for redirecionado para um arquivo, a saída será inserida no final desse arquivo, mesmo se a posição atual do stdout no arquivo O script nesse arquivo não está no final (em geral, isso seria OK, já que é raro que o stdout esteja dentro de um arquivo).
Alternativamente, você poderia fazer
{
lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1
Ou:
{
lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1
(lembre-se de que, dependendo da implementação de sed
ou awk
, ele pode fornecer mais de wc -l
se function_call
fornecer dados extras após o último caractere de nova linha).