Unix: sortir un fichier pour lui-même – pourquoi cela vide-t-il le fichier?

Quelqu’un peut-il m’expliquer pourquoi ce code fonctionne (c.-à-d. File2.txt est le contenu sortingé par ordre alphabétique de fichier1.txt):

cat file1.txt | sort > file2.txt 

Mais quand je fais cela, file1.txt se vide …?

 cat file1.txt | sort > file1.txt 

Comme vous pouvez le deviner, j’essaie simplement de sortinger le contenu d’un fichier par ordre alphabétique, puis d’écrire dans le même fichier …

(J’utilise le terminal mac 10.8.3. La date de rédaction est le 19mai2013)

Le shell commence à sort après l’ouverture de file1.txt pour la sortie (la tronquer, c’est-à-dire supprimer toutes les données). Ensuite, il lance cat avec file1.txt ouvert pour la lecture. La sémantique du shell est telle qu’il est possible que le pipeline obtienne une page de données à partir de file.txt , mais pratiquement tous les shells (ce qui revient à dire tous, mais il y a peut-être des shells Je n’ai jamais utilisé ce qui ne se comporte pas de cette façon) tronquera le fichier avant que cat ne lise jamais des données.

Pour effectuer cette opération, vous devez utiliser un fichier temporaire. (Eh bien, il n’est pas obligatoire d’utiliser un fichier temporaire. Si le fichier est suffisamment petit, quelque chose comme ça fonctionnera probablement avec cat file1.txt | ( sleep 2; sort > file1.txt ) , mais n’est pas garanti.)