Warum sollte ein überflüssiger Bindestrich (-) verwendet werden, um Optionsflags an tar zu übergeben?

35

Um eine tar - Datei für ein Verzeichnis zu erstellen, den tarBefehl mit compress, verboseund fileOptionen können somit werden eingegeben:

$ tar -cvf my.tar my_directory/

Aber es funktioniert auch so:

 $ tar cvf my.tar my_directory/

Das heißt, ohne den Bindestrich (-) vor den Optionen. Warum würden Sie jemals einen Bindestrich (-) an die Optionsliste übergeben?

Milktrader
quelle

Antworten:

43

Es gibt verschiedene Muster für Optionen, die in der Vergangenheit in UNIX-Anwendungen verwendet wurden. Einige alte, wie Teer , verwenden ein Positionsschema:

Argumente für Befehlsoptionen

wie zum Beispiel Teer verwendet

tar * something * f "Datei bearbeitet" * "Pfade von zu manipulierenden Dateien" *

In einem ersten Versuch, die Verwirrung zu vermeiden, erlaubten es tar und einige andere Programme mit dem alten Flags-Argument-Stil, die Flags mit Bindestrichen abzugrenzen, aber die meisten von uns Alten ignorierten dies einfach.

Einige andere Befehle haben eine kompliziertere Befehlszeilensyntax, wie dd (1), bei der Flags, Gleichheitszeichen, Pfadnamen, Argumente und ein Rebhuhn in einem Birnbaum verwendet werden.

In BSD und späteren Versionen von Unix war dies mehr oder weniger konvergiert mit mit '-' gekennzeichneten Einzelzeichen-Flags, was jedoch einige Probleme aufwirft:

  • Die Flaggen könnten schwer zu merken sein
  • manchmal wollte man eigentlich einen Namen mit '-' verwenden
  • und besonders mit GNU-Werkzeugen begannen Einschränkungen durch die Anzahl möglicher Flags. Also fügten GNU-Tools GNU-Long-Optionen wie --output.

Dann entschied Sun, dass das zusätzliche '-' überflüssig war, und begann mit der Verwendung von Long-Style-Flags mit Single-Flags.

Und so wurde es zu dem Chaos, das es jetzt ist.

Charlie Martin
quelle
9
"und ein Rebhuhn in einem Birnbaum" Besser als mein trockener Versuch. Du gewinnst.
dmckee
1
schöner historischer Kontext.
1
Ich stelle fest, dass viele X-Programme (einschließlich beispielsweise X von Xorg) Long-Style-Flags mit einem einzigen verwenden -. Ist das von Sun?
Mattdm
1
Was bedeutet Rebhuhn in einem Birnbaum? (Kann ich einen nützlichen und leicht verständlichen Link haben?)
Plhn
1
@plhn Idiom. Ein traditionelles englisches Weihnachtslied "The Twelve Days of Christmas" listet eine ganze Reihe von extravaganten Geschenken auf, die mit "Ein Rebhuhn in einem Birnbaum" enden. Es schlägt eine lange extravagante Liste vor.
Charlie Martin
8

Sie können tar-Optionen in der Standard-Unix-Art tar -c -f foo -v -B file1 file2 file3und Weise angeben, in der Sie den Bindestrich benötigen, um zwischen Optionen und Parametern oder den Dateinamen am Ende der Befehlszeile zu unterscheiden. Sie können auch alle Optionen im ersten Argument zusammenfassen. In diesem Fall ist der Bindestrich optional.

Dann gibt es einen psPunkt, an dem Sie die Bindestriche verwenden, wenn Sie die SysV-ish-Optionen verwenden, und sie weglassen, wenn Sie BSD-ish-Optionen verwenden, nur um die Dinge verwirrender zu machen.

Und lassen Sie uns nicht einmal darüber reden find.

Paul Tomblin
quelle
2

Der Bindestrich wird verwendet, um zwischen den Namen und Werten von Optionsparametern zu unterscheiden. Ich denke, es ist eher eine Standardkonvention.


quelle
1
Ich wollte das best-practiceTag hinzufügen, weil ich dachte, dass es darauf ankommt.
1
@Milktrader, es ist eine schwierige Frage, wenn es um Best Practices geht. Das Befolgen von Standardkonventionen ist in der Tat die beste Vorgehensweise, aber ob Sie dies in Ihren Fällen tun möchten, ist nicht klar. Das hängt von Ihrem Szenario ab. Wenn Sie einen schnellen Befehl in der Shell hacken, interessiert Sie das wahrscheinlich nicht sonderlich, aber wenn Sie eine Bibliothek schreiben, ist es wichtig, gut eingeführte Konventionen zu befolgen, da Sie keine Kontrolle darüber haben, wie diese Bibliothek verwendet wird von Kunden. In diesem Fall sollten Sie alle möglichen Fälle abdecken, und es ist wichtig, zwischen Optionsnamen und -werten zu unterscheiden.
-1

Es gibt bis zu vier Konventionen für die Verwendung von Unix-Befehlszeilenoptionen:

  1. -o -p -t (Bindestrich vor jeder Option)
  2. -opt (Bindestrich vor einer Reihe von Optionen)
  3. opt (kein Gedankenstrich vor einer Reihe von Optionen)
  4. --long-option (Doppelstrich vor einem Optionsnamen)

Beispielsweise:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz
jonasjacek
quelle
1
Gilt diese Konvention nur für Teer? Was ist mit ls? Es wird nicht funktionieren, aber es wird funktionieren. Warum so?
Shashank Vyas
Die vier Konventionen sollten für alle Befehle gelten.
Jonasjacek
2
Nein, tun sie nicht. Neulich habe ich rm rf <filename> ausprobiert, das funktioniert auch nicht.
Shashank Vyas
-2

Mit vorangestelltem Minuszeichen / Bindestrich (-) müssen Sie die Optionen in der richtigen Reihenfolge halten. Ohne Minus kann sich die Reihenfolge Ihrer Wahl ändern.

Beispielsweise:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar
Mohd. Golam Hossain
quelle
Diese Antwort ist zur Hälfte richtig, aber AFAIK, es sind nur solche Flags f, die ein Argument annehmen, dessen Reihenfolge von Bedeutung ist. Siehe unix.stackexchange.com/a/239120/3169
Mikel,