Pourquoi la redirection vers le même fichier tronque-t-elle le fichier?


11

Normalement, nous utilisons un fichier différent pour rediriger la sortie.

Par exemple :

cat < first > temp

Dans cette commande, le contenu de first est redirigé vers temp au lieu de la sortie standard.

Alors pourquoi tronque-t-il le fichier si j'utilise le même nom de fichier?

Pourquoi ne peut-il pas écraser le même fichier?

cat < first > first 

Réponses:


19

Lorsque vous utilisez la redirection d'E / S comme ça, le fichier "entrée" et "sortie" sont ouverts par le shell avant l'exécution de la commande. Et ouvrir un fichier pour l'écraser équivaut à le tronquer avant l'écriture. Le résultat: catvoit un fichier vide en entrée ...


0

Parce que le manipuler dans le cas général serait très compliqué. Prenons l'exemple suivant:

Un programme lit un fichier ligne par ligne et sort chaque ligne deux fois. Maintenant, pour que cela fonctionne sans un deuxième fichier (c'est-à-dire sur le même fichier), le programme devrait mettre en mémoire tampon la plupart (toutes) des lignes qu'il lira, car elles seront écrasées sinon avant de pouvoir être lues.

Pour garder les choses simples, les programmes utilisent généralement un fichier temporaire secondaire qu'ils déplacent sur l'original une fois qu'ils sont terminés. C'est par exemple comment sed -i(en ligne) fonctionne.


0

En règle générale, la syntaxe de redirection dans ce cas devrait être cat first > temp. Cela signifie que catla sortie de firstest envoyée au fichier de temp. Dans le cas de votre instruction cat < first > temp, la sortie catn'est pas terminée au moment où elle est redirigée vers la sortie. Rien dans résulte en rien dehors.

Cependant, catun fichier et la sortie redirigée vers un autre fichier ne sont pas différents d'un fichier de base cp.


cat < first > tempfonctionne très bien.
janvier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.