当我使用
pstree
时,我看到行仅达到终端宽度(即没有自动换行),但是当我 grep
输出时,它确实会换行。它使用什么函数来改变这种行为?
bash$ pstree
\--= 76211 _spotlight /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker MDSImporte
bash$ pstree | grep MDSImporte
\--= 76211 _spotlight /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker MDSImporterWorker com.apple.Spotlight.ImporterWorker.89
pstree
似乎认为您不想要包装输出,因此它会向终端询问其宽度并输出同样多的信息。 top
和 ps
表现相似。
您可以通过管道输出来避免这种情况
cat
:
pstree | cat
编辑:啊,我看到你不想避免它,而是添加切碎。
一种简单的方法是通过
less -S
(或更详细地说是 less --chop-long-lines
)管道输出命令的输出。 (您可能希望将其与其他一些选项结合起来,请参阅手册页,具体取决于您的喜好)。
pstree | grep MDSImporte | less -SEX
将显示您以终端尺寸切断的线条。
pstree
必须检查它是否正在写入终端,如果是,它会查询终端的列宽,然后相应地限制输出。你可以做类似的事情:
WIDTH=`stty size | cut -d ' ' -f 2` # Get terminal's character width
pstree | grep MDSImporte | cut -c 1-${WIDTH} # Chop output after WIDTH chars
其他实用程序(例如
less
)可以为您执行此操作,但可能会产生其他副作用(例如提示您在每页输出后按空格键)。
还有...
如果您询问如何确定脚本是否正在写入终端、文件或管道,您可以这样做:
[ -t 1 ] && WIDTH=`stty size | cut -d ' ' -f 2`
pstree | grep MDSImporte | cut -c 1-${WIDTH}
当且仅当标准输出是终端时,才会设置
WIDTH
。如果是,它将限制输出为 WIDTH
个字符(例如通过调用 cut -c 1-80
)。如果不是,它不会限制输出(因为 cut -c 1-
不执行任何操作)。
它检查输出是否是终端。
其他程序也做类似的事情:
grep --color=auto
ls --color=auto
只需将任意终端命令的输出通过管道传输到 cut 中,当您调整终端大小时,它会自动更新 COLUMNS 的值
pstree | cut -c1-$COLUMNS
systemd-+-ModemManager---3*[{ModemManager}]
|-NetworkManager---3*[{NetworkManager}]
|-accounts-daemon---3*[{accounts-daemon}]
|-avahi-daemon---avahi-daemon
|-canonical-livep---12*[{canonical-livep}]
|-colord---3*[{colord}]
|-containerd---18*[{containerd}]
|-containerd-shim-+-supervisord-+-/usr/sbin/a
| | |-check-for-c
| | |-cron
| | |-dovecot-+-a
| | | |-c
| | | `-l
| | |-fail2ban-se
| | |-opendkim---
| | |-opendmarc--
| | |-postfix-wra
这适用于 ubuntu 笔记本电脑...不知道 osx