Shell des redirections

1

Quelqu'un peut-il expliquer ce qui suit?

:~$ 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 

En le faisant de la première façon, il mange les premiers caractères du message d’erreur, la seconde le montre parfaitement. Pourquoi donc?

Yzhang
la source

Réponses:

1

Avec la deuxième commande

:~$ ls macreave.sh fgvdvg > testo 2>&1

vous ferez en sorte que la sortie de stderr lssoit écrite dans le même gestionnaire de fichiers que stdout ( 2>&1) et que stdout dans le fichier testo: vous avez ainsi un flux unique qui se termine dans votre fichier.

Avec la première commande à la place

ls macreave.sh fgvdvg > testo 2> testo

vous redirigez indépendamment vers le même fichier testo. Le problème est que les pipings et les redirections peuvent être asyncronus (voir aussi cette réponse ); vous avez 2 flux qui finissent dans votre fichier en le recréant.

Il paraît que:

  • le plus rapide est le stderror (pour quelques octets) qui crée un file testo( >) et écrit à l'intérieur de ls: ne peut pas
  • puis il est arrivé le stdout qui recrée le même fichier ( >) en effaçant ce qu'il contient et met la sortie macreave.sh
  • enfin, la deuxième partie de stderr est arrivée qui écrit dans le fichier ce qui reste ccess fgvdvg: Aucun fichier ni répertoire de ce type .

Peut-être que si vous exécutez à nouveau, vous obtiendrez un résultat différent.

Références

Hastur
la source