恕我ps -u
直言,输出非常有用,比以下好得多ps -u $USER
:
$ ps -u
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
elastic 234897 0.0 0.0 105980 1336 pts/2 S+ Oct10 0:00 /bin/bash ./run.sh collector-json-1.conf
elastic 234899 48.7 7.1 10087120 4433104 pts/2 Sl+ Oct10 2804:11 /usr/java/jdk1.7.0_09_x64/bin/java -Xmx6144m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatin
:
相比
$ ps -u $USER
PID TTY TIME CMD
234897 pts/2 00:00:00 run.sh
234899 pts/2 1-22:44:04 java
:
- 但是,为什么它是“语法错误”?
/usr/share/doc/procps-3.2.8/FAQ
没有多大帮助。 - 什么是“正确的语法”来实现完全相同的输出?
如果它很重要:
$ uname -a
Linux h22k34.local 2.6.32-042stab044.17 #1 SMP Fri Jan 13 12:53:58 MSK 2012 x86_64 x86_64 x86_64 GNU/Linux
答案1
正确的语法,返回相同的输出, 将会:
ps u
现代的 语法很乱是有原因的ps
。从历史上看, 有两个不兼容的版本ps
。 带有前导破折号的选项继承自 AT&T Unix 版本的ps
。 不带前导破折号的选项继承自 BSD。ps
Linux 发行版通常使用的 版本是 GNU,它将两组选项合并在一起,并添加了自己的一组以双前导破折号开头的选项。
因此,ps u
是 BSD 风格,也是ps -u $USER
AT&T 风格。GNUps
允许您运行ps -u
,并且除了警告之外,获得与相同的输出,这一事实ps u
表明 GNU 正在尝试在糟糕的情况下做到最好。
答案2
从历史上看,该ps
命令在 BSD 和 System V Unix 中具有截然不同的语法。
(另一个非常常见的例子,BSD 的e
意思是“显示环境”,而 SunOS 的-e
意思是“显示每个人的进程”。)
Linux进程 ps
尝试支持这两种风格。因此,如果您使用“dash”选项-u
,它将认为它是 SunOS“过滤此用户”选项,不是扩展列选项。然而,这两个选项经常被混淆,进程尝试执行您的意思 – 如果缺少用户名,它会假定您给了它一个 BSD 选项但使用了 SunOS 语法。
(事实上,有很多不同的变体ps
,进程有一个实际的“个性”表,可以强制将模棱两可的行为解释为一种风格或另一种风格——此外旋钮如“UNIX95”、“CMD_ENV”、“_XPG”、“I_WANT_A_BROKEN_PS”...)