echo ps 同时保留换行符?

发布于 2024-11-19 03:15:15 字数 570 浏览 2 评论 0原文

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

为什么?

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

If I do ps ax in Terminal, the result will be like this:

  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

While if I do echo $(ps ax), I get:

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

Why?

And how do I preserve the newlines and tab characters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

杯别 2024-11-26 03:15:15

一如既往的方式:使用引号。

echo "$(ps ax)"

Same way as always: use quotes.

echo "$(ps ax)"
病毒体 2024-11-26 03:15:15

只需在要回显的变量中使用双引号即可,而

echo "$(ps ax)"

无需所有额外的垃圾编码或麻烦。

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

Simply use double-quotes in the variable that is being echo'd

echo "$(ps ax)"

this will do it without all that extra junk coding or hassle.

edit: ugh... someone beat me to it! lol

巴黎盛开的樱花 2024-11-26 03:15:15

这是因为 echo 根本不是管道——它将 ps ax 的输出解释为变量,并且 bash 中的(未加引号的)变量本质上压缩了空格——包括换行符。

如果您想通过管道传输 ps 的输出,请通过管道传输:

ps ax | ... (some other program)

That's because echo isn't piping at all--it's interpreting the output of ps ax as a variable, and (unquoted) variables in bash essentially compress whitespace--including newlines.

If you want to pipe the output of ps, then pipe it:

ps ax | ... (some other program)
橘寄 2024-11-26 03:15:15

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

readarray psoutput < <(ps ax)

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

这需要最新的 bash 版本

Or if you want to have line-by-line access:

readarray psoutput < <(ps ax)

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

This requires a recent(ish) bash version

浅沫记忆 2024-11-26 03:15:15

您是在谈论管道输出吗?您的问题说“管道”,但您的示例是命令替换:

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

如果您正在谈论 命令替换,则需要引号,正如其他人已经指出的那样out 以强制 shell 不丢弃空格:

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

Are you talking about piping the output? Your question says "pipe", but your example is a command substitution:

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

More useful?

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

If you're talking about command substitution, you need quotes as others have already pointed out in order to force the shell not to throw away whitespace:

echo "$(ps ax)"
foo="$(ps ax)"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文