18

ps axターミナルで行うと、結果は次のようになります。

  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

なんで?

また、改行とタブ文字を保持するにはどうすればよいですか?

4

5 に答える 5

44

いつもと同じように、引用符を使用します。

echo "$(ps ax)"
于 2011-07-07T19:30:02.510 に答える
8

エコーされる変数で二重引用符を使用するだけです

echo "$(ps ax)"

これは、余分なジャンクコーディングや面倒な作業なしでそれを行います。

編集:うーん...誰かが私をそれに打ち負かした!笑

于 2011-07-07T19:36:36.360 に答える
3

echoこれは、パイプ処理がまったく行われていないためです。つまり、の出力をps ax変数として解釈し、bash内の(引用符で囲まれていない)変数は、改行を含めて空白を本質的に圧縮します。

の出力をパイプする場合は、次のpsようにパイプします。

ps ax | ... (some other program)
于 2011-07-07T19:29:38.283 に答える
0

または、行ごとにアクセスしたい場合:

readarray psoutput < <(ps ax)

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

これには、最近の(ish)bashバージョンが必要です

于 2011-07-07T19:33:33.010 に答える
-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

コマンド置換について話している場合は、シェルが空白を破棄しないように強制するために、他の人がすでに指摘しているように、引用符が必要です。

echo "$(ps ax)"
foo="$(ps ax)"
于 2011-07-07T20:10:09.857 に答える