我正在尝试使用ps
指定的自定义格式读取-o
的输出。因为我想指定一个自定义分隔符,我正在使用AIX格式描述符(例如%p
用于pid,%a
用于args等),但在使用普通格式代码时会出现同样的问题。
当我在此格式字符串的末尾指定%a
时,所有内容都按预期工作:
$ echo 'while true; do sleep 1; done' > really-really-really-long-filename
$ bash really-really-really-long-filename &
[1] 31181
$ ps -p 31181 -o '%p|%a'
PID|COMMAND
31181|bash really-really-really-long-filename
但是,如果%a
不是最后一个字段,我会得到:
$ ps -p 31181 -o '%a|%p'
COMMAND | PID
bash really-really-really-l|31181
这似乎与任何屏幕宽度修饰符无关。还有其他什么在玩吗?
(GNU bash 4.1.5)
答案 0 :(得分:3)
也许不是最优雅的解决方案,但您可以混合和匹配格式,这样您就可以对选定的字段使用宽度控制。 E.g。
[me@home]$ ps -p 780 -o "%a|%p"
COMMAND | PID
dbus-daemon --system --fork| 780
[me@home]$ ps -p 780 -o args:50 -o "|%p"
COMMAND | PID
dbus-daemon --system --fork --activation=upstart | 780
至于截断发生的原因,我的 guess 是一个硬编码宽度,用于每个字段(除非用户指定宽度),当它不是最后一个字段时。这节省了程序必须首先缓冲输出以确定打印前的最大列宽。
如果是args
,则默认的硬编码宽度似乎为27
(请参阅this implementation of ps
中的第1302行)。
我应该提一下,这只是我的一个纯粹推测,可能不一定如此。