Avec la deuxième commande
:~$ ls macreave.sh fgvdvg > testo 2>&1
vous ferez en sorte que la sortie de stderr ls
soit é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