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)