switch sintaxis script not bash if-statement

sintaxis - ¿Por qué "si $(ps aux | grep...)" siempre tiene éxito en Bash?



shell script linux if condition (5)

Debe filtrar el proceso que es grep ping para ''bla bla'':

$ if ps aux | grep -v ''grep'' | grep -q ''bla bla''; then echo ''Found'' fi

¿Por qué la siguiente declaración if tiene éxito?

if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi


El $( es un poco pequeño relevante, y cambia el significado un poco. Aunque en este caso, debido a que nunca hay salida de grep -q , puede simplemente salirse con la $( . Probablemente quiera comenzar con algo así como (como lo señalaron otros):

if ps aux | grep -v ''grep'' | grep -q ''bla bla''; then echo ''Found'' fi

De todos modos, comenzaste con

if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi

Con $( , el comando dentro de $( ) se ejecuta y la salida de ese comando se usa como la línea de comando para el comando externo. Haga estos cuatro experimentos:

# if $(echo nonexistant ; true) ; then echo "found" ; fi nonexistant: command not found # if $(echo nonexistant ; false) ; then echo "found" ; fi nonexistant: command not found # if $(echo ; true) ; then echo "found" ; fi found # if $(echo ; false) ; then echo "found" ; fi

Entonces, de acuerdo con esto, obtendrás resultados si se cumplen estas dos condiciones:

  • El comando dentro de $( ) no creó ninguna salida
  • y el comando fue exitoso

Esto sugiere que ps aux | grep -q "bla bla" ps aux | grep -q "bla bla" fue exitoso y no generó ningún resultado. No es sorprendente que grep -q no genere resultados. Para eso es -q . Por lo tanto, su comando debe haber tenido un estado verdadero, lo que implica que el grep sí logró encontrar una coincidencia. Sabemos que grep siempre encontrará una coincidencia en este caso, porque la lista de procesos de ps incluirá grep ; el grep siempre se encontrará a sí mismo.


Porque el proceso grep sí mismo está siendo devuelto por ps . Puede "engañar" a grep para que no coincida al rodear uno de los caracteres de búsqueda en una clase de caracteres [ ] que no cambia la funcionalidad: simplemente haga lo siguiente:

if ps aux | grep -q "[b]la bla" ; then echo "found" ; fi

Además, el uso de la sustitución de proceso $() es necesario. El if funcionará en el éxito del último comando en la cadena de tuberías, que es lo que desea.

Nota : La razón por la que funciona el truco de clase de caracteres es porque la salida ps todavía tiene los corchetes de clase de caracteres, pero cuando grep está procesando la cadena de búsqueda, utiliza los corchetes como sintaxis en lugar de una cadena fija para que coincida.


Si grep la salida de ps aux , siempre obtendrá un proceso que muestra su comando anterior. Para solucionar esto, puede canalizar la salida a grep dos veces, una para eliminar la línea con "grep" y otra vez para el proceso que busca.

ps aux | grep -v "grep" | grep "Finder"


el proceso ''grep'' ya se está ejecutando en el momento en que ps se ejecuta, por lo que la salida ps lo incluye.

Intenta usar pgrep lugar.

pgrep es precisamente para este propósito:

if pgrep "bla bla" ; then echo "found" ; fi