Eu corro ps -ejH | less
. A saída inclui ps
e less
também.
Qual é a razão? Achei que funcionaria da seguinte maneira:
- Primeiro,
ps
será executado e listará todos os processos existentes naquele momento. - Então, a saída de
ps
será inserida emless
.
Mas de acordo com essa lógica, nem ps
not less
deveria aparecer na saída de ps
.
Então, por que esses processos estão incluídos na saída de ps
? Funciona ps
um pouco diferente do que descrevi?
Responder1
Oconchainicia ambos, para estabelecer as extremidades do tubo, assim ps
vê a si mesmo e também o processo na outra extremidade do tubo.
Responder2
"Mas de acordo com essa lógica, nem ps nem less deveriam aparecer na saída de ps."
Sim, então sua lógica está errada, porque ambos aparecem. Quando você executa um comando em um shell Un*x, muito poucos (se houver) realmente são executados no shell. Um processo separado é bifurcado para executar esse comando.
Quando você canaliza dois comandos juntos, ambos os comandos são iniciados em processos separados e o stdout do primeiro é vinculado ao stdin do segundo.
Portanto, logo após executar ps|less, você terá três processos: um executando seu shell, um executando ps e um executando less. Como a saída é gerada por ps, ela será trabalhada em paralelo (dividida conforme necessário) por menos. Ambos os comandos são executados em paralelo, não sequencialmente, com buffer mínimo.
À medida que ps percorre a lista de processos, ele encontra e exibe a si mesmo e less, 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 ps e less.
Responder3
Usar
ps -ef | grep [l]ess
para evitar menos.
[l]ess
correspondaless
como regexp, mas não como string fixa.