(Courriels de diversion: <reinstallerai@haschich-offrirez.com> <entamerais@localiserons-avoisinerai.com> <meteorites@contrerez-demarquez.com> <rajeuniront@surmenais-portail.com> <barbet@charriee-balisera.com> <humilier@saussaies-urbaniserez.com> <creche@intimions-liquidais.com> <encriers@peseras-vertebrales.com> <etraves@desengageons-figure.com> <happions@angoisserions-ensoleilles.com> )
salut On Sat, 07 Jan 2006 16:48:28 +0100 Jean-Marc Mongrelet <jm-mongrelet.nospam@ifrance.com> wrote: > Bonjour, > > Comment faut-il faire pour gérer une entré pipe sur un script shell? > > Je m'explique: > > Un script (d'exemple simple): > $ cat exemple > #! /bin/bash > echo $1 > > > Je fais (pour exemple): > ls | exemple Comme le dit icmp.ba l'erreur c'est de lire une variable alors que en fait il faut lire un flux de donnée à travers un tubes. En fait tout ceci est l'utilisation des fifos, tube, pipe, "|", pour "faire passer" des flux. Exemple 1 Ouvrir 2 xterm l'un à coté de l'autre. dans les 2 taper cd /tmp dans l'un des deux taper: xs@wotan:/tmp$ mkfifo tuyau dans celui de droite xs@wotan:/tmp$ cat tuyau dans celui de gauche xs@wotan:/tmp$ cat > tuyau Maintenant taper n'importe quoi dans le xterm de gauche suivis de [ENTREE] Et hop ça apparais dans le xterm de droite !!!! Explication: Le texte tapé à gauche est envoyé à droite par le tube "tuyau" (tube nommé) La sortie du "cat" de gauche est envoyé (avec >) dans le tube "tuyau". L'entree du "cat" de droite est lue depuis le "tuyau" (avec <). note: un [CTRL]+[C] dans l'un des 2 brise le tube et arrette les 2 cat Exemple 2 Dans un xterm xs@wotan:/tmp$ cat | cat Maintenant taper n'importe quoi dans le xterm de gauche suivis de [ENTREE] Le texte apparais 2 fois, l'echo viens du 2 ieme cat qui "le ressort" Le texte tapé est "attrapé" par le premier "cat" puis envoyé au deuxieme par le tube "|". La sortie standart du premier "cat" est envoyé dans l'entrée standart du deuxieme "cat". Exemple 3 Cela equivaut à xs@wotan:/tmp$ cat > /dev/stdout | cat < /dev/stdin le "/dev/stdout" correspond au "/dev/stdin" du second grace a "|" Bon cet exemple est redondant car "cat" par défaut utilise stdin et stdout. Exemple 4 En utilisant un tube nommé $ cd /tmp $ mkfifo tuyau # si c'est pas deja fait $ cat > tuyau | cat Le texte n'apparais qu'un fois ! Le texte n'arrive jamais au 2 ieme "cat" car il est dirigé dans le tube "tuyau" Exemple 5 En utilisant un tube nommé $ cd /tmp $ mkfifo tuyau # si c'est pas deja fait $ cat > tuyau | cat < tuyau La sortie standart du premier "cat" est envoyé dans le tube "tuyau" L'entre standart du 2ieme "cat" est lue depuis le tube "tuyau" Exemple 6 Et cela fonctione pareil avec le fichier exemple du debut Eh bien il faut lire l'entree standart comme ceci: $ cat exemple #!/bin/sh cat < /dev/stdin xs@wotan:/tmp$ cat | ./exemple se comporte comme l'exemple 2 et 3 Le texte recuperé par le "cat" de la ligne de commande est reaffiché par le "cat" du fichier script "exemple" Et tout ceci s'emploi dans tout les sens. Bonnes redirections ! Bon j'espere ne pas avoir raconté trop de betise, bon dimanche. Xavier -------------------------------------------------------------------- Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>