如果我在终端中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
为什么?
如何保留换行符和制表符?
答案 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)"