ps aux | grep 结果取决于 FreeBSD 上的终端大小

ps aux | grep 结果取决于 FreeBSD 上的终端大小

通过实验,似乎即使使用ps aux | grep ...输出也取决于终端大小。这对我来说似乎很奇怪。

管道不是应该使命令的输出以可预测的方式表现吗?

例如,ls在单独运行时会执行所有奇特的格式化魔法,但运行时ls | less它总是返回相同的输出样式。

ps aux | less但与 ls 不同的是,在 FreeBSD 上(至少在 bash 上),输出会将行切割为终端宽度。根据我的简短实验,在 Linux 中,当使用管道时,相同的命令总是输出完整长度的行。

为什么会发生这种情况?我该如何解决?

这真的只是 FreeBSD 的一个非常奇怪的默认设置吗?据我所知,这个“功能”几乎不可能在 FreeBSD 上编写可靠的 bash 脚本,因为简单的管道命令的输出不可靠。这难道不是个问题吗?

更新:感谢 Bert,我已经尝试ps aux > somefile文件内的行被剪切与 grep 和 less 完全一样!

信息:FreeBSD 10.2,bash 4.3.42,通过 SSH 连接或通过 KVM 本地登录时相同。

答案1

这不是管道造成的。部分问题出在您的寻呼机上less。默认情况下,它会以与您的终端相同的长度截断。您可以通过告诉它不要这样做来解决这个问题:

ps aux | less -S

ps检测窗口宽度并输出以适应

手册页有一种方法可以绕过这个问题:

-w 使用 132 列显示信息,而不是默认的窗口大小。如果多次指定 -w 选项,ps 将使用尽可能多的列,而不考虑窗口大小。请注意,如果“命令”列不是显示的最后一列,则此选项无效。

另一个解决方案是通过管道将输出传输到文件

ps aux > somefile

相关内容