Primeiro, você deve evitar que echo
envie dados arbitrários .
Em sistemas diferentes dos baseados em Linux, você pode usar:
logfile=/dev/stdout
Para Linux, isso funciona para alguns tipos de stdout, mas falha quando stdout é um soquete ou pior, se stdout for um arquivo regular, truncaria esse arquivo em vez de gravar na posição atual que o stdout está no arquivo.
Além disso, no shell tipo Bourne, não há como ter o redirecionamento condicional , embora você possa usar eval
:
eval 'printf "%s\n" "$buf" '${logfile:+'> "$logfile"'}
Em vez de uma variável , você poderia usar um descritor de arquivos :
exec 3>&1
[ -z "$logfile" ] || exec 3> "$logfile"
printf '%s\n' "$buf" >&3
Uma desvantagem (pequena) com isso é que, exceto em ksh
, o fd3 seria vazado para todos os comandos executados no script. Com zsh
, você pode fazer sysopen -wu 3 -o cloexec -- "$logfile" || exit
no lugar de exec 3> "$logfile"
, mas bash
não tem equivalente.
Outro idioma comum é usar uma função como:
log() {
if [ -n "$logfile" ]; then
printf '%s\n' "$@" >> "$logfile"
else
printf '%s\n' "$@"
fi
}
log "$buf"