0 votes

comprendre la redirection du shell sur des fichiers non existants

ls > ls.out

cela inclura ls.out dans la liste également. Ce que je comprends, c'est que > (l'opérateur de redirection de la sortie de l'interpréteur de commandes crée d'abord un fichier (pour prendre le STDOUT) s'il n'existe pas déjà, puis la commande ls entre en jeu et inclut le fichier ls.out qui vient d'être créé dans la sortie. Est-ce correct ? Si ce n'est pas le cas, pouvez-vous nous expliquer le fonctionnement de cette commande ?

De même,

wc temp > temp

Imprime 0 0 0 temp dans le fichier temporaire qui vient d'être créé.

Ce comportement de l'obus est intéressant. Je me demande comment il fonctionne réellement. BTW, les deux sont des exercices dans le livre The Unix Programming Environment. Comme j'ai mentionné la réponse ci-dessus, j'aimerais qu'un expert corrige ma compréhension.

6voto

Adam Rosenfield Points 176408

Lorsque vous redirigez la sortie standard avec > le shell crée le fichier (en tant que fichier vide) s'il n'existe pas déjà. De plus, ce fichier est ouvert avant que le shell ne bifurque et n'exécute la commande en cours d'exécution. Lorsque vous faites wc temp > temp l'interpréteur de commandes ouvre le fichier pour l'écriture, puis bifurque et exécute wc en passant sur ses poignées de fichiers ouverts dans le processus.

1voto

Dennis Williamson Points 105818

Simplification à outrance :

ls regarde l'inode (entrée de répertoire) que la redirection a créé.

wc peut voir l'inode que la redirection a créé, mais quand il regarde le contenu, il est vide parce qu'il ( wc ) ne les a pas encore écrites.

Edit :

Tout d'abord, dans les deux cas, la redirection ( >ls.out o >temp ) crée un fichier vide. Une entrée (inode) dans le répertoire est créée pour pointer vers l'emplacement du fichier et contenir des informations à son sujet. Voir l'article de Wikipedia sur inodes .

Ensuite, dans le cas de ls toutes les entrées du répertoire, y compris celui de ls.out qui vient d'être créé 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 nouvelles lignes, les mots et les octets du fichier récemment créé appelé temp qui est vide donc il écrit les comptes zéro dans le fichier après ça compte (rien).

Le contenu des fichiers ( temp o ls.out ) ne sont pas écrits avant que toute la lecture soit faite, ils ne peuvent donc pas avoir été inclus.

Pour un meilleure façon de comparer ce que ls y wc essayez cette commande (lorsque ls.out est inexistante) :

ls -l > ls.out

Vous devriez voir que la taille du fichier pour ls.out est nul selon la liste contenue dans ( cat ls.out ), mais si vous faites ls -l ls.out vous verrez qu'elle n'est pas nulle. Cela correspond à ce que vous voyez se produire avec wc .

0voto

himakiran Points 1

Envisager wc -l temp > temp

Si temp existait déjà et avait disons 20 lignes encore le résultat de cat temp après avoir exécuté la commande ci-dessus, il y aura 0 temp.

Je pense que c'est parce que le shell crée un nouveau vide temp même si temp existait, écrasant ainsi le temp existant et donc lorsque wc essaie de compter le nombre de lignes dans temp il obtient zéro.

En effet > temp est d'abord exécuté par le shell, puis wc -l temp est exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X