2012-02-22 19 views
10

Estoy tratando de obtener el nombre del intérprete ejecutando un guión.Salida de tubería para cortar

¿Por qué

echo $(ps | grep $PPID) | cut -d" " -f4 

trabajo mientras

echo ps | grep $PPID | cut -d" " -f4 

no?

Respuesta

14

La razón es que

echo ps 

simplemente imprime la cadena de ps; no ejecuta el programa ps. La versión corregida de su comando sería:

ps | grep $PPID | cut -d" " -f4 

Editado para añadir: paxdiablo señala que ps | grep $PPID incluye una gran cantidad de espacio en blanco que va a quedar colapsado por echo $(ps | grep $PPID) (ya que el resultado de $(...), cuando no está en doble -quotes, se divide por espacios en blanco en argumentos separados, y luego echo muestra todos sus argumentos separados por espacios). Para hacer frente a esto, se puede utilizar tr a "exprimir" espacios repetidos:

ps | grep $PPID | tr -s ' ' | cut -d' ' -f5 

o simplemente puede seguir con lo que había que empezar. :-)

+0

Por alguna razón, echo $ (ps | grep $ PPID) | cut -d "" -f4 me dará "bash" mientras ps | grep $ PPID | cut -d "" -f4 solo me da un espacio vacío – ZPS

+0

No del todo. La primera versión tiene el efecto adicional de colapso de espacios. – paxdiablo

+0

¡Awwwww tienes razón! gracias – ZPS

2

Creo que si se ejecuta solo echo ps por su propia cuenta, verá por qué su tubería no funciona:

$ echo ps 
ps 

En su lugar, comprobar $0. Tenga en cuenta que podría ser -bash o bash, dependiendo de si es un shell de inicio de sesión . (Bueno, cualquier shell - no solo bash - pero se agrega guion si el shell es un shell de inicio de sesión.)

5

La primera línea:

echo $(ps | grep $PPID) | cut -d" " -f4 

dice:

  • Ejecutar ps | grep $PPID en un sub-shell
  • devolver la salida - que será algo como esto:

    3559 pts/1 00:00:00 bash 
    

    y luego use esa salida como primer parámetro de eco - la cual, en la práctica, significa simplemente eco de la salida

  • A continuación, ejecute cut -d" " -f4 en que - que le da el nombre del comando, en este caso

El segundo comando:

echo ps | grep $PPID | cut -d" " -f4 

dice: cadena

  • Echo ps
  • Grep esa cadena para $PPID - esto nunca devolverá nada, ya que $PPID contiene un número, por lo que nunca será ps. Por lo tanto, grep devuelve nada
  • Ejecutar cut -d" " -f4 con la entrada de la orden anterior - que no es nada, por lo que no reciben nada
Cuestiones relacionadas