題 “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

75
2017-10-14 06:49


起源


闡明答案。謝謝你的詢問! - Frank Thomas
現在是困難的部分:哪個答案應該得到勾選? - sjngm
實際上我認為我應該讓你,用戶,決定。具有較高upvotes的那個應該得到它。但是,你並沒有讓這更容易;) - sjngm
當兩個答案都同樣好的時候,我支持兩者,並給具有較低代表的用戶勾選標記,特別是當差異超過100k時。 - Frank Thomas
@FrankThomas完成了:) - sjngm


答案:


正確的語法, 返回相同的輸出, 將會:

ps u

現代語法有一個很好的理由 ps 是一個爛攤子。從歷史上看,有兩個不兼容的版本 ps。帶有前導破折號的選項繼承自AT&T Unix版本 ps。沒有前導破折號的選項繼承自BSD。版本 ps Linux發行版通常使用的是GNU,它將兩組選項合併在一起,並添加了自己的一組選項,以一個領先的雙破折號開頭。

從而, ps u 是BSD風格的 ps -u $USER 是AT&T風格。 GNU的事實 ps 允許你跑 ps -u 而且,除了警告,獲得相同的輸出 ps u 表明GNU正試圖充分利用糟糕的情況。


130
2017-10-14 06:54





ps 歷史上,命令在BSD和System V Unix中具有完全不同的語法。

  • BSD psu 選項(無破折號)不帶參數,並顯示帶有附加列的“面向用戶的輸出”。

  • 在SunOS ps-u option(帶破折號)將用戶名作為參數,僅包含該用戶擁有的進程,但不更改顯示格式。

(作為另一個非常常見的例子,BSD e 表示“展示環境”,而SunOS -e 意思是“展示每個人的過程”。)

Linux的 procps的  ps 試圖支持這兩種風格。所以如果你使用'破折號'選項 -u,它會期望它是SunOS“過濾此用戶”選項,  擴展列選項。然而,兩者經常混淆不清 procps的 嘗試做你想做的事 - 如果缺少用戶名,它會假設你給了它一個BSD選項但是使用了SunOS語法。

(實際上有很多不同的變種 ps 那個 procps的 有一個實際的“人格”表,以強制模糊行為被解釋為一種風格或另一種風格或另一種風格 - 此外 像“UNIX95”,“CMD_ENV”,“_ XPG”,“I_WANT_A_BROKEN_PS”這樣的旋鈕...)


84
2017-10-14 07:04



“I_WANT_A_BROKEN_PS”哈。
......起初,我認為這是一個笑話。 但是沒有...... - Izkata
嗯,事實證明,這正是隱藏OP所看到的警告的“模糊用法”的選項。 - grawity