Forma concisa de enviar para o arquivo se o argumento for dado, para stdout de outra forma

2

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.

    
por Shawn J. Goff 02.07.2012 / 17:44

3 respostas

7

exec pode ser usado para redirecionar o stdout do script atual para outro arquivo.

[ -e "$1" ] && exec > $1
command_with_output
    
por 02.07.2012 / 17:44
2

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

    
por 02.07.2012 / 17:52
0

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}
    
por 02.07.2012 / 17:55