在保留换行符的同时回音ps?

时间:2011-07-07 19:26:09

标签: bash process newline ps

如果我在终端中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

为什么?

如何保留换行符和制表符?

6 个答案:

答案 0 :(得分:30)

与以往一样:使用引号。

echo "$(ps ax)"

答案 1 :(得分:6)

只需在正在回显的变量中使用双引号

echo "$(ps ax)"

如果没有额外的垃圾编码或麻烦,这样做就可以了。

编辑:呃......有人打败了我!洛尔

答案 2 :(得分:2)

那是因为echo根本不是管道 - 它将ps ax的输出解释为变量,而bash中的(未引用的)变量基本上压缩空格 - 包括换行符。

如果要管道输出ps,请将其输出:

ps ax | ... (some other program)

答案 3 :(得分:0)

或者,如果您想要逐行访问:

readarray psoutput < <(ps ax)

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

这需要最近的(ish)bash版本

答案 4 :(得分:0)

重新思考你的问题/解决方案。

如果你想要$(ps ax) - 保留换行符 - USUALLY 意味着一个糟糕的设计,你可能想要使用管道或重定向。通常 - 所以,也许没关系 - 真的想知道你想要达到什么目的。 :)

答案 5 :(得分:-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,你需要引用,因为其他人已经指出,以迫使shell不要丢弃空格:

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