O shell inicia ambos, para estabelecer as extremidades do pipe, assim ps
se vê assim como o processo na outra extremidade do pipe.
Eu corro ps -ejH | less
. A saída inclui ps
e less
também.
Qual é o motivo? Eu pensei que funcionaria da seguinte forma:
ps
será executado e listará todos os processos existentes naquele
momento. ps
será alimentada em less
. Mas, de acordo com essa lógica, nem ps
não less
deve aparecer na saída de ps
.
Então, por que esses processos estão incluídos na saída de ps
? O ps
funciona um pouco diferente do que descrevi?
"Mas de acordo com essa lógica, nem ps nem menos deve aparecer na saída de ps."
Sim, sua lógica está errada, porque os dois aparecem. Quando você executa um comando em um shell Un * x, muito poucos (se houver algum) realmente são executados no shell. Um processo separado é bifurcado para executar esse comando.
Quando você canaliza dois comandos juntos, os dois comandos são iniciados em processos separados e o stdout do primeiro é vinculado ao stdin do segundo.
Então, logo após você executar o ps | less, você tem três processos: um executando o shell, um executando o ps e um rodando menos. Como a saída é gerada por ps, ela será trabalhada em paralelo (timesliced conforme necessário) por menos. Ambos os comandos são executados em paralelo, não sequencialmente, com um buffer mínimo.
À medida que o ps trabalha na lista de processos, ele encontra e exibe a si mesmo e menos, e o shell pai também, e o pai do pai, e assim por diante até o init. E tudo mais no sistema. É por isso que sua saída inclui tanto ps quanto menos.
Use
ps -ef | grep [l]ess
para evitar menos.
[l]ess
match less
como regexp, mas não como string fixa.