it-swarm.com.de

Was ist der Unterschied zwischen - (einem Bindestrich) und - (zwei Bindestrichen) in einem Befehl?

Beide scheinen Fahnen zu sein, aber was ist der Unterschied?

14
AlphaOmega
  • -- ist die Langnamenversion
  • - ist die Kurznamenversion

Schauen Sie sich man ls und einige der Optionen an:

-a, --all : do not ignore entries starting with .
-A, --almost-all : do not list implied . and ..
-b, --escape : print C-style escapes for nongraphic characters
-B, --ignore-backups : do not list implied entries ending with ~

Sie sind die gleichen, aber manche bevorzugen die kurze, manche die lange Version.

Und beide sind aus Kompatibilitätsgründen da. Durch das Entfernen einer Option wird die Software beschädigt.


Diesem folgt nicht jeder Befehl. Wie @ Bakuriu im Kommentar erwähnt: Ein Befehl wie find hat das, was Sie als "lange Namen" mit 1 Bindestrich betrachten können.


In Bezug auf die Codierung gibt es auch etwas zu beachten:

  • Bash's getopts unterstützt keine langen Namen.
  • Das getopt aus den GNU Utils macht.
25
Rinzwind

Allgemein:

  • - bedeutet, das Argument/den Inhalt von STDIN zu lesen (Dateideskriptor 0)

  • -- bedeutet Befehlsende-Optionen, alles, was folgt, sind Argumente

Warum benötigt:

Über -:

$ echo foobar | cat -
foobar

Obwohl cat Inhalte von STDIN lesen kann, ohne den - zu benötigen, wird dies von vielen Befehlen und deren man Seiten ausdrücklich erwähnt.

Nun zu --, ich habe eine Datei -spam erstellt, lasst uns cat die Datei:

$ echo foobar >-spam  

$ cat -spam         
cat: invalid option -- 'p'
Try 'cat --help' for more information.

$ cat -- -spam      
foobar

Ohne --, cat nimmt s, p, a, m alle Optionen wie folgt -, -- gibt explizit das Ende der Option (en) an, danach wird -spam als Dateiname verwendet.

22
heemayl

Dies hängt tatsächlich vom jeweiligen Programm ab. Es gibt Standards, aber sie sind nicht wirklich durchgesetzt ​​überall: Es liegt an jedem Programm, sie zu implementieren.

Der Befehl find verwendet beispielsweise Parameter für den vollständigen Namen mit einzelnen Bindestrichen:

find . -iname "*.jpg" -delete

Im Allgemeinen geben doppelte Bindestriche einen Schalter an, bei dem es sich um ein vollständiges Wort handelt, und einzelne Bindestriche geben einen Schalter an, bei dem es sich um einen einzelnen Buchstaben handelt. Ein-Buchstaben-Schalter können kombiniert werden. Dies bedeutet, dass alle folgenden Befehle gleichwertig sind:

cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to

Ein doppelter Bindestrich gefolgt von einem Leerzeichen kann auch verwendet werden, um anzuzeigen, dass "dies das Ende von Befehlen ist; alles, was folgt, ist ein Dateiname, auch wenn es wie ein Befehl aussieht".

Ein einzelner Bindestrich ohne nachfolgende Buchstaben kann "read from stdin, not from a file" anzeigen.

Jedoch all dies ist programmabhängig. Jedes gegebene Programm kann gegen einen dieser Standards verstoßen, wie zum Beispiel bei find.

6
TRiG

Ein Bindestrich ist die Möglichkeit , mit der Optionen zu einem Befehl an Unix-Befehle übergeben werden. Sie haben einen Bindestrich gefolgt von einem einzelnen Buchstaben (oder manchmal einer Zahl) (-a-i-T). Auf einige Optionen folgt ein Argument (-ofilename-o filename).

Zwei Bindestriche werden meistens für Programme/Befehle auf GNU-Systemen verwendet - und sind die bevorzugte Möglichkeit, Optionen anzugeben. meist auf Linux-Systemen. Sie haben zwei Hyphen, gefolgt von einem oder mehreren Wörtern, die durch einzelne Hyphen getrennt sind (--version--ignore-case). Optionen mit Argumenten verwenden ein Gleichheitszeichen, um Optionen und Argumente zu trennen (--log-file=filename)

Der Nachteil der alten One-Hypen-Optionen besteht darin, dass es keinen Standardbuchstaben gibt, mit dem über verschiedene Befehle dasselbe ausgeführt werden kann. Ja, -v wird oft für "verbose" verwendet - und -V wird manchmal für "version" verwendet - aber es gibt keinen wirklichen Konsens zwischen Befehlen. Zum Beispiel bedeutet -i "interaktiv" für cp, mv, ln und rm - der Befehl fordert vor dem Überschreiben oder Löschen auf. Aber es bedeutet "Groß- und Kleinschreibung ignorieren" in grep. Um es noch schwieriger zu machen, verwendet der Befehl sort-f - für "Groß- und Kleinschreibung" - auf die gleiche Weise, um Groß- und Kleinschreibung zu ignorieren. Um die Verwirrung zu vervollständigen, verwenden viele Befehle - einschließlich mv und cp - -f für "force" ... dass der Befehl muss etwas tun (wie eine vorhandene Datei überschreiben), obwohl dies normalerweise nicht der Fall ist.

Darüber hinaus können die Befehle für verschiedene Unix-Systeme (Solaris, * BSD, SysV, AIX, ...) unterschiedliche Buchstaben verwenden, um dasselbe zu tun. Beispielsweise listet der Befehl who die Benutzer auf einem System auf. Dieser Befehl kann optional anzeigen, welche Benutzer Nachrichten von anderen Benutzern an ihr Terminal annehmen. Die Option hierfür ist -w unter Linux, während Solaris -T verwendet.

Lange Optionen hingegen ermöglichen die Verwendung derselben Option für alle Befehle und beschreiben tatsächlich, was die Optionen bewirken. Zum Beispiel --ignore-case, --interactive, --version, --force. Somit wird --ignore-case sowohl in grep als auch in sort verwendet.

Aber auch hier werden sie fast nur in Befehlen/Programmen verwendet, die im Rahmen des GNU-Projekts erstellt wurden ...

Schließlich wird ein doppelter Bindestrich verwendet, um einem Befehl mitzuteilen, dass die Liste der Optionen abgeschlossen ist und dass die folgenden Argumente sind - egal wie viel sie aussehen mögen wie Optionen. Wenn ein Dateiname mit einem Bindestrich beginnt (z. B. -this_is_a_bad_filename), können Befehle ihn mit einer Option verwechseln und versuchen, ihn zu analysieren - der doppelte Bindestrich verhindert dies. mv -vi -- -this_is_a_bad_filename this_is_a_better_filename (einziger Befehl, den Sie verwenden sollten, wenn ein Dateiname mit einem Bindestrich beginnt ... ;-)

3
Baard Kopperud