“ps -u”真的是一个错误的语法吗?

“ps -u”真的是一个错误的语法吗?

恕我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
:
  1. 但是,为什么它是“语法错误”?/usr/share/doc/procps-3.2.8/FAQ没有多大帮助。
  2. 什么是“正确的语法”来实现完全相同的输出?

如果它很重要:

$ 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。psLinux 发行版通常使用的 版本是 GNU,它将两组选项合并在一起,并添加了自己的一组以双前导破折号开头的选项。

因此,ps u是 BSD 风格,也是ps -u $USERAT&T 风格。GNUps允许您运行ps -u,并且除了警告之外,获得与相同的输出,这一事实ps u表明 GNU 正在尝试在糟糕的情况下做到最好。

答案2

从历史上看,该ps命令在 BSD 和 System V Unix 中具有截然不同的语法。

  • 北达科他州ps,该u选项(无破折号)不带参数,并使用附加列显示“面向用户的输出”。

  • 太阳操作系统ps,该-u选项(带破折号)以用户名作为参数,并且仅包含该用户拥有的进程,但不改变显示格式。

(另一个非常常见的例子,BSD 的e意思是“显示环境”,而 SunOS 的-e意思是“显示每个人的进程”。)

Linux进程 ps尝试支持这两种风格。因此,如果您使用“dash”选项-u,它将认为它是 SunOS“过滤此用户”选项,不是扩展列选项。然而,这两个选项经常被混淆,进程尝试执行您的意思 – 如果缺少用户名,它会假定您给了它一个 BSD 选项但使用了 SunOS 语法。

(事实上​​,有很多不同的变体ps进程有一个实际的“个性”表,可以强制将模棱两可的行为解释为一种风格或另一种风格——此外旋钮如“UNIX95”、“CMD_ENV”、“_XPG”、“I_WANT_A_BROKEN_PS”...)

相关内容