Shell de redirecionamentos

1

Alguém pode explicar o seguinte?

:~$ ls macreave.sh fgvdvg > testo 2> testo
:~$ cat testo 
macreave.sh 
ccess fgvdvg: No such file or directory 

:~$ ls macreave.sh fgvdvg > testo 2>&1
:~$ cat testo 
ls: cannot access fgvdvg: No such file or directory 
macreave.sh 

Fazendo isso da primeira maneira que ele come os primeiros caracteres da mensagem de erro, a segunda maneira mostra isso muito bem. Por que é que?

    
por Yzhang 07.07.2015 / 12:54

1 resposta

1

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

por 07.07.2015 / 19:48