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.out
ser 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)sponge
grava 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
ls
será 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.