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