Temps nécessaire pour faire la sortie du tuyau à la tête / à la queue

Il y a beaucoup de files txt dans un directory.

Si je fais le time wc -l *.txt | head time wc -l *.txt | head qu'il faut

 real 0m0.032s user 0m0.020s sys 0m0.008s 

Si je fais le time wc -l *.txt | tail time wc -l *.txt | tail qu'il faut

 real 0m0.156s user 0m0.076s sys 0m0.088s 

Cela signifie-t-il que nous saurons à l'avance que c'est à la tête et countra uniquement pour les 10 premiers files et gagner du time? En d'autres termes, est-il au courant du tuyau? Et est-ce particulier quelque chose à propos de wc ou s'applique-t-il à toutes les commands standard / embeddedes?

J'ai fait un strace sur les deux commands. La chose interessante est que lorsque vous dirigez la sortie vers la head il n'y a que 123 appels système. D'un autre côté, quand il y a plus de 245 appels système (ou plus quand il y a plus de files * .txt).

Cas: tête

Voici les quelques dernières lignes lorsque vous conduisez à la head :

 open("file12.txt", O_RDONLY) = 3 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 read(3, "", 16384) = 0 write(1, "0 file12.txt\n", 13) = -1 EPIPE (Broken pipe) --- SIGPIPE (Broken pipe) @ 0 (0) --- +++ killed by SIGPIPE +++ 

Lorsque vous wc d'écrire la sortie du 12ème file, il obtient une erreur EPIPE . C'est pourquoi la head sortie après avoir obtenu la onzième ligne. Quand la head sort, nous wc SIGPIPE . Comme on le voit dans la sortie strace ci-dessus, wc essaie d'abord d'écrire sur cette pipe (où la head ne lit plus) et obtient une erreur que la pipe est cassée.

Le signal SIGPIPE est envoyé à un process lorsqu'il tente d'écrire sur un canal sans process connecté à l'autre extrémité. – de Wikipedia

Cas: queue

Quand il y a du tuyau à la tail , il n'y a rien de tel par-dessus. wc se termine gracieusement après avoir écrit la sortie vers le tuyau où la tail doit être connectée pendant tout le time. tail besoin de toutes les lignes avant d'imprimer les 10 dernières. Quand il n'y a plus de sortie à lire, la tail imprime les lignes et sort gracieusement

Tout process qui ne bloque pas SIGPIPE sera tué si sa sortie va à l'extrémité d'écriture d'un tube que personne ne lit.

Donc, dès que la head ferme son input (c.-à-d. Se termine), wc meurt, ce qui prend less de time que la finition de tout le travail.

Vous pouvez le faire pour faire disparaître vos files:

 time wc -l *.txt > tee | tail 

Mais un peu vous ajoutez du time pour la command de tee au time .

Avec la tee command :

 root@debian:/home/mohsen/test# time wc -l *.txt > tee | tail real 0m0.005s user 0m0.000s sys 0m0.000s 

Sans tee command :

 root@debian:/home/mohsen/test# time wc -l *.txt | tail 8 f3.txt 7 fi.txt 5 mydata.txt 4 newfile.txt 4 t1.txt 4 t2.txt 5 test.txt 4 text.txt 0 t.txt 49 total real 0m0.004s user 0m0.000s sys 0m0.000s