Non ho mai veramente pensato a come la shell esegua effettivamente i comandi piped. Mi è sempre stato detto che lo "stdout di un programma viene convogliato nello stdin di un altro", come un modo di pensare alle pipe. Quindi, naturalmente, ho pensato che, nel caso di dire, A | B, A verrebbe eseguito per primo, quindi B ottiene lo stdout di A e utilizza lo stdout di A come input.
Ma ho notato che quando le persone cercano un particolare processo in ps, includerebbero grep -v "grep" alla fine del comando per assicurarsi che grep non compaia nell'output finale. Ciò significa che nel comando ps aux | grep "bash" | grep -v "grep", il che significa che ps sapeva che grep era in esecuzione e quindi è nell'output di ps. Ma se ps termina l'esecuzione prima che il suo output venga convogliato su grep, come fa a sapere che grep era in esecuzione?
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