2011-07-07 12 views
8

Si hago ps ax en la Terminal, el resultado será la siguiente:¿Echo ps mientras conserva las líneas nuevas?

PID TT STAT  TIME COMMAND 
    1 ?? Ss  2:23.26 /sbin/launchd 
    10 ?? Ss  0:08.34 /usr/libexec/kextd 
    11 ?? Ss  0:48.72 /usr/sbin/DirectoryService 
    12 ?? Ss  0:26.93 /usr/sbin/notifyd 

Mientras que si lo hago echo $(ps ax), me sale:

PID TT STAT TIME COMMAND 1 ?? Ss 2:23.42 /sbin/launchd 10 ?? Ss 0:08.34 /usr/libexec/kextd 11 ?? Ss 0:48.72 /usr/sbin/DirectoryService 12 ?? Ss 0:26.93 /usr/sbin/notifyd 

¿Por qué?

Y cómo puedo conservar los saltos de línea y caracteres de tabulación?

Respuesta

25

misma forma que siempre: cotizaciones de uso.

echo "$(ps ax)" 
2

Esto se debe a que echo no está funcionando en absoluto: interpreta la salida de ps ax como variable, y las variables (no citadas) en bash comprimen esencialmente el espacio en blanco, incluidas las líneas nuevas.

Si desea canalizar la salida de ps, a continuación, la tubería que:

ps ax | ... (some other program) 
+0

Ok, digamos que quiero hacer 'ps ax | grep foobar' todavía ensucia el diseño. – Tyilo

+0

Uso ese constructo todo el tiempo, y funciona muy bien para mí. Si cree que el resultado es incorrecto al realizar la tubería, proporcione detalles adicionales en su pregunta. – Flimzy

+1

No, solo yo soy totalmente estúpido – Tyilo

0

O si usted quiere tener acceso a la línea por línea:

readarray psoutput < <(ps ax) 

# e.g. 
for line in "${psoutput[@]}"; do echo -n "$line"; done 

Esto requiere una versión reciente (más o menos) de bash

5

Simplemente utilice comillas en la variable que es siendo echo'd

echo "$(ps ax)" 

esto lo hará sin toda esa codificación extra de basura o molestia.

edición: uf ... alguien me ganó de mano! lol

+0

Voto a favor de ti también amigo. –

-1

¿Está hablando de tubería la salida? Su pregunta dice "pipe", pero su ejemplo es una sustitución de comando:

ps ax | cat #Yes, it's useless, but all cats are... 

¿Más útil?

ps ax | while read ps_line 
do 
    echo "The line is '$ps_line'" 
done 

Si estás hablando command substitution, es necesario presupuestos como otros ya han señalado con el fin de obligar a la cáscara de no tirar a la basura los espacios en blanco:

echo "$(ps ax)" 
foo="$(ps ax)" 
0

, reflexionar sobre el problema/solución.

Cuando desee $ (p. Ej.) - con líneas nuevas preservadas - NORMALMENTE significa un diseño incorrecto y es probable que desee utilizar las canalizaciones o la redirección. Por lo general, entonces, tal vez está bien, realmente se pregunta qué es lo que quiere lograr. :)

Cuestiones relacionadas