Acho que você precisa usar um descritor de arquivo adicional e tee
the stdout
stream para que o fluxo stdout
duplicado possa ser redirecionado para um arquivo de log. Desta forma, o fluxo normal stdout
via /proc/$$/fd/1
é deixado inalterado. E se grep
falhar em corresponder a uma linha, você deverá ter toda a saída de comando que o grep consumiu disponível em seu arquivo de log para fins de depuração.
useful="$(
exec 3<&1 3>stdout.log
curl -s http://example.com/some/data | tee /proc/$$/fd/3 | grep 'useful line'
exec 3<&-
)"
echo "useful=$useful"
# test case
(
# dup stdout using tee & an additional file descriptor
# open fd 3 for reading from where fd 1 is pointing to (i.e. stdout)
# anything that is being redirected to fd 3 will be redirected to stdout.log
#exec 3<&1 3>stdout.log
exec 3<&1 3> >(tr '[:lower:]' '[:upper:]' > stdout.log)
echo -e "one\ntwo" | tee /dev/fd/3 | grep one # Mac OS X
#echo -e "one\ntwo" | tee /proc/$$/fd/3 | grep one # Linux
exec 3<&-
)
Outra abordagem pode ser usar pipes nomeados ou
Co-Processos Bash (disponível no Bash 4.0 e acima).
Para obter mais informações sobre os descritores de arquivos, consulte: Descritor de Arquivo 101