qual é a diferença na sintaxe para capturar a saída bash?

2

Eu costumo usar

./aaa.sh 2>&1 | tee -a log

Mas encontrei um novo comando que parece mais fácil:

./aaa.sh &> log

Então, o que eu estou desistindo no segundo caso?

    
por ajax_velu 20.12.2017 / 22:14

2 respostas

7

Maçãs e laranjas. Mas primeiro ...

Em relação a 2>&1 vs &> , ambos agem para direcionar stderr para o mesmo local que stdout está sendo direcionado.

Mas você está dando a portabilidade com o segundo, já que ele não é compatível com POSIX e qualquer script que o utilize só funcionará com os shells que o suportam.

Dito isto, eles são "semanticamente equivalentes", como descrito na página man do Bash ...

There are two formats for redirecting standard output and standard error:

      &>word    and
      >&word

Of the two forms, the first is preferred. This is semantically equivalent to

      >word 2>&1

When using the second form, word may not expand to a number or -. If it does, other redirection operators apply (see Duplicating File Descriptors below) for compatibility reasons.

No entanto, há mais do que isso. Você também está usando o comando tee , que adiciona funcionalidades adicionais à primeira versão. Ele terá sua entrada stdin e direcionará para dois lugares diferentes: stdout (normalmente sua tela / terminal se você estiver executando isso interativamente) e o arquivo especificado que terá os dados acrescentados a ele ( -a diz para anexar em vez de sobrescrever).

Compare isso com a segunda versão em que o stdout e o stderr substituem o arquivo log e não são exibidos em sua tela / terminal.

Conclusão: Como mencionado no início, estes são realmente dois comandos diferentes, mas, estendendo a noção de equivalência, em geral a primeira versão é superior, pois é portátil e você obtém o benefício de ver a saída de aaa.sh mesmo enquanto está sendo salvo em um arquivo. Claro, se você não quer ver isso ou você quer apagar o conteúdo do arquivo anterior, então é uma história diferente. Maçãs e laranjas.

    
por 20.12.2017 / 22:19
4

Duas coisas:

  • tee imprime sua entrada para o arquivo nomeado, e a saída padrão, na prática, para o seu terminal. Um redirecionamento direto como > ou &> faz com que o arquivo seja gravado.

  • tee -a acrescenta ao arquivo nomeado, um redirecionamento > ou &> substitui-o. Use >> ou &>> ou >> file 2>&1 para acrescentar com um redirecionamento.

por 20.12.2017 / 22:21