(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/>