Com o segundo comando
:~$ ls macreave.sh fgvdvg > testo 2>&1
você fará com que a saída stderr de ls
seja gravada no mesmo filedescriptor que stdout ( 2>&1
) e o stdout no arquivo testo
: então você tem um flux único que terminam no seu arquivo.
Com o primeiro comando em vez
ls macreave.sh fgvdvg > testo 2> testo
você está redirecionando independentemente para o mesmo arquivo testo
. O problema são as conexões e os redirecionamentos podem ser assincronos (consulte esta resposta também ); você tem 2 fluxos que terminam no seu arquivo, ambos recriando-o.
Parece que:
- mais rápido foi o stderror (por alguns bytes) que cria um arquivo
testo
(>
) e escreve dentro ls: não é possível - então é chegado o stdout que recria o mesmo arquivo (
>
) apagando o que está dentro e coloca a saída macreave.sh - finalmente é chegada a segunda parte do stderr que escreve no arquivo o que resta cesso fgvdvg: Não existe tal arquivo ou diretório .
Talvez, se você executar novamente, tenha um resultado diferente.
Referências