Ao avaliar o comando, o redirecionamento > é resolvido primeiro: assim, no momento em que ls for executado, o arquivo de saída já foi criado.
Esta é também a razão pela qual ler e gravar no mesmo arquivo usando um redirecionamento > dentro do mesmo comando trunca o arquivo; no momento em que o comando é executado, o arquivo já foi truncado:
$ echo foo >bar
$ cat bar
foo
$ <bar cat >bar
$ cat bar
$
Truques para evitar isso:
-
<<<"$(ls)" > ls.out(funciona para qualquer comando que precise ser executado antes que o redirecionamento seja resolvido)A substituição do comando é executada antes de o comando externo ser avaliado, portanto,
lsé executado antes de ols.outser criado:$ ls bar foo $ <<<"$(ls)" > ls.out $ cat ls.out bar foo
-
ls | sponge ls.out(funciona para qualquer comando que precise ser executado antes que o redirecionamento seja resolvido)spongegrava no arquivo somente quando o restante do pipe termina a execução, portantolsé executado antes da criação dols.out(spongeé fornecido com o pacotemoreutils):$ ls bar foo $ ls | sponge ls.out $ cat ls.out bar foo
-
ls * > ls.out(funciona para o caso específico dels > ls.out)A expansão de nome de arquivo é executada antes que o redirecionamento seja resolvido, portanto
lsserá executado em seus argumentos, que não conterãols.out:$ ls bar foo $ ls * > ls.out $ cat ls.out bar foo $
Por que os redirecionamentos são resolvidos antes do programa / script / o que quer que seja executado, não vejo uma razão específica para que seja obrigatório , mas vejo dois motivos pelos quais ele é melhor para fazer isso:
-
não redireciona STDIN de antemão faria o programa / script / o que quer que seja mantido até STDIN ser redirecionado;
-
não redirecionar o STDOUT de antemão deve necessariamente fazer com que o buffer do shell seja o resultado do programa / script / whatever, até que o STDOUT seja redirecionado;
Portanto, uma perda de tempo no primeiro caso e uma perda de tempo e memória no segundo caso.
Isso é o que ocorre comigo, não estou afirmando que essas são as razões reais; mas acho que, apesar de tudo, se alguém tivesse uma escolha, eles iriam redirecionar antes de qualquer maneira pelas razões acima mencionadas.