2011-07-07 45 views
8

如果我在終端做ps ax,結果會是這樣:回聲ps,同時保留換行符?

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 

雖然如果我這樣做echo $(ps ax),我得到:

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 

爲什麼?

如何保留換行符和製表符?

回答

25

一樣:使用引號。

echo "$(ps ax)" 
2

這是因爲echo根本不是管道 - 它將ps ax的輸出解釋爲一個變量,而bash中的(未加引號的)變量實際上壓縮了空白 - 包括換行符。

如果你想管的ps輸出,然後用管道:一如既往

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

好吧,說我想做'ps ax | grep foobar「它仍然混淆了設計。 – Tyilo

+0

我一直在使用這個構造,它對我很好。如果您認爲實際管道輸出不正確,請在您的問題中提供其他詳細信息。 – Flimzy

+1

不,只是我很愚蠢 – Tyilo

0

或者,如果你想有一行接一行訪問:

readarray psoutput < <(ps ax) 

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

這需要一個最近的(ISH)慶典版

5

中即變量只需使用雙引號正在回顯

echo "$(ps ax)" 

這樣做不會造成額外的垃圾編碼或麻煩。

編輯:呃...有人打我吧!大聲笑

+0

Upvote for you too buddy。 –

-1

你在說什麼管道的輸出?你的問題說「管道」,但你的例子是一個命令替換:

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

更有用嗎?

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

如果你在談論command substitution,你需要報價爲他人,以迫使外殼不扔掉的空白已經指出:

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

重新考慮你的問題/解決方案。

當您想要$(ps ax) - 保留換行符時 - USUALLY意味着設計不好,您可能需要使用管道或重定向。通常 - 所以,也許它是確定的 - 真正想知道你想達到什麼。 :)