Was ist ein Argument ohne Option?

9

Ich versuche zu verstehen , info whoaber komplett auf den Begriff scheitern » Nicht-Optionsargument «. Kann mir bitte jemand diesen Begriff in einfachen Worten oder einem Beispiel erklären?

UPDATE : von 'info who':

Wenn keine Nichtoptionsargumente angegeben werden , gibt "who" die folgenden Informationen für jeden aktuell angemeldeten Benutzer aus: Anmeldename, Terminalleitung, Anmeldezeit und Remote-Hostname oder X-Anzeige.

Wenn ein Argument ohne Option angegeben wird , wird who' uses that instead of a default system-maintained file (often/ var / run / utmp 'oder /etc/utmp') as the name of the file containing the record of users logged on. / var / log / wtmp' häufig als Argument für "who" angegeben, um zu sehen, wer sich zuvor angemeldet hat.

Wenn zwei Argumente ohne Option angegeben werden , who' prints only the entry for the user running it (determined from its standard input), preceded by the hostname. Traditionally, the two arguments given arebin ich ', wie in' Wer bin ich '.

Ich [dachte] den Unterschied zwischen einem Argument und einer Option zu kennen, aber das [wieder] macht viel nix.

erch
quelle
3
Wenn ich die Informationen nicht gesehen hätte, hätte ich nie geglaubt, dass jemand den Begriff "keine Argumente ohne Option" verwenden würde. Das ist ziemlich lahm.
slm
1
"Die Zeit, die ich damit verbracht habe, solche Dinge herauszufinden" vs. " tatsächlich zu lernen, wie man das gewonnene Wissen nutzt ", ist für mich ungefähr 7: 3. Was zu der ernsthaft gemeinten Frage führt: Was mache ich falsch?!
Erch
1
Ich denke, das ist ziemlich normal, besonders wenn du anfängst. Nachdem Sie ein ausreichend großes Basiswissen aufgebaut haben, sehen Sie die sich wiederholenden Muster um Unix und die Dinge werden einfacher. Wie lange bist du schon dabei? Bah du bist 20 Jahre alt? Du machst es gut, mach weiter so, es wird einfacher!
slm
1
Das Schwierigste ist, sich das Wissen anzueignen, es wird auch einfacher, aber ppl baut diese Systeme seit über 40 Jahren. Erwarten Sie also nicht, dass die Dinge sofort kommen, Sie müssen es wollen.
slm
3
GNU- infoSeiten haben wahrscheinlich mehr Schaden angerichtet, um UNIX lernen zu können. Sie sind schwieriger zu verwenden und zu navigieren als Manpages, und da sie existieren, betrachten die meisten Leute eine echte Manpage als optional. Sie erhalten also eine schreckliche Dokumentation. Dies ist ein Teil dessen, was mich dazu gebracht hat, die BSDs, insbesondere OpenBSD, zu lieben. Die Manpages sind fast immer gut und nützlich. Wenn dies nicht der Fall ist, halten die Entwickler dies für einen Fehler.
Kurtm

Antworten:

8

Die Terminologie ist nicht vollständig festgelegt, daher verwenden unterschiedliche Dokumentationen unterschiedliche Begriffe oder, schlimmer noch, dieselben Begriffe mit unterschiedlichen Bedeutungen. Die Terminologie in der Manpage, die Sie lesen, ist weit verbreitet. Es ist das im POSIX- Standard verwendete. Kurz gesagt, jedes Wort nach dem Befehl ist ein Argument, und die Argumente, mit denen beginnen, -sind Optionen.

Streit

In der Shell-Befehlssprache wird ein Parameter an ein Dienstprogramm übergeben, der einer einzelnen Zeichenfolge im argv-Array entspricht, das von einer der exec-Funktionen erstellt wurde. Ein Argument ist eine der Optionen, Optionsargumente oder Operanden nach dem Befehlsnamen.

Operand

Ein Argument für einen Befehl, der im Allgemeinen als Objekt verwendet wird, das Informationen an ein Dienstprogramm liefert, das zum Abschließen seiner Verarbeitung erforderlich ist. Operanden folgen im Allgemeinen den Optionen in einer Befehlszeile.

Möglichkeit

Ein Argument für einen Befehl, der im Allgemeinen verwendet wird, um Änderungen im Standardverhalten des Dienstprogramms anzugeben.

"Dienstprogramm" wird allgemein als "Befehl" bezeichnet (der Standard verwendet das Wort " Dienstprogramm" , um Mehrdeutigkeiten mit der Bedeutung von "Befehl" zu vermeiden, die die Argumente oder sogar zusammengesetzte Shell-Befehle enthält).

Die meisten Befehle folgen der Standard-Utility-Argument-Syntax , wobei Optionen mit einem -(Bindestrich oder Minus) beginnen. Eine Option ist also so etwas wie -a(kurze Option, folgt den POSIX-Richtlinien) oder --all(lange Option, eine Erweiterung von GNU). Ein Nicht-Optionsargument ist ein Argument, das nicht beginnt -oder nur aus -(das whoals Literal-Dateiname behandelt wird, aber viele Befehle entweder als Standardeingabe oder als Standardausgabe behandelt werden).

Darüber hinaus haben einige Optionen selbst ein Argument. Dieses Argument kann auf verschiedene Arten übergeben werden:

  • Für eine Ein-Buchstaben - Option, in dem gleichen Argumente für die Nützlichkeit: foo -obar: barist das Argument für die Ein-Buchstaben - Option -o.
  • In der GNU-Langargument-Syntax, im selben Argument, durch ein Gleichheitszeichen getrennt : foo --option=bar.
  • In einem separaten Argument: foo -o baroder foo --option bar. Wenn die Option -o(oder --option) ein Argument akzeptiert, barist dies das Argument der Option -o(oder --option). Wenn -o(oder --option) kein Argument akzeptiert, barhandelt es sich um einen Operanden.

Hier ist ein längeres Beispiel:

tail -n 3 myfile

-nist eine Option, 3ein Argument für die Option -nund myfileein Operand.

Die Terminologie ist unterschiedlich, daher finden Sie möglicherweise Dokumente, die Argumente in dem Sinne verwenden, in dem POSIX den Operanden verwendet . "Nicht-Optionsargument" ist jedoch häufiger als jeder Begriff für diese Bedeutung.

Gilles 'SO - hör auf böse zu sein'
quelle
Meine Bearbeitung wurde abgelehnt, daher erwähne ich alles in einem Kommentar: 1. Dies ist der Link zum neuesten POSIX-Standard. 2. Bei Optionen mit einem Buchstaben werden die Optionsargumente durch <leer> Zeichen getrennt von ihren Optionen angezeigt, es sei denn, das Optionsargument ist optional (was vom Standard ohnehin nicht empfohlen wird). 3. "Wenn -okein Argument verwendet wird, -ohandelt es sich um einen Operanden." sollte sein "... das barist ein Operand".
David
@ David Ich habe Ihre Bearbeitung abgelehnt, weil sie einen neuen Fehler verursacht hat und weil es schwieriger war, dem Text zu folgen. Ich konnte nicht herausfinden, was der Fehler in meiner Antwort war, den Sie unter all den anderen Änderungen behoben haben. Vielen Dank für den Hinweis, ich werde es beheben. Die Verknüpfung mit dem neuesten Standard gegenüber einem älteren ist nicht wichtig: Dies ist ein sehr traditionelles Zeug, das sich seit Jahrzehnten nicht geändert hat.
Gilles 'SO - hör auf böse zu sein'
Eigentlich habe ich keinen Fehler gemacht. Es wurde unter " Lange Optionen können auch separat argumentiert werden " abgelehnt . Ich habe nichts über lange Optionen geschrieben, das hast du :) Das Problem ist, dass ich die Reihenfolge der 3 Elemente in der Liste ändere und das Dienstprogramm diff, das die Unterschiede zwischen beiden Versionen hervorhebt, völlig durcheinander gebracht wurde. Es war schwer zu sehen, dass ich mich sehr wenig verändert habe: genau das, was ich in meinem Kommentar erwähnt habe. Ich stimme zu, dass die Verknüpfung mit dem neuen Standard nicht wichtig ist. Ich habe es getan, weil es klarer erklärt, dass die Syntax -obarfür optionale Optionsargumente reserviert ist.
David
Bitte löschen Sie alle Kommentare, nachdem Sie sie gelesen haben. Sie fügen der Antwort nichts hinzu. Und lassen Sie mich für all Ihre Beiträge zu dieser Community und zu StackOverflow danken. Und ich meine nicht nur exzellente Antworten.
David
5

Die Sache ist, dass Optionen (oder Schalter oder Flags, wie auch immer Sie sie nennen möchten) ebenfalls als Argumente gelten. Tatsächlich bildet alles, was Sie nach dem Befehlsnamen selbst angeben, die Argumente des Befehls (mit Ausnahme von Konstrukten, die von der Shell verwendet werden, wie z. B. Umleitung).

Ihr Programm / Skript empfängt alles zusammen als Argumente und muss die Optionsargumente (Argumente, die Optionen sind) von anderen trennen ... Sie haben es erraten! ... Nicht-Optionsargumente .

Auf der Infoseite heißt es also, dass beim whoEmpfang eines Arguments, das keine Option ist, diese als Alternative zur Standarddatei für Anmeldeinformationen herangezogen wird.

Joseph R.
quelle
3
Wenn ich das nicht gesehen info whohätte, hätte ich nie geglaubt, dass jemand den Begriff "keine Argumente ohne Option" verwenden würde. Das ist ziemlich lahm.
slm
@slm Das weiß ich nicht. Technisch immer noch korrekt ...
Joseph R.
Verstehe ich das richtig: Alles, was keine Option ist, ist kein Argument ?! ** Und auch: Option = Schalter = Flag = Argument ?
Erch
@chirp Alles, was keine Option ist, ist immer noch ein Argument, aber es ist ein Argument ohne Option . Nur um die Verwirrung zu vergrößern: Einige Optionen können Argumente haben :) Oh und option = switch = flag gilt lose, ja.
Joseph R.
1

Ich denke immer noch, dass die Formulierung diesbezüglich schlecht ist und würde versuchen, nicht aufgehängt zu werden. Sie versuchen zu sagen, dass sie in der Prototyp-Erklärung Folgendes aufgenommen haben:

 `who' [OPTION] [FILE] [am i]

Wenn sie also sagen "Wenn keine Argumente ohne Option angegeben werden", beziehen sie sich auf [FILE]und [am i].

Wenn Sie dieser Logik folgen, wenn sie sagen "Wenn ein Argument ohne Option angegeben wird", [FILE]überschreiben Sie den [FILE]Speicherort /var/run/utmp.

Zuletzt für diesen Kommentar "Wenn zwei Argumente ohne Option angegeben werden", dh [am i]Sie fragen nach Informationen über den Benutzer, der gerade den Befehl ausgeführt hat:

$ who am i
saml     pts/5        2013-10-18 16:29 (:0.0)

-or-

$ who mom likes
saml     pts/5        2013-10-18 16:29 (:0.0)

Die Beschreibung ist passend, aber sie haben sie definitiv verwirrt, indem sie den Begriff "keine Argumente ohne Option" verwendeten.

Nach Ansicht der Autoren sind dies die Optionen:

  -a, --all         same as -b -d --login -p -r -t -T -u
  -b, --boot        time of last system boot
  -d, --dead        print dead processes
  -H, --heading     print line of column headings
  -l, --login       print system login processes
      --lookup      attempt to canonicalize hostnames via DNS

  ....

Und [FILE]und [am i]und [mom likes]sind die Nichtoptionen. Dies sind jedoch ALLE Optionen, sodass der Unterschied nur auf dieses Tool beschränkt ist!

slm
quelle
1
"Nicht-Optionsargument" ist eine Standardterminologie (sowohl wörtlich als auch umgangssprachlich). Siehe meine Antwort .
Gilles 'SO - hör auf böse
1
@ Gilles - Ich dachte, Sie oder Stephane würden dies erklären, ich denke immer noch, dass die Terminologie schlecht ist. Das Definieren von Dingen auf diese Weise ist wie das Verwenden einer negativen Sprache beim Definieren einer Bedingung in einer if-Anweisung. if ($notStatus != option). Ich verstehe, was es bedeutet, aber es ist bestenfalls verwirrend. Gute Antwort übrigens, wie üblich 8-)
slm