Eu estou supondo que você gostaria de usar essa maneira incomum de marcar o pipe real e tee
no final da mensagem de log porque você não quer ter que canalizar cada echo
Bem, você pode fazer isso também:
logfile='report.txt'
log () {
if [ -z "$1" ]; then
tee -a "$logfile"
else
printf '%s\n' "$@" | tee -a "$logfile"
fi
}
log "some message"
log "some other message"
log "multi" "line" "output"
{
cat <<LETTER
Dear Sir,
It has come to my attention, that a whole slew of things may be
collected and sent to the same destination, just by using a single
pipe. Just use { ... } | destination
Sincerely, $LOGNAME
LETTER
cat <<THE_PS
PS.
Here's the output of "ls -l":
THE_PS
ls -l
echo "LOL"
} | log
Ou seja, coloque o comando awkward tee
em uma função simples do shell cujo nome é fácil de digitar e apenas canalize a saída para ele.
Neste exemplo, a função log
usa printf
para gerar os dados dados em sua linha de comando, ou alterna para a leitura da entrada padrão se estes não forem argumentos de linha de comando.
Você pode até usar
./your_original_script_without_special_logging 2>&1 | log