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.