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 中工作?
以下工作:
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)
一些shell喜欢zsh
,bash
或者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)