在 Bash 中动态修剪标准输出线宽

len*_*ils 12 shell bash cut stdout

最近,我一直在试验这个ps命令,有时长路径会绕到下一行(或两行)并使其难以阅读。我想将ps输出通过管道传输到另一个程序以将输出限制x为字符数。

这是我到目前为止所拥有的,但它并不完全正确:

ps aux | cut -c1-$(stty size | cut -d' ' -f2)
Run Code Online (Sandbox Code Playgroud)

$(stty size | cut -d' ' -f2)计算结果为 167,但似乎不是cut.

有没有办法让这种类型的语法在 bash 中工作?

Joh*_*024 8

以下工作:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)
Run Code Online (Sandbox Code Playgroud)

这也有效:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v
Run Code Online (Sandbox Code Playgroud)

问题似乎是stty需要在其标准输入上使用 tty 才能运行。以上两种方法解决了这个问题。

还有另一种选择。虽然stty的 stdin 和 stdout 在上面的命令中都被重定向,但它的 stderr 不是:它仍然指向一个终端。奇怪的是,stty如果将 stderr 作为输入,它也可以工作:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 8

一些shell喜欢zshbash或者mksh自动将$COLUMNS变量设置为终端的宽度,所以你不需要在stty这里调用。

ps我尝试过的所有实现都支持非标准(BSD 类型)语法自行查询终端宽度。我很惊讶你的没有。我希望它会查看COLUMNS 环境变量的内容。

所以你可以这样做:

export COLUMNS; ps aux
Run Code Online (Sandbox Code Playgroud)

如果不,

ps aux | cut -c"1-$COLUMNS"
Run Code Online (Sandbox Code Playgroud)

您还可以告诉终端不要换行:

tput rmam
ps aux
Run Code Online (Sandbox Code Playgroud)