La primera línea:
echo $(ps | grep $PPID) | cut -d" " -f4
dice:
- Ejecutar
ps | grep $PPID
en una subcapa -
Devuelve la salida, que será algo como esto:
3559 pts/1 00:00:00 bash
y luego use esa salida como el primer parámetro de eco, lo que, en la práctica, significa simplemente hacer eco de la salida
- Luego ejecuta
cut -d" " -f4
en eso, lo que le da el nombre del comando en este caso
El segundo comando:
echo ps | grep $PPID | cut -d" " -f4
dice:
- Cadena de eco
ps
- Grep esa cadena para
$PPID
- esto nunca devolverá nada, como$PPID
contiene un número, por lo que nunca seráps
. Por lo tanto, grep no devuelve nada - Ejecutar
cut -d" " -f4
con la entrada del comando anterior, que no es nada, por lo que no obtiene nada
La razón es que
echo ps
simplemente imprime la cadena ps
; no ejecuta el programa ps
. La versión corregida de su comando sería:
ps | grep $PPID | cut -d" " -f4
Editado para agregar: paxdiablo señala que ps | grep $PPID
incluye muchos espacios en blanco que se colapsarán por echo $(ps | grep $PPID)
(ya que el resultado de $(...)
, cuando no está entre comillas dobles, se divide por espacios en blanco en argumentos separados y luego echo
genera todos sus argumentos separados por espacios). Para abordar esto, puede usar tr
para "comprimir" espacios repetidos:
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
o puede quedarse con lo que tenía al principio. :-)