Ce n'est pas défini par tee, mais comme dit Daenyth, nous ne serons pas finis tant que le tee n'aura pas fini de transmettre les données - donc généralement tee l'aura passé à awk. Dans ce cas, il pourrait être préférable d'avoir awk faire le comptage. L'inconvénient étant qu'il ne connaîtra pas le nombre jusqu'à ce qu'il se termine (sachant qu'il nécessite la mise en mémoire tampon des données). Dans votre exemple, tee et wc ont tous les deux stdout connectés au même canal (stdin for awk), mais l'ordre n'est pas défini. cat (et la plupart des autres outils de tuyauterie) peuvent être utilisés pour assembler des fichiers dans un ordre connu.
Il existe des techniques de tuyauterie plus avancées qui pourraient être utilisées, telles que les coprocords bash (coproc) ou les tuyaux nommés (mkfifo ou mknod p). Ce dernier vous obtient des noms dans le système de fichiers, qui peuvent être transmis à d'autres processus, mais vous devrez les nettoyer et éviter les collisions. Le fichier tempfile ou $$ peut être utile pour cela. Les tuyaux ne servent pas à stocker des données, car ils ont souvent une taille limitée et bloquent simplement les écritures.
Un exemple où les tuyaux sont la mauvaise solution:
mkfifo wcin wcout
wc -l <wcin> wcout &
yes | dd count=1 bs=8M | tee wcin | cat -n wcout - | head
Le problème est ici que tee va se retrouver coincé en essayant d'écrire des choses à chat, qui veut en finir avec wcout premier. Il y a simplement trop de données pour le tuyau du tee au chat.
Édition concernant la réponse de dmckee: Oui, la commande peut être répétable, mais elle n'est pas garantie. C'est une question d'échelle, d'ordonnancement et de taille de tampon. Dans cette boîte GNU/Linux, l'exemple commence à casser après quelques milliers de lignes:
seq -f line%g 20000 | tee >(awk '{print "*" $0 "*"}') | \
(awk '{print "this is awk: "$0}') | less
this is awk: line2397
this is awk: line2398
this is awk: line2*line1*
this is awk: *line2*
this is awk: *line3*
lol Je vous demande un tutoriel sur faire des pipes nommés faire vous semblez connaître vos trucs, mais qui peut être trop demander beaucoup :) – ldog
L'exemple cassé ci-dessus (qui fonctionne si vous réduisez la taille des données de 8M à quelque chose de plus petit que les limites fifo) utilise déjà des canaux nommés, appelés wcin et wcout. wcin est connecté de té à wc, wcout de wc à chat. Notez que wc est dans ce cas démarré avant l'un ou l'autre - cet ordre n'a pas d'importance, mais ils devraient fonctionner simultanément, donc le &. –
merci beaucoup, même si, comme vous le faites remarquer la solution de tuyau nommé peut être un mauvais moyen d'aller, il sert mes fins à condition de rester en dessous des limites! – ldog