2011-07-07 16 views
8

Jeśli robię ps ax w Terminalu, wynik będzie tak:Echo ps, zachowując znaki nowej linii?

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 

Chociaż jeśli mam echo $(ps ax), otrzymuję:

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 

Dlaczego?

A jak zachować znaki nowej linii i tabulatory?

Odpowiedz

25

sam sposób jak zawsze: Użycie cytatów.

echo "$(ps ax)" 
2

To dlatego, że echo nie jest wcale orurowaniem - interpretuje wyjście ps ax jako zmienną, a (niecytowane) zmienne w bash w zasadzie kompresują białe znaki - w tym znaki nowej linii.

Jeśli chcesz rurze wyjście ps, następnie rurę go:

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

Ok, powiedz, że chcę zrobić "ps ax" | grep foobar' nadal burzy projekt. – Tyilo

+0

Używam tej konstrukcji przez cały czas i działa to dla mnie świetnie. Jeśli uważasz, że dane wyjściowe są nieprawidłowe w czasie rzeczywistym, podaj dodatkowe informacje w swoim pytaniu. – Flimzy

+1

Nie, po prostu bycie totalnie głupim – Tyilo

0

Lub jeśli chcesz mieć wiersz po wierszu dostępu:

readarray psoutput < <(ps ax) 

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

Wymaga wersję niedawno (owski) bash

5

Wystarczy użyć cudzysłowia w zmiennej, która jest jest to echo, to zrobi to bez tego dodatkowego kodowania śmieci lub kłopotów.

edytuj: ugh ... ktoś mnie pobił! lol

+0

Awansuj na ciebie, zbyt stary. –

-1

Czy mówisz o instalacji rurowej wyjście? Twoje pytanie brzmi "fajka", ale Twój przykład to podstawienie polecenia:

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

Przydatne?

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

Jeśli mówisz command substitution, trzeba cytaty jak inni już wspomniano, aby wymusić, aby nie wyrzucać spacje:

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

przemyśleć swój problem/rozwiązanie.

Jeśli chcesz $ (ps ax) - z zachowanymi znakami nowej linii - USUALLY oznacza zły projekt i prawdopodobnie chcesz używać potoków lub przekierowań. Zwykle - więc może jest ok - naprawdę zastanawiasz się, co chcesz osiągnąć. :)

Powiązane problemy