Descripteurs de fichiers, pipes...

Descripteurs de fichiers, pipes... - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 27-10-2005 à 22:42:05    

Soit A et B deux commandes UNIX (ou blocs de commandes). Si je veux que A parle à B, autrement dit que la sortie standard de A soit redirigée vers l'entrée standard de B, cela se note A | B. Comment faire pour que A parle à B et que B parle à A ?

Reply

Marsh Posté le 27-10-2005 à 22:42:05   

Reply

Marsh Posté le 28-10-2005 à 00:12:37    

Je n'ai pas le souvenir qu'il y ai une commande qui fasse ca simplement.
Tu n'as pas un exemple plus concret ?


---------------
BOFH excuse #400:We are Microsoft.  What you are experiencing is not a problem; it is an undocumented feature.
Reply

Marsh Posté le 28-10-2005 à 00:39:35    

les pipe sont pas bi-directionnel dans ton shell

Reply

Marsh Posté le 28-10-2005 à 00:49:52    

Tu peux toujours te programmer un utilitaire qui redirige la sortie standard de A vers l'entree standard de B et inversement.
Avec les fonctions "pipe", "dup/dup2", "system" et "fork", ca doit pas etre bien long a faire mais avec des commandes qui n'ont pas ete pensees pour ca a la base, y a sans doute risque de boucle infinie.
 
--Edit--
T'as un exemple precis pour illustrer ce que tu voudrais faire ?


Message édité par MarmottePower le 28-10-2005 à 00:53:42
Reply

Marsh Posté le 28-10-2005 à 01:35:33    

Bah il veut juste des named pipes, nan ?

$ mkfifo A.fifo B.fifo
$ cat > A.sh << EOF
#! /bin/bash
 
while :
do
        read i < ./A.fifo
        echo $i bottles of beer on the wall, $i bottles of beer.
        echo $((i+1)) > ./B.fifo
done
EOF
$ cat > B.sh << EOF
#! /bin/bash
 
max=99
 
while :
do
        read i < ./B.fifo
        ((i-=2))
        if [ "$i" -le "0" ]
        then
                i=$max
                echo Take one down and pass it around, no more bottles of beer on the wall.
                echo
                echo No more bottles of beer on the wall, no more bottles of beer.
                echo Go to the store and buy some more, $i bottles of beer on the wall.
        else echo Take one down and pass it around, $i bottles of beer on the wall.
        fi
         
        echo    
 
        echo $i > A.fifo
done
EOF
$ chmod +x A.sh B.sh
$ ./A.sh &
$ ./B.sh &
$ echo 99 > A.fifo
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.
 
98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.
 
97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.
 
96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.
 
95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.
 
94 bottles of beer on the wall, 94 bottles of beer.
Take one down and pass it around, 93 bottles of beer on the wall.
 
93 bottles of beer on the wall, 93 bottles of beer.
Take one down and pass it around, 92 bottles of beer on the wall.
 
92 bottles of beer on the wall, 92 bottles of beer.
Take one down and pass it around, 91 bottles of beer on the wall.
 
91 bottles of beer on the wall, 91 bottles of beer.
Take one down and pass it around, 90 bottles of beer on the wall.
 
90 bottles of beer on the wall, 90 bottles of beer.
Take one down and pass it around, 89 bottles of beer on the wall.
 
89 bottles of beer on the wall, 89 bottles of beer.
Take one down and pass it around, 88 bottles of beer on the wall.
 
88 bottles of beer on the wall, 88 bottles of beer.
Take one down and pass it around, 87 bottles of beer on the wall.
 
87 bottles of beer on the wall, 87 bottles of beer.
Take one down and pass it around, 86 bottles of beer on the wall.
 
86 bottles of beer on the wall, 86 bottles of beer.
Take one down and pass it around, 85 bottles of beer on the wall.
 
[...etc...]

(on notera la grande valeur utilitaire de ces scripts [:dawao], ainsi que leur optimisation impressionante [:dawao] )

Reply

Marsh Posté le 28-10-2005 à 22:31:10    

J'aurais aimé une réponse générale, c'est pourquoi je ne vous ai pas révélé les contenus de A et B, mais voici les détails :
 
Il y a 2 machines :
- "Développement" : ne contient aucune donnée à jour, mais sert à fournir du temps processeur pour des essais et des traitements lourds. Si cette machine plante c'est pas grâve.
- "Production" : contient les vraies données (toujours à jour, mais ça fait des gigas). Il est interdit de gaspiller du temps processeur sur cette machine, et si elle plante c'est la catastrophe.
 
Je dois faire des traitements lourds et risqués (donc exécutés sur la machine de "Développement") qui ont besoin de récupérer certaines données situées sur la machine de "Production".
 
J'avais donc pensé mettre tout mon Shell Script entre parenthèses (c'est A) et le faire dialoguer avec un ssh (c'est B) auquel A pourra envoyer des commandes (avec un echo) et récupérer les réponses en lisant l'entrée standard :

Code :
  1. ( ... tous mes traitements lourds et risqués ... ) | ssh production


J'ai déjà utilisé ce procédé pour transférer des fichiers, comme ceci :

Code :
  1. ( ... echo "get toto" ... traitement ... echo "get titi" ... traitement ... echo "put tata" ... ) | sftp production


Mais si j'ai envie de connaître le nombre de lignes d'un gros fichier, je préfère faire un echo "wc -l toto" plutôt qu'un echo "get toto".


Message édité par e-miel le 28-10-2005 à 22:32:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed