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 pipesje me suis un peu cassé la tête et j'ai trouvé une solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 +-> | cmd3 | cmd4 | > cmd1 | cmd2 --+ | +-> | cmd5 | cmd6
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-ciceci va écrire "hello" dans file et "Hello" à l'écran
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))}'
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'écrancela affiche
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}à l'écran
Code : Sélectionner tout - Visualiser dans une fenêtre à part \033[7merror\033[27m: Hello
le process dans le pipe principal à bien changé le h en H
et le contenu de file estle process du pipe secondaire fonctionne aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: hello
pour reprendre le schéma ci dessus cela donneA+JYT
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}
Partager