comprendre la redirection de shell sur des fichiers non existants
-
07-07-2019 - |
Question
ls > ls.out
Ceci inclura également ls.out dans la liste. Ma compréhension est la suivante: > (L'opérateur de redirection de sortie du shell crée d'abord un fichier (pour prendre le STDOUT) s'il n'existe pas déjà et que la commande ls commence à jouer et qu'elle inclut le fichier ls.out qui vient d'être créé dans la sortie. Est-ce correct? Sinon, pouvez-vous préciser le fonctionnement de cette commande?
De même
wc temp > temp
Imprimera 0 0 0 temp dans le fichier temporaire que vous venez de créer.
Ce comportement de shell est intéressant. Je me demande comment cela fonctionne réellement. BTW, les deux sont des exercices dans le livre Unix Programming Environment. Comme j'ai mentionné la réponse ci-dessus, je veux qu'un expert corrige ma compréhension.
La solution
Lors de la redirection de la sortie standard avec >
, le shell créera le fichier (sous forme de fichier vide) s'il n'existe pas déjà. En outre, ce fichier est ouvert avant que le shell n’exporte et n’exécute la commande en cours d’exécution. Quand vous faites wc temp > temp
, le shell ouvre le fichier en écriture, puis forks and execs wc
, en transmettant ses handles de fichiers ouverts au cours du processus.
Autres conseils
Simplification excessive:
ls
examine l'inode (entrée de répertoire) créé par la redirection.
wc
peut voir l'inode créé par la redirection, mais lorsqu'il regarde le contenu, il est vide car il ( wc
) ne les a pas encore écrites.
Modifier:
Tout d'abord, dans les deux cas, la redirection ( > ls.out
ou > temp
) crée un fichier vide. Une entrée (inode) dans le répertoire est faite pour pointer vers l'emplacement du fichier et contenir des informations à ce sujet. Voir l'article Wikipedia sur inodes .
Ensuite, dans le cas de ls
, toutes les entrées du répertoire , y compris celle de ls.out
qui vient d'être créée , sont lus et écrits dans stdout
(qui dans ce cas devient le contenu de ls.out
).
Ou, dans le cas de wc
, il compte les comptes de nouvelles lignes, de mots et d'octets du fichier récemment créé appelé temp
qui est vide ainsi, il écrit les comptes zéro dans le fichier après , il compte (rien).
Le contenu des fichiers ( temp
ou ls.out
) n'est pas écrit avant la fin de la lecture et n'a donc pas pu être inclus.
Pour mieux comparer ce que font ls
et wc
, essayez cette commande (lorsque ls.out
n'existe pas):
ls -l > ls.out
Vous devriez voir que la taille du fichier pour ls.out
est zéro selon la liste contenue à l'intérieur ( cat ls.out
), mais si vous le faites ls -l ls.out
, vous verrez que ce n'est pas zéro. Cela correspond à ce que vous voyez se produire avec wc
.
considérez wc -l temp > temp
Si temp
existait déjà et qu'il restait 20 lignes, résultat de cat temp
après l'exécution de la commande ci-dessus, le résultat serait 0 temp.
Je pense que cela est dû au fait que le shell crée un nouveau temp
vide même si temp
existait, écrasant ainsi le temp existant et, par conséquent, lorsque wc
essayant pour compter le nombre de lignes dans temp
, il est égal à zéro.
En effet > temp
est d'abord exécuté par le shell, puis wc -l temp
est exécuté.