exec
pode ser usado para redirecionar o stdout do script atual para outro arquivo.
[ -e "$1" ] && exec > $1
command_with_output
Eu gostaria que meu script fosse gerado para stdout, a menos que recebesse um nome de arquivo como argumento. Uma maneira óbvia é assim:
if [ -e "$1" ]; then
command_with_output >$1
else
command_with_output
fi
É bem feio e tem repetição, então eu gostaria de uma maneira mais consistente de fazer isso.
Eu tentei o seguinte, mas não funciona.
[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile
Editar:
Isso não muda a relevância das respostas, mas percebi depois que fiz a pergunta que touch "$1" && outfile=$1
é realmente o que eu preciso, em vez de [ -e "$1" ] && outfile=$1
, já que o arquivo pode não existir, e quero ter certeza de que posso escrever para isso ou criá-lo, não apenas que ele existe. Eu não estou mudando a questão porque colocaria as respostas fora de sincronia.
exec
pode ser usado para redirecionar o stdout do script atual para outro arquivo.
[ -e "$1" ] && exec > $1
command_with_output
Outra maneira é usar $1
como o nome do arquivo se foi passado, e /dev/stdout
caso contrário (que é um link simbólico para /proc/self/fd/1
no Linux, e um nó de dispositivo com o mesmo significado em muitas outras variantes unix ). Por exemplo. coloque isso no topo do script:
if [ -e "$1" ]; then
filename=$1
else
filename=/dev/stdout
fi
Em seguida, redirecione a saída de todos os comandos para $filename
Se não precisar de nenhum parâmetro de arquivo, isso também funcionará:
command_with_output > ${1:-/dev/stdout}
edite: Ou melhor ainda, desde que você provavelmente se preocupa com erros também:
command_with_output &> ${1:-/dev/stdout}