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 solutionCode:
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'écranCode:
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 afficheCode:
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'écranCode:\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:error: hello
pour reprendre le schéma ci dessus cela donneA+JYTCode:
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}