Bonjour

j'ai été confronté à un petit pb ce lui à partir d'une commande Unix de chainer des process via des pipe qui se divisent en deux branches et qui ont toute les deux leur chaine de pipes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
                +-> | cmd3 | cmd4
                |
> cmd1 | cmd2 --+
                |
                +-> | cmd5 | cmd6
je me suis un peu cassé la tête et j'ai trouvé une solution
le pros du shell en proposeront peut-être une meilleure
mais je la partage tout de même

le problème vient de la commande tee qui crée bien une branche mais ne permet pas de faire un pipe sur celle-ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
echo "hello" | tee file |
 awk '{print toupper(substr($0,1,1))""tolower(substr($0,2))}'
ceci va écrire "hello" dans file et "Hello" à l'écran

pb comment chainer un process sur la partie qui va dans file

la solution que j'ai trouvé consiste à utiliser un pipe nommé temporaire

j'ai par exemple un process qui écrit sur la console en utilisant des caractères d'échappement pour mettre en surbrillance ou en couleur certains éléments

je veux chainer à cette commende un process qui finira par sortir à l'écran et un autre qui part dans une boite noire

dans mon exemple je vais juste filtrer les caractère d'échappement et envoyer le flux dans un fichier pour le process boite noire et reprendre le awk ci-dessus pour le process vers l'écran
Code script : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
tempNode=`mktemp`
rm -f ${tempNode} #au cas où
/sbin/mknod  ${tempNode} p
# filtrage des log
cat ${tempNode} | sed -e "s/..27m//g" -e "s/..7m//g" >> file &
{
  echo "\033[7merror\033[27m: hello"
} | tee -a ${tempNode} |
 awk '{print tolower(substr($0,1,16))""toupper(substr($0,17,1))""tolower(substr($0,18))}'
rm -f ${tempNode}
cela affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
\033[7merror\033[27m: Hello
à l'écran
le process dans le pipe principal à bien changé le h en H
et le contenu de file est le process du pipe secondaire fonctionne aussi.

pour reprendre le schéma ci dessus cela donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
tempNode=`mktemp`
rm -f ${tempNode} #au cas où
/sbin/mknod  ${tempNode} p
 
cat ${tempNode} | cmd5 | cmd6 &
{  cmd1 | cmd2 } | tee -a ${tempNode} | cmd3 | cmd4
rm -f ${tempNode}
A+JYT