通过实验,似乎即使使用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