Unterschied zwischen Begriffen: "Option", "Argument" und "Parameter"?
70
Was sind die Unterschiede zwischen diesen Begriffen: "Option", "Argument" und "Parameter"? In Manpages scheinen diese Begriffe oft synonym verwendet zu werden.
Diese Begriffe sind in keiner Weise Shell-spezifisch: Argumente können zur Ausführungszeit eines Programms in einem Literal- argvArray übergeben werden, das als Argument für einen execvSyscall im Stil angegeben wird, ohne dass eine Shell beteiligt ist.
Charles Duffy
Antworten:
126
Ein Befehl ist in ein Array von Zeichenfolgen mit dem Namen Argumente unterteilt . Argument 0 ist (normalerweise) der Befehlsname, Argument 1, das erste Element nach dem Befehl usw. Diese Argumente werden manchmal als Positionsparameter bezeichnet .
$ ls -la /tmp /var/tmp
arg0 = ls
arg1 = -la
arg2 = /tmp
arg3 = /var/tmp
Eine Option ist ein dokumentierter Argumenttyp, der das Verhalten eines Befehls ändert , z. B. -lhäufig "lang", -vausführlich. -lvsind zwei Optionen, die in einem einzigen Argument zusammengefasst sind. Es gibt auch lange Optionen wie --verbose(siehe auch Verwenden von getopts zum Verarbeiten langer und kurzer Befehlszeilenoptionen ). Wie der Name schon sagt, sind Optionen normalerweise optional. Es gibt jedoch einige Befehle mit paradoxen "obligatorischen Optionen".
$ ls -la /tmp /var/tmp
option1= -l
option2= -a
Ein Parameter ist ein Argument, das Informationen entweder zum Befehl oder zu einer seiner Optionen bereitstellt , z. B. in -o file, Datei ist der Parameter der -oOption. Im Gegensatz zu Optionen, deren mögliche Werte in Programmen fest codiert sind, sind dies normalerweise keine Parameter, sodass der Benutzer die Zeichenfolge verwenden kann, die seinen Anforderungen entspricht. Wenn Sie einen Parameter übergeben müssen, der wie eine Option aussieht, aber nicht als solcher interpretiert werden sollte, können Sie ihn mit einem doppelten Bindestrich vom Anfang der Befehlszeile trennen : --.
$ ls -la /tmp /var/tmp
parameter1= /tmp
parameter2= /var/tmp
$ ls -l -- -a
option1 = -l
parameter1 = -a
Ein Shell-Parameter ist alles, was einen Wert im Kontext der Shell speichert. Dazu gehören Positionsparameter (zB $1, $2...), Variablen (zB $foo, $bar...) und Sonderzeichen diejenigen (zB $@)
Schließlich gibt es Unterbefehlen , die auch als Funktionen / (low-level) Befehle bekannt, die mit „Metacommands“ verwendet werden , die mehrere separate Befehle einzubetten, wie busybox, git, apt-get, openssl, und Ähnliches. Mit ihnen haben Sie möglicherweise globale Optionen vor dem Unterbefehl und unterbefehlsspezifische Optionen, die dem Unterbefehl folgen. Im Gegensatz zu Parametern ist die Liste der möglichen Unterbefehle im Befehl selbst fest codiert. z.B:
$ busybox ls -l
command = busybox
subcommand = ls
subcommand option1 = -l
$ git --git-dir=a.git --work-tree=b -C c status -s
command = git
command option1 = --git-dir=a.git
command option2 = --work-tree=b
command option3 = -C
subcommand = status
subcommand option1 = -s
Beachten Sie, dass einige Befehle wie test, tar, ddund findhaben kompliziertere Argument Parsen Syntax als die , die zuvor beschrieben und kann einige oder alle ihre Argumente haben geparst wie expressions, operands, keysund ähnlichen Befehl spezifische Komponenten.
Beachten Sie auch, dass optionale Variablenzuweisungen und -umleitungen, obwohl sie von der Shell für Tilde-Erweiterung, Parametererweiterung, Befehlssubstitution, arithmetische Erweiterung und Anführungszeichenentfernung wie andere Befehlszeilenparameter verarbeitet werden, in meiner Antwort nicht berücksichtigt werden, da sie verschwunden sind, wenn die Befehl wird tatsächlich aufgerufen und seine Argumente übergeben.
@jlliagre Sind "fest codierte Variablen" auch als Parameter bekannt? ZB ein Pfad zu einer Datei, den Sie nicht als Argument übergeben, sondern innerhalb des Bash-Skripts mithilfe der VARNAME="VALUE"Syntax erstellen . Wenn nicht (dh VARNAME ist kein Parameter), warum gilt das Konzept der Parametererweiterung dann auch für fest codierte Variablen?
Benutzer1534664
1
@ user1534664 Ich habe diese optionalen Variablenzuweisungen außerhalb des Bereichs meiner Antwort belassen, da sie vom ausgeführten Befehl nicht als Argumente angesehen werden. Ich habe Umleitungen aus dem gleichen Grund nicht berücksichtigt, aber Sie haben Recht, dass diese Zuweisungen aus Sicht des Shell-Interpreters wie andere Parameter für Tilde-Erweiterung, Parameter-Erweiterung, Befehlsersetzung, arithmetische Erweiterung und Entfernung von Anführungszeichen vorverarbeitet sind.
Jlliagre
@jlliagre Haben Sie eine Referenz für die Definitionen, die Sie oben angegeben haben? Als ich diese Begriffe im Bash-Handbuch nachgeschlagen habe, waren die Definitionen etwas anders als Ihre. In dem Handbuch wurden jedoch Konzepte wie lange Optionen nicht ausdrücklich erwähnt. Gibt es also möglicherweise eine bessere Referenz?
Joelostblom
@joelostblom Antwort aktualisiert mit einigen Links, einschließlich einiger Referenzen zu kurzen / langen Optionen.
Jlliagre
10
Die manSeite für einen typischen Unix - Befehl verwendet häufig die Begriffe argument, optionund parameter. Auf der untersten Ebene haben wir argumentund alles ist ein Argument, einschließlich des Befehls (Dateisystempfad zum) selbst.
In einem Shell - Skript zugreifen Sie Argumente der speziellen Variablen $0.. $n. Andere Sprachen haben ähnliche Möglichkeiten, auf sie zuzugreifen (üblicherweise über ein Array mit einem Namen wie argv).
Argumente können auf Wunsch als Optionen interpretiert werden . Wie dies gemacht wird, ist implementierungsspezifisch. Sie können entweder Ihre eigenen rollen, zum Beispiel kann ein Shell- bashSkript (wie z. B. ) ein bereitgestelltes Skript getoptsoder getoptBefehle verwenden.
Diese definieren normalerweise eine Option als Argument, das mit einem Bindestrich ( -) beginnt, und einige Optionen verwenden möglicherweise fortlaufende Argumente als Parameter. Leistungsfähigere Parser (z. B. getopt) unterstützen das Mischen von Optionen für Kurzform ( -h) und Langform ( --help).
Normalerweise nehmen die meisten Optionen null oder einen Parameter an. Solche Parameter werden manchmal auch als Werte bezeichnet .
Die unterstützten Optionen sind im Programmcode codiert (z. B. beim Aufruf getoptseines Shell-Skripts). Alle verbleibenden Argumente, nachdem die Optionen verbraucht wurden, werden üblicherweise als Positionsparameter bezeichnet, wenn die Reihenfolge, in der sie angegeben werden, signifikant ist (dies steht im Gegensatz zu Optionen, die normalerweise in beliebiger Reihenfolge angegeben werden können).
Auch hier definiert das Skript die Positionsparameter, indem es sie verwendet und verwendet.
Also ein typischer Befehl
$ ls -I README -l foo 'bar car' baz
sieben Argumente hat: /usr/bin/ls, -I, README, -l, foo, bar car, und bazzugänglich wie $0durch $6. Die -lund -Iwerden als Optionen interpretiert , wobei letztere einen Parameter (oder Wert ) von haben README. Was bleibt, sind Positionsparameter ( foo, bar carund baz).
Durch das Parsen von Optionen kann die Argumentliste geändert werden, indem die verwendeten Elemente entfernt werden (z. B. mit shiftoder set), sodass nur die Positionsparameter übrig bleiben und danach als $1... zugänglich sind $n.
Da die Frage mit "bash" gekennzeichnet ist, habe ich im Bash-Handbuch nach relevanten Abschnitten gesucht . Ich liste diese unten als zitierte Passagen zusammen mit meinen eigenen Zusammenfassungen mit einem Satz auf.
Argumente
Alles, was dem Befehl folgt, ist ein Argument.
Ein einfacher Shell-Befehl echo a b cbesteht beispielsweise aus dem Befehl selbst, gefolgt von Argumenten, die durch Leerzeichen getrennt sind.
Ein einfacher Befehl ist die Art von Befehl, die am häufigsten vorkommt. Es ist nur eine Folge von Wörtern, die durch Leerzeichen getrennt sind und von einem der Steueroperatoren der Shell abgeschlossen werden (siehe Definitionen). Das erste Wort gibt im Allgemeinen einen auszuführenden Befehl an, wobei der Rest der Wörter die Argumente dieses Befehls sind.
Parameter
Argumente werden während der Funktionsausführung als Parameter bezeichnet.
Wenn eine Funktion ausgeführt wird, werden die Argumente für die Funktion während ihrer Ausführung zu den Positionsparametern
Ein Parameter ist eine Entität, die Werte speichert. Dies kann ein Name, eine Nummer oder eines der unten aufgeführten Sonderzeichen sein. Eine Variable ist ein Parameter, der durch einen Namen gekennzeichnet ist.
Ein Positionsparameter ist ein Parameter, der mit einer oder mehreren Ziffern außer der einstelligen 0 gekennzeichnet ist. Positionsparameter werden beim Aufrufen aus den Argumenten der Shell zugewiesen und können mit dem Befehl set builtin neu zugewiesen werden. Der Positionsparameter N kann als $ {N} oder als $ N bezeichnet werden, wenn N aus einer einzelnen Ziffer besteht.
Optionen
Es gibt keinen eigenen Abschnitt zum Definieren einer Option, sie werden jedoch im gesamten Handbuch als Zeichen mit Bindestrich vorangestellt.
Die Option -p ändert das Ausgabeformat in das von POSIX angegebene Format
argv
Array übergeben werden, das als Argument für einenexecv
Syscall im Stil angegeben wird, ohne dass eine Shell beteiligt ist.Antworten:
Ein Befehl ist in ein Array von Zeichenfolgen mit dem Namen Argumente unterteilt . Argument 0 ist (normalerweise) der Befehlsname, Argument 1, das erste Element nach dem Befehl usw. Diese Argumente werden manchmal als Positionsparameter bezeichnet .
Eine Option ist ein dokumentierter Argumenttyp, der das Verhalten eines Befehls ändert , z. B.
-l
häufig "lang",-v
ausführlich.-lv
sind zwei Optionen, die in einem einzigen Argument zusammengefasst sind. Es gibt auch lange Optionen wie--verbose
(siehe auch Verwenden von getopts zum Verarbeiten langer und kurzer Befehlszeilenoptionen ). Wie der Name schon sagt, sind Optionen normalerweise optional. Es gibt jedoch einige Befehle mit paradoxen "obligatorischen Optionen".Ein Parameter ist ein Argument, das Informationen entweder zum Befehl oder zu einer seiner Optionen bereitstellt , z. B. in
-o file
, Datei ist der Parameter der-o
Option. Im Gegensatz zu Optionen, deren mögliche Werte in Programmen fest codiert sind, sind dies normalerweise keine Parameter, sodass der Benutzer die Zeichenfolge verwenden kann, die seinen Anforderungen entspricht. Wenn Sie einen Parameter übergeben müssen, der wie eine Option aussieht, aber nicht als solcher interpretiert werden sollte, können Sie ihn mit einem doppelten Bindestrich vom Anfang der Befehlszeile trennen :--
.Ein Shell-Parameter ist alles, was einen Wert im Kontext der Shell speichert. Dazu gehören Positionsparameter (zB
$1
,$2
...), Variablen (zB$foo
,$bar
...) und Sonderzeichen diejenigen (zB$@
)Schließlich gibt es Unterbefehlen , die auch als Funktionen / (low-level) Befehle bekannt, die mit „Metacommands“ verwendet werden , die mehrere separate Befehle einzubetten, wie
busybox
,git
,apt-get
,openssl
, und Ähnliches. Mit ihnen haben Sie möglicherweise globale Optionen vor dem Unterbefehl und unterbefehlsspezifische Optionen, die dem Unterbefehl folgen. Im Gegensatz zu Parametern ist die Liste der möglichen Unterbefehle im Befehl selbst fest codiert. z.B:$ busybox ls -l command = busybox subcommand = ls subcommand option1 = -l $ git --git-dir=a.git --work-tree=b -C c status -s command = git command option1 = --git-dir=a.git command option2 = --work-tree=b command option3 = -C subcommand = status subcommand option1 = -s
Beachten Sie, dass einige Befehle wie
test
,tar
,dd
undfind
haben kompliziertere Argument Parsen Syntax als die , die zuvor beschrieben und kann einige oder alle ihre Argumente haben geparst wieexpressions
,operands
,keys
und ähnlichen Befehl spezifische Komponenten.Beachten Sie auch, dass optionale Variablenzuweisungen und -umleitungen, obwohl sie von der Shell für Tilde-Erweiterung, Parametererweiterung, Befehlssubstitution, arithmetische Erweiterung und Anführungszeichenentfernung wie andere Befehlszeilenparameter verarbeitet werden, in meiner Antwort nicht berücksichtigt werden, da sie verschwunden sind, wenn die Befehl wird tatsächlich aufgerufen und seine Argumente übergeben.
quelle
VARNAME="VALUE"
Syntax erstellen . Wenn nicht (dh VARNAME ist kein Parameter), warum gilt das Konzept der Parametererweiterung dann auch für fest codierte Variablen?Die
man
Seite für einen typischen Unix - Befehl verwendet häufig die Begriffeargument
,option
undparameter
. Auf der untersten Ebene haben wirargument
und alles ist ein Argument, einschließlich des Befehls (Dateisystempfad zum) selbst.In einem Shell - Skript zugreifen Sie Argumente der speziellen Variablen
$0
..$n
. Andere Sprachen haben ähnliche Möglichkeiten, auf sie zuzugreifen (üblicherweise über ein Array mit einem Namen wieargv
).Argumente können auf Wunsch als Optionen interpretiert werden . Wie dies gemacht wird, ist implementierungsspezifisch. Sie können entweder Ihre eigenen rollen, zum Beispiel kann ein Shell-
bash
Skript (wie z. B. ) ein bereitgestelltes Skriptgetopts
odergetopt
Befehle verwenden.Diese definieren normalerweise eine Option als Argument, das mit einem Bindestrich (
-
) beginnt, und einige Optionen verwenden möglicherweise fortlaufende Argumente als Parameter. Leistungsfähigere Parser (z. B.getopt
) unterstützen das Mischen von Optionen für Kurzform (-h
) und Langform (--help
).Normalerweise nehmen die meisten Optionen null oder einen Parameter an. Solche Parameter werden manchmal auch als Werte bezeichnet .
Die unterstützten Optionen sind im Programmcode codiert (z. B. beim Aufruf
getopts
eines Shell-Skripts). Alle verbleibenden Argumente, nachdem die Optionen verbraucht wurden, werden üblicherweise als Positionsparameter bezeichnet, wenn die Reihenfolge, in der sie angegeben werden, signifikant ist (dies steht im Gegensatz zu Optionen, die normalerweise in beliebiger Reihenfolge angegeben werden können).Auch hier definiert das Skript die Positionsparameter, indem es sie verwendet und verwendet.
Also ein typischer Befehl
$ ls -I README -l foo 'bar car' baz
sieben Argumente hat:
/usr/bin/ls
,-I
,README
,-l
,foo
,bar car
, undbaz
zugänglich wie$0
durch$6
. Die-l
und-I
werden als Optionen interpretiert , wobei letztere einen Parameter (oder Wert ) von habenREADME
. Was bleibt, sind Positionsparameter (foo
,bar car
undbaz
).Durch das Parsen von Optionen kann die Argumentliste geändert werden, indem die verwendeten Elemente entfernt werden (z. B. mit
shift
oderset
), sodass nur die Positionsparameter übrig bleiben und danach als$1
... zugänglich sind$n
.quelle
Da die Frage mit "bash" gekennzeichnet ist, habe ich im Bash-Handbuch nach relevanten Abschnitten gesucht . Ich liste diese unten als zitierte Passagen zusammen mit meinen eigenen Zusammenfassungen mit einem Satz auf.
Argumente
Alles, was dem Befehl folgt, ist ein Argument.
Parameter
Argumente werden während der Funktionsausführung als Parameter bezeichnet.
Optionen
Es gibt keinen eigenen Abschnitt zum Definieren einer Option, sie werden jedoch im gesamten Handbuch als Zeichen mit Bindestrich vorangestellt.
quelle