从实验来看,即使使用ps aux | grep ... ps aux | grep ...输出取决于terminal的大小。 这对我来说似乎非常怪异。
是不是pipe道应该使命令的输出以可预测的方式行事?
例如, ls在自己运行的时候可以完成所有奇妙的格式化,但是像ls | less一样运行 它总是返回相同的输出样式。
但是与ls不同, ps aux | less的输出 在FreeBSD上至less减less了对terminal宽度的线(至less在bash上)。 在我简短的实验中,使用pipe道时,相同的命令总是在Linux中输出全长线。
为什么会发生这种情况,我该如何解决?
这只是一个奇怪的FreeBSD默认? 根据我的理解,这个“特性”使得在FreeBSD上编写可靠的bash脚本几乎是不可能的,因为简单的pipe道命令的输出将不可靠。 这不是问题吗?
更新:感谢伯特,我已经尝试了ps aux > somefile , 文件内的行被完全剪切,就像grep和less一样!
信息:FreeBSD 10.2,bash 4.3.42,通过SSH连接或通过KVM本地login时相同。
这不是pipe道 。 你的问题的一部分是你的传呼机, less 。 默认情况下,它的截断长度与您的terminal相同。 你可以通过告诉它不要这样做来解决这个问题:
ps aux | less -S
ps检测窗口宽度和输出适合
手册页有一个方法可以绕过这个:
-w使用132列来显示信息,而不是默认的窗口大小。 如果多次指定-w选项,则ps将根据需要使用尽可能多的列,而不考虑您的窗口大小。 请注意,如果“命令”列不是最后一列显示,则此选项无效。
另一个解决scheme是将输出传送到一个文件
ps aux > somefile