2010-12-04 33 views
1

Supposons que j'ai trois fichiers fichier1 fichier2 fichier3 ayant un contenu Maintenant, quand je fais sur invite du shell cat file1 > file2 >file3opérateur de redirection dans UNIX

Contenu de fichier1 est copié à FILE3 et fichier2 devient vide

De même quand je ne cat > file1 > file2 > file3 Il demande pour l'entrée et cette entrée est stockée dans file3 et les deux fichier1 et fichier2 sont vides

et aussi pour cat > file1 > file2 < file3 contenu de file3 est copié à file2 et fichier1 est vide. Est-ce que quelqu'un peut m'expliquer ce qui se passe? Je suis nouveau à UNIX. Aussi n'importe quel site Web où je peux apprendre plus au sujet de ces opérateurs de redirection.

Merci

+0

Étant donné que cette syntaxe est en grande partie non valide, il est difficile d'expliquer. Vous devriez seulement utiliser un opérateur '>' ou '<'. L'utilisation de deux est une erreur, ce qui rend difficile à expliquer. Avez-vous lu «homme bash» pour lire sur la coquille? Avez-vous essayé de lire l'un des milliers de didacticiels 'bash' et' shell' disponibles? S'il vous plaît (1) lire un tutoriel shell et puis (2) mettre à jour votre question en fonction de ce que vous avez appris. Voici le premier hit google: http://gd.tuwien.ac.at/linuxcommand.org/lts0060.html. Commencer ici. –

+0

Opérateurs de redirection < > >><<< > & ... http://www.gnu.org/software/bash/manual/html_node/Redirections.html –

Répondre

1

Vous pouvez rediriger l'entrée standard < sortie standard 1> ou > sortie d'erreur 2> ou les deux sorties &> mais vous ne pouvez rediriger 1: 1, vous ne pouvez pas rediriger une sortie en deux fichiers différents.

Ce que vous cherchez est l'utilitaire tee.

+0

Comment cela explique pourquoi 'fichier2' est vide et' fichier3' contient des données de ' fichier'? – khachik

+0

Eh bien, dans votre shell, la redirection est simplement surchargée, donc '> file2' est probablement complètement ignoré, mais c'est spécifique au shell. –

+0

'file2' ne semble pas être ignoré, car il est créé et vide. Très intéressant. – khachik

1

Si vous ne voulez pas perdre du contenu original, vous devez utiliser redirect et ajoutez>> ou << opérateurs à la place. Vous pouvez lire plus here.

8

examiner comment le shell traite chaque partie de la commande comme il analyse le:

cat file1 > file2 >file3 
  1. cat file1: préparer un nouveau processus avec l'image du programme cat avec l'argument file1. (Donné 1 ou plusieurs arguments, cat lira des extraits de chaque argument en tant que fichier et écrire à son descripteur de fichier de sortie)
  2. > file2: modifier le nouveau descripteur de fichier de sortie de processus pour écrire file2 au lieu de l'évier de la sortie courant (initialement console pour un shell interactif) - créez `file2 si nécessaire.
  3. > file3: modifier le nouveau descripteur de fichier de sortie de processus pour écrire file3 au lieu de l'évier de la sortie de courant (était file2) - créer file3 si nécessaire
  4. End of command: Spawn le nouveau processus

Ainsi, dans le fin, file2 est créé, mais inutilisé. file3 obtient les données.

cat > file1 > file2 > file3 
  1. cat: préparer un nouveau processus avec le programme/image cat sans argument.(aucun argument, cat lira son descripteur de fichier d'entrée et écrira dans son descripteur de fichier de sortie)
  2. > file1: change le descripteur de fichier de sortie du nouveau processus pour écrire à file1 au lieu du récepteur de sortie courant (initialement la console pour un shell interactif) - créez file1 si nécessaire.
  3. > file2: modifiez le descripteur de fichier de sortie du nouveau processus pour écrire à file2 au lieu du récepteur de sortie courant (était file1) - créez file2 si nécessaire.
  4. > file3: modifier le nouveau descripteur de fichier de sortie de processus pour écrire file3 au lieu de l'évier de sortie courant - (était file2) créer file3 si nécessaire
  5. End of command: Spawn le nouveau processus

Ainsi, dans le fin, file1 et file2 sont créés, mais inutilisés. file3 obtient les données. cat attend une entrée sur son périphérique d'entrée (le périphérique de console par défaut pour un shell interactif). Toute entrée que reçoit cat ira à son périphérique de sortie (qui finit par être file3 au moment où le shell a fini de traiter la commande et a appelé cat).

cat > file1 > file2 < file3 
  1. cat: préparer un nouveau processus avec le programme/image cat sans argument. (aucun argument, cat lira son descripteur de fichier d'entrée et écrira dans son descripteur de fichier de sortie)
  2. > file1: change le descripteur de fichier de sortie du nouveau processus pour écrire à file1 au lieu du récepteur de sortie courant (initialement la console pour un shell interactif) - créez file1 si nécessaire.
  3. > file2: modifiez le descripteur de fichier de sortie du nouveau processus pour écrire à file2 au lieu du récepteur de sortie courant (était file1) - créez file2 si nécessaire.
  4. < file3: modifier le nouveau descripteur de fichier entrée de processus pour lire à partir file3 au lieu de la source d'entrée (d'abord la console pour un shell interactif)
  5. End of command: Spawn le nouveau processus

Ainsi, dans le fin, file1 est créé, mais inutilisé. file2 obtient les données. cat attend l'entrée sur son périphérique d'entrée (qui a été défini sur file3 au moment où le shell a terminé le traitement de la commande et appelé cat). Toute entrée que reçoit cat ira à son périphérique de sortie (qui finit par être file2 au moment où le shell a fini de traiter la commande et a appelé cat).

-

Notez que dans le premier exemple, cat est celui qui traite/ouvre file1. Le shell a simplement passé le mot file1 au programme en tant qu'argument. Cependant, le shell a ouvert/créé file2 et file3.cat ne savait rien à propos de file3 et n'a aucune idée de l'endroit où les choses qu'il écrivait à sa sortie standard allait.

Dans les 2 autres exemples, le shell a ouvert tous les fichiers. cat ne savait rien sur les fichiers. cat n'avait aucune idée d'où provenait son entrée standard et où se dirigeait sa sortie standard.


par @Sorpigal commentaire - le BASH manual a quelques bonnes descriptions de ce que les différents opérateurs de redirection font. Une grande partie est la même à travers différents obus Unix à des degrés divers, mais consultez votre manuel shell/manpage spécifique pour confirmer. Merci @Sorpigal.

http://gnu.org/software/bash/manual/html_node/Redirections.html

+1

Merci beaucoup. C'était vraiment utile. Merci un million –

+1

Le manuel de bash couvre beaucoup de ceci plutôt bien, sous REDIRECTION. – Sorpigal

+0

@Sorpigal - Vrai - http://www.gnu.org/software/bash/manual/html_node/Redirections.html - est utile, même si l'OP n'a pas dit qu'il utilisait 'bash' (ou même' Bourne shell) spécifiquement. Le but n'était pas d'expliquer ce que font les opérateurs de redirection, mais plutôt de donner un récit sur la manière dont les commandes sont traitées. Pour un débutant ayant de la difficulté à comprendre ce qui se passe, une description étape par étape est d'une grande aide (surtout si ses propres exemples). Maintenant qu'ils ont ce modèle mental de comment cela fonctionne, le manuel peut donner les détails. –