Was ist der Unterschied zwischen den Flags für einfache und doppelte Striche bei Shell-Befehlen?

70

Ich bin neu in der Arbeit in der Shell und die Verwendung dieser Befehle scheint willkürlich. Gibt es einen Grund, warum eine Flagge einen einfachen Strich und eine andere einen doppelten Strich hat?

Kylex
quelle
Es soll dem POSIX-Standard unterliegen
cjc
Dieser Link ist jetzt 404 @cjc :( Ein möglicherweise zuverlässigerer Link könnte en.wikipedia.org/wiki/POSIX
Bernhard Hofmann
Besserer Link: en.wikipedia.org/wiki/…
Craig Fisher

Antworten:

110

Einem einzelnen Bindestrich können mehrere Flags mit einem Zeichen folgen. Ein doppelter Bindestrich steht vor einer einzelnen Option mit mehreren Zeichen.

Betrachten Sie dieses Beispiel:

tar -czf

In diesem Beispiel -czfgibt drei Einzel-Zeichen Flags: c, z, und f.

Betrachten Sie nun ein anderes Beispiel:

tar --exclude

In diesem Fall wird --excludeeine einzelne Option mit mehreren Zeichen angegeben exclude. Der Doppel Bindestrich disambiguiert das Befehlszeilenargument, um sicherzustellen , dass tarinterpretiert sie als excludeanstatt eine Kombination von e, x, c, l, u, d, und e.

Psusi
quelle
1
@kylex, nein, da es keine lange Option mit dem Namen "c" gibt und das - eine lange Option bedeutet, folgt keine Option mit einem einzelnen Zeichen.
Psusi
13
Manchmal können auch lange Befehle einfach gestrichelt werden. Zum Beispiel verwendet 'cdrecord' alle einfach gestrichelten Befehle (-eject -dao ...). Es hängt alles vom Programm ab, aber die meisten (!) Von ihnen verwenden - für einzelne und - für (lange) Befehle mit mehreren Zeichen
mulaz
8
@mulaz, ja, cdrecord macht ziemlich viele alberne Sachen.
Psusi
10
Denken Sie auch daran - allein verwendet bedeutet in der Regel das Ende der Optionen. Weitere Informationen finden Sie hier: unix.stackexchange.com/questions/11376/…
Sirex
3
@killjoy, denn ob aus Unwissenheit oder Auswahl, die Autoren dieser Programme haben sich natürlich nicht an die Konvention gehalten. Genau wie vor cdrecordJahren in den obigen Kommentaren erwähnt.
Psusi
17

Das hängt alles vom Programm ab. Normalerweise wird "-" für "kurze" Optionen (ein Buchstabe, -h) und "-" für "lange" (er) Optionen (--help) verwendet.

Kurze Optionen können normalerweise kombiniert werden (so ist "-h -a" dasselbe wie "-ha")

In Unix-ähnlichen Systemen wird häufig der ASCII-Bindestrich verwendet, um Optionen anzugeben. Auf das Zeichen folgen normalerweise ein oder mehrere Buchstaben. Ein Argument, bei dem es sich um einen einzelnen Bindestrich ohne Buchstaben handelt, gibt normalerweise an, dass ein Programm Daten verarbeiten soll, die von der Standardeingabe stammen, oder Daten an die Standardausgabe senden soll. In einigen Programmen werden zwei Bindestriche (-) verwendet, um "lange Optionen" anzugeben, bei denen aussagekräftigere Optionsnamen verwendet werden. Dies ist ein allgemeines Merkmal von GNU-Software.

Quelle

Mulaz
quelle
2
Warum ist es dann Java-Version und Ant-Version?
Killjoy
7

Es ist wirklich eine Konvention. Es kann Parsern jedoch helfen, effizienter über an das Programm übergebene Optionen Bescheid zu wissen. Außerdem gibt es nützliche Hilfsprogramme, die beim Parsen dieser Befehle helfen können, z. B. getopt(3)oder die nicht standardmäßigen getopt_long(3), um die Argumente eines Programms zu analysieren.

Es ist schön, denn wir können mehrere kurze Optionen kombinieren, wie andere Antworten sagen, wie tar -xzf myfile.tar.gz.

Wenn es ein "Lisa" -Argument für lsgäbe, hätte es wahrscheinlich eine andere Bedeutung zu tippen ls -lisaals ls --lisa. Die ersteren sind die l, i, sund aParameter, nicht das richtige Wort.

Tatsächlich könnte man schreiben ls -l -i -s -a, was genau dasselbe bedeutet wie ls -lisa, aber das würde vom Programm abhängen.

Es gibt auch Programme, die dieser Konvention nicht entsprechen. Vor allem für meinen Anblick ddund gcc.

ssice
quelle
3

kurze Optionen mit einem Strich im Vergleich zu langen Optionen mit einem doppelten Strich

kurze Optionen können zu einem einzigen Argument kombiniert werden;

for example: ls -lrt #instead of ls -l -r -t

Wenn wir lange Optionen mit einem Bindestrich zulassen, führt dies zu Mehrdeutigkeiten. Um dies zu beheben, verwenden wir einen Doppelstrich für lange Optionen.

Premraj
quelle