Je n'ai jamais vraiment réfléchi à la manière dont le shell exécute les commandes redirigées. On m'a toujours dit que "la sortie standard d'un programme entrait dans le répertoire standard d'un autre", comme moyen de penser aux pipes. Alors naturellement, je pensais que dans le cas de, A | B, A s'exécute en premier, puis B obtient la sortie standard de A et utilise la sortie standard de A comme entrée.
Mais j'ai remarqué que lorsque les gens recherchent un processus particulier dans ps, ils ajoutent grep -v "grep" à la fin de la commande pour s'assurer que grep n'apparaît pas dans la sortie finale. Cela signifie que dans la commande ps aux | grep "bash" | grep -v "grep", ce qui signifie que ps savait que grep était en cours d'exécution et qu'il se trouvait donc dans la sortie de ps. Mais si ps termine de s'exécuter avant que sa sortie ne soit transmise à grep, comment a-t-il su que grep était en cours d'exécution?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep