2009-09-16 4 views
0
ls > ls.out 

Ceci inclut aussi ls.out dans la liste. Ma compréhension est la suivante:> (l'opérateur de redirection de sortie shell crée d'abord un fichier (pour prendre le STDOUT) s'il n'est pas déjà existant et ensuite la commande ls vient jouer et il inclut le fichier ls.out juste créé dans la sortie . Est-ce exact? Sinon, pouvez-vous s'il vous plaît expliquer le fonctionnement de cette commande.Compréhension de la redirection du shell sur des fichiers non existants

de même

wc temp > temp 

imprimera 0 0 0 température à l'intérieur du fichier temporaire vient d'être créé.

ce comportement Je me demande comment cela fonctionne réellement. dans le livre Unix Programming Environment. Comme je l'ai mentionné la réponse ci-dessus, je veux qu'un expert corrige ma compréhension.

+0

Intéressant, peut-être. Surprenant, non. L'exemple wc temp> temp demande à wc de décrire un fichier que vous n'avez pas encore créé. Que va-t-il dire d'autre? – pavium

+0

@pavium - Le problème est que, si 'temp' existait déjà, et que vous vous êtes trompé et que vous avez tenté d'obtenir des statistiques, vous l'écraserez accidentellement et vous n'aurez donc aucune statistique. –

+0

@pavium: Essayez ces deux et voyez la différence. wc temp et wc temp> temp Dans les deux cas, la température ne doit pas déjà exister. –

Répondre

6

Lors de la redirection de la sortie standard avec >, le shell créera le fichier (en tant que fichier vide) s'il n'existe pas déjà. De plus, ce fichier est ouvert avant le shell et exécute la commande en cours d'exécution. Lorsque vous faites wc temp > temp, le shell ouvre le fichier pour l'écriture, puis forks et exécute wc, en passant ses poignées de fichier ouvertes dans le processus.

+0

Merci pour l'explication. –

1

simplification excessive:

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

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

Edit:

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 à son sujet. Voir l'article Wikipedia sur inodes.

Ensuite, dans le cas de ls, toutes les entrées dans le répertoire, y compris celui de ls.out qui vient d'être créé, sont lues et écrites stdout (qui dans ce cas est le contenu de ls.out).

Ou, dans le cas de wc, qu'il compte le saut de ligne, mot et le nombre d'octets du fichier créé récemment appelé tempqui est vide il écrit le zéro compte dans le fichier après il compte (rien) .

Le contenu des fichiers (temp ou ls.out) n'est pas écrit tant que la lecture n'a pas été terminée et qu'ils n'ont donc pas pu être inclus.

Pour une meilleure façon de comparer ce ls et wc font, essayez cette commande (quand ls.out est inexistante):

ls -l > ls.out 

Vous devriez voir que la taille du fichier pour ls.out est égal à zéro selon à la liste contenue à l'intérieur (cat ls.out), mais si vous faites ls -l ls.out, vous verrez que ce n'est pas zéro. Cela correspond à ce que vous voyez se produire avec wc.

+0

Une autre explication pourrait aider, Dennis. –

+0

Merci pour l'explication. –

0

considèrent wc -l temp > temp

Si temp existait déjà et avait dit 20 lignes encore le résultat de cat temp après l'exécution de la commande ci-dessus, il sera 0 temp.

Je pense que cela parce que le shell crée un nouveau vide temp même si temp ainsi la existaient écraser température existante et donc quand wc essaie de compter le num de lignes en temp il obtient zéro.

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

Questions connexes