Ist "ps -u" wirklich eine schlechte Syntax?

75

IMHO ps -uzeigt eine sehr nützliche Ausgabe, viel besser als 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
:

verglichen mit

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 java
:
  1. Aber warum ist es "schlechte Syntax"? /usr/share/doc/procps-3.2.8/FAQhilft nicht viel
  2. Was wäre eine "richtige Syntax", um genau die gleiche Ausgabe zu erzielen?

Falls es wichtig ist:

$ 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
sjngm
quelle
5
Und nun zum schwierigen Teil: Welche Antwort sollte das Häkchen bekommen?
Sonntag,
Eigentlich dachte ich, ich sollte dich, die Benutzer, entscheiden lassen. Der mit den höheren Stimmen sollte es bekommen. Aber du machst das nicht einfacher;)
sjngm
6
Wenn beide Antworten gleich gut sind, stimme ich beiden zu und gebe dem Benutzer mit den niedrigeren Wiederholungen das Häkchen, insbesondere wenn die Differenz mehr als 100.000 beträgt.
Frank Thomas
1
@ FrankThomas fertig :)
Juni
Auf SysV-basierten Systemen (oder solchen, psdie aus dieser Reihe von Dingen stammen) verwende ich häufig ps -fu $USER... um eine ps -fAusgabeformatierung zu erhalten, die der Formatierung etwas ähnlich ist ps u, aber auch die Sache mit der Benutzerspezifikation. Für den Fall, Sie wollten beide gleichzeitig.
Lindes-hw

Antworten:

130

Die korrekte Syntax, die dieselbe Ausgabe zurückgibt , wäre:

ps u

Es gibt einen guten Grund, warum die moderne Syntax für psein Chaos ist. Historisch gesehen gab es zwei inkompatible Versionen von ps. Optionen mit einem führenden Gedankenstrich wurden von der AT & T Unix-Version von geerbt ps. Optionen ohne führenden Gedankenstrich wurden von BSD geerbt. Die Version psdieser Linux-Distributionen, die im Allgemeinen verwendet wird, ist GNU, das beide Optionssätze zusammengeführt und eigene Optionssätze hinzugefügt hat, die mit einem führenden Doppelstrich beginnen.

So ps uist BSD-Stil und ps -u $USERist AT & T-Stil. Die Tatsache, psdass Sie mit GNU ausführen ps -uund abgesehen von der Warnung die gleiche Ausgabe erhalten können, ps uzeigt, dass GNU versucht, das Beste aus einer schlechten Situation zu machen.

John1024
quelle
Eigentlich gibt es keinen guten Grund für das Durcheinander. Es gibt mehrere schlechte, und die angebliche Zweiteilung von "GNU" und "BSD" ist ein Irrtum, den eine Linux-Handbuchseite vorschlägt. Siehe unix.stackexchange.com/a/511530/5132 .
JdeBP
84

Der psBefehl hatte historisch gesehen eine völlig andere Syntax in BSD und System V Unix.

  • In BSDps nimmt die uOption (kein Bindestrich) keinen Parameter und zeigt die "benutzerorientierte Ausgabe" mit den zusätzlichen Spalten an.

  • In SunOSps-u übernimmt die Option (mit Bindestrich) einen Benutzernamen als Parameter und schließt nur Prozesse ein, die diesem Benutzer gehören, ohne jedoch das Anzeigeformat zu ändern.

(Als weiteres sehr verbreitetes Beispiel ebedeutet BSD "Umgebung anzeigen", während SunOS -e"alle Prozesse anzeigen " bedeutet.)

Linux procps ps versucht beide Stile zu unterstützen. Wenn Sie also die Option 'dash' verwenden -u, wird erwartet, dass es sich um die SunOS-Option "Diesen Benutzer filtern" handelt, nicht um die Option für erweiterte Spalten. Die beiden häufig genug verwirrt sind jedoch, dass procps versucht zu tun , was Sie Meant - wenn der Benutzername fehlt, es wird vorausgesetzt , dass Sie es ein BSD - Option gab aber verwendet SunOS Syntax.

(Es gab in der Tat so viele verschiedene Varianten, psdass der Procps eine tatsächliche Tabelle von "Persönlichkeiten" hat, um zu erzwingen, dass mehrdeutiges Verhalten als der eine oder andere Stil interpretiert wird - zusätzlich zu Knöpfen wie "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...)

Grawity
quelle
29
"I_WANT_A_BROKEN_PS" hah.
42
... Zuerst dachte ich, das sei ein Witz. Aber nein ...
Izkata
9
Hmm, wie sich herausstellt, ist dies genau die Option, um die "mehrdeutige Verwendung" der Warnungen, die OP sieht, zu verbergen.
Grawity