当我使用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
答案 0 :(得分:12)
pstree
似乎认为你不想要包装输出,因此它会向终端询问它的宽度和输出。 top
和ps
表现相似。
您可以通过cat
输出输出来避免这种情况:
pstree | cat
编辑:啊,我看到你不想避免它,但添加切碎。
一种简单的方法是将命令的输出通过less -S
(或less --chop-long-lines
,更详细地说明)。 (您可能希望将其与其他一些选项结合使用,请参阅手册页,具体取决于您的偏好。)
pstree | grep MDSImporte | less -SEX
将显示您在终端尺寸处切断的线条。
答案 1 :(得分:4)
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-
什么都不做)。
答案 2 :(得分:1)
检查输出是否为终端。
其他程序做类似的事情:
grep --color=auto
ls --color=auto