UNIX-, BSD-, GNU-Optionen im Linux-Befehl ps. Woher kommen sie?

7

Im Handbuch für den psBefehl unter Ubuntu gibt es diesen Text:

Diese Version von ps akzeptiert verschiedene Arten von Optionen:

   1   UNIX options, which may be grouped and must be preceded by a
       dash.
   2   BSD options, which may be grouped and must not be used with
       a dash.
   3   GNU long options, which are preceded by two dashes.

Warum ist es möglich, dass ein in Ubuntu erstellter Befehl Optionen von verschiedenen Betriebssystemen verwendet? Ich weiß, dass der Ursprung von Linux, UNIX und BSD gleich ist, aber es handelt sich um unterschiedliche Zweige.

YarLinux
quelle
5
Ich verstehe nicht wirklich, was Sie fragen. Es ist nur ein anderes Argument "Stile". Hier passiert nichts "Interessantes" außer den beeindruckend großen möglichen Argumenten, die ps benötigt.
Mat
1
Ich habe dies für die Wiedereröffnung nominiert, weil der Grund für die Schließung falsch ist. Als jemand sprechen , der recherchiert hat : Es ist möglich, dies mit Fakten zu beantworten. Die aktuelle Antwort ist Vermutung, ist falsche Vermutung; Eine korrekte Antwort kann jedoch nicht hinzugefügt werden.
JdeBP

Antworten:

10

Ich kann Ihnen nur eine allgemeine Antwort geben: Befehlszeilenoptionen werden häufig mithilfe der Bibliotheksfunktion analysiert getopt. Ursprünglich wurden nur Argumente akzeptiert, die aus einem - gefolgt von einem Symbol bestehen. Dies begrenzt effektiv die Anzahl der verfügbaren Optionen, mehr oder weniger -A bis -Z, -a bis -z und -0 bis -9. Sie können sich vorstellen, dass Sie eine Option nicht verwenden, ohne zumindest einen Hinweis auf die tatsächliche Verwendung zu haben, z. B. -h für Hilfe oder -v für Versionsinformationen oder ausführliche Ausgabe.

Unter Linux und der häufig zugeordneten Standard-C-Bibliothek glibc gibt es die Erweiterung getopt, mit der auch Optionen behandelt werden können. Damit verbunden ist, dass viele unter GNU entwickelte Befehle (wie glibc) diese Erweiterung verwendeten. Für viele Befehle haben Sie jetzt auch die Option GNU-ähnlichen Stil. -v und --verbose, -h und --help und so weiter. Ich denke, dasselbe ist bei BSD passiert (obwohl ich kein BSD-Typ bin, korrigieren Sie mich bitte).

Ihr psBefehl stammt aus einer Software-Sammlung namens procps, und ich denke , sie möchten den für eine bestimmte Plattform spezifischen Optionsstil nachahmen. Für die UNIX-Leute gibt es also Optionen. Für BSD akzeptiert es auch so etwas ps auxund so weiter.

psist nicht das einzige Programm, das sich so verhält. Viele der Standardprogramme verstehen den "alten" UNIX-Stil (POSIX) und einige moderne Erweiterungen.

AlphaOne
quelle
1
Willkommen beim Stack-Austausch von Unix und Linux! Sie haben einen hervorragenden Start hingelegt.
6

Es ist alles wegen einer Person namens Albert D. Cahalan. Xe kannte BSD nicht.

Der ursprüngliche psBefehl für Linux wurde im März 1992 von Branko Lankester geschrieben und erstmals veröffentlicht . Es wurde später als "kmem-ps" bekannt, um es von "proc-ps" zu unterscheiden, die im Dezember 1992 von Michael K. Johnson veröffentlicht wurden . M. Lankester hat psdas kmemGerät verwendet, um die Prozesstabelle aus dem Kernelspeicher zu lesen. M. Johnson hat psdas procDateisystem zum Lesen der Prozesstabelle verwendet, und in den nächsten Jahren wurden mehrere Versionen davon veröffentlicht (z. B. Januar 1993 , Januar 1994 ).

Diese psBefehle lieferten schon damals eine ziemlich alte Syntax für den Befehl, dessen Stil aus den getopt()Tagen der 1980er Jahre stammte . Hier ist es aus einer Veröffentlichung von kmem-ps im November 1993 :

Verwendung: ps 0acefhHjlmnprsStuUvwxXy [t tty] [pid [, pid] ...]

j - Jobsteuerungsformat, l - Langformat, m - Speicherformat,
s - Signalformat, u - Benutzerformat, v - virtuelles Speicherformat,
X-Register-Format, Y-Syscall-Format, Standard-Kurzformat

0 - Aufgabe Null einschließen, a - Prozesse für alle Benutzer einschließen
c - Nur Befehlsname drucken, E-Show-Umgebungsvariablen, F-Gesamtstruktur der Prozesse
h - Kopfzeile unterdrücken, n - Benutzer- und wchan-Felder numerisch drucken
p - Anzahl der Drucke in Seiten, r - Auflistung auf ausführbare Prozesse beschränken
S - Fassen Sie die Verwendung für Kinder in den Feldern CPU-Zeit und Seitenfehler zusammen
t tty - Zeigt alle Prozesse mit TTY als steuerndem Terminal an
w - wide: 132, ww - 264, www - unbegrenzt, Standard - Bildschirmbreite oder 80
x - Prozesse ohne steuerndes Terminal einschließen
U [SYSTEM-PATH [SWAP-PATH]] - PS-Datenbank aktualisieren

Wie Sie sehen können, gab es eine Persönlichkeit, eine einzige Bedeutung für die Buchstaben und keine führenden Minuszeichen.

Die Idee einer UFlagge (nicht -Ubeachten) stammt aus einem Patchps von 1986 an BSD , der mod.sourcesvon Michael A. Callahan in der Usenet- Newsgroup (als Band 6, Ausgabe 83) veröffentlicht wurde.

Einige Jahre später kam Albert D. Cahalan, der Proc-ps neu schrieb. Xe machte viele Behauptungen darüber. Leider wurde das Entlarven vieler dieser Behauptungen vergessen, und all diese Jahre später steht das psHandbuch, das behauptet, dass dies psUnix-, BSD- und GNU-Optionssyntax bietet.

Es tut nicht.

BSD pshat die getopt()Optionsverarbeitung verwendet, seit Marc Teitelbaum sie im April 1990 geändert hat , Jahre bevor sogar die Linux-Version von M. Lankester ps, geschweige denn die von A. Cahalan.

A. Cahalan hat psdie alte Linux-Syntax kmem-ps / proc-ps bereitgestellt. Später wurde eine Syntax hinzugefügt, die A. Cahalan angeblich vom AIX- psBefehl stammt. A. Cahalan, der unerbittlich die Ansicht im Usenet vertrat, dass "BSD saugt und SysV nicht", dass FreeBSD "saugt" und dass das xyr-Umschreiben von proc-ps eine "standardkonforme /bin/ps" war, die "Ihre veraltete BSD-Syntax" unterstützte , Ironischerweise war ihm nicht bewusst, dass dies zu diesem Zeitpunkt fast ein Jahrzehnt lang nicht die BSD-Syntax gewesen war. psselbst war in diesem Jahr gerade erst standardisiert worden. Die Analyse in der Begründung des Standards von BSD im Vergleich zu AT & T Unix-Befehlszeilenoptionen sind viel nachdenklicher als alle anderen von A. Cahalan.

Dies führte psbekanntermaßen die I_WANT_A_BROKEN_PSUmgebungsvariable ein, die A. Cahalan verwirrenderweise M. Johnson vorwarf und gleichzeitig behauptete, xyrself sei für das Parsen der Optionen verantwortlich. Tatsächlich behielten die beiden zwei psImplementierungen parallel bei .

Seltsamerweise würde Cahalan / Johnson Folgendes angeben , wenn man getopt()Optionen im Stil verwendet, denen Minuszeichen vorangestellt sind, wie dies pszu der Zeit für BSD der Fall war und als (damals) neuer Standard für psdokumentierte ps:

Warnung: `- 'veraltet; benutze `ps e ', nicht` ps -e'

Eigentlich wurde es nicht benutzt -, was veraltet war. In der Tat war die Behauptung von A. Cahalan, dass xyr psauf die übliche Weise funktionieren würde, -wie es BSD psbereits getan hatte. Dies verursachte in den späten 1990er und frühen 2000er Jahren zahlreiche Fragen von verwirrten Benutzern und verwirrte Systemadministratoren und Benutzer im Allgemeinen, als Bücher anfingen, Dinge zu sagen wie:

Sie fragen sich vielleicht, warum wir keine Bindestriche vor den Flags mit verwenden ps. Sie können sie verwenden, aber psdas ist die altmodische Art und Sie erhalten eine Warnung , dass Sie sich an das Programm halten müssen.
- Deborah S. Ray und Eric J. Ray (1998). UNIX . Peachpit Press. ISBN 9780201353952. p. 174.

Sie können dies immer noch in dem oldpsHandbuch sehen, das davon spricht, "von der BSD-Version von ps" abgeleitet zu sein, obwohl dies wirklich nicht der Fall war, da es ziemlich offensichtlich von der Linux- Version abgeleitet ist. und die besagt, dass "Befehlszeilenargumenten kein" - "vorangestellt werden sollte, da in Zukunft ein" - "verwendet wird, um Unix98-Standard-Befehlszeilenargumente anzugeben, während kein" - "das angibt aktueller "erweiterter BSD" -Stil von Befehlszeilenargumenten ".

Einiges davon wurde in procps-ng abgeschwächt, einem dritten Umschreiben, das kurz nach der Jahrhundertwende durchgeführt wurde (als "-ng" in Projektnamen à la mode war), als Cahalan / Johnson pswurde oldps. Wie Sie sehen können, steht im psHandbuch nicht mehr "erweitert". Aber die neue Version von ps(an der noch A. Cahalan beteiligt war ) hat die gesamte Idee der Mehrfachpersönlichkeit auf die Spitze getrieben . Leider es darüber hinaus noch verewigte die canard über BSD - Befehlszeilenoptionen, und tut dies bis heute.

In der Zwischenzeit die glücklich Single -Persönlichkeit BSD pshat bereitgestellt getopt()Befehlszeilenoption Parsing für die letzten 29 Jahre und 7 Tage in der Zeit , diese Antwort zu schreiben; FreeBSD hat einen procstatBefehl erhalten; NetBSD und OpenBSD pshaben die neue Kompromissoption verfolgt -A. und die Single Unix Specification hat die neue BSD- -OOption für reserviert (aber nicht enthalten) ps.

Weiterführende Literatur

  • Robert NM Watson (14.01.2017). procstat. FreeBSD General Commands Manual .
  • ps. FreeBSD General Commands Manual . 2018-03-13.
  • ps. NetBSD General Commands Manual . 2016-12-02.
  • ps. OpenBSD General Commands Manual . 2016-10-26.
JdeBP
quelle
1
Beeindruckende Forschung. Ich hoffe, dass dies schnell an die Spitze gewählt wird. Nebenbei bemerkt, ich finde die seltsamen Pronomen betroffen und ablenkend, wenn ich über Albert Cahalan spreche; Hat Ihre Forschung herausgefunden, dass diese Pronomen von dieser Person speziell bevorzugt wurden? Wenn nicht, bleiben wir bitte bei den englischen Standardpronomen.
Wildcard
1
@Wildcard, Googeln "JdeBP" "Xe"(mit beiden Anführungszeichen) erzeugt ungefähr 5000 Treffer. Ich denke, das deutet darauf hin, dass der Autor Cahalans bevorzugte Personalpronomen nicht respektiert.
Ray Butterworth