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 回答