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.

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top