Warum akzeptiert ich doppelte Schalter?

16

Ich bin neugierig - gibt es einen Unterschied zwischen ls -lund ls -lllllllllllllllllllllllllllll?

Die Ausgabe scheint die gleiche zu sein und ich bin verwirrt, warum lsdoppelte Schalter zulässig sind. Ist dies eine Standardpraxis bei den meisten Befehlen?

Mike B
quelle

Antworten:

17

Kurze Antwort :

Weil es so programmiert ist, dass mehrere Verwendungen eines Flags ignoriert werden.

Lange Antwort:

Wie Sie im Quellcode von sehen können ls, gibt es einen Teil mit der Funktion getopt_long()und ein riesiges Schaltergehäuse:

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

Die Funktion getopt_long()liest alle dem Programm zugewiesenen Parameter. Falls -ldie Variable formatgesetzt ist. Wenn Sie also mehrere -llllllllleingeben, wird diese Variable mehrmals festgelegt, dies ändert jedoch nichts.

Nun, eines ändert sich. Diese umfangreiche switch case-Anweisung muss aufgrund mehrerer -lFlags mehrmals ausgeführt werden . lsbraucht länger, um mit mehreren -lFlags abzuschließen . Aber diese Zeit ist nicht erwähnenswert. =)

Chaos
quelle
11
Oder anders ausgedrückt, es wäre mehr Arbeit für den Programmierer, sie abzulehnen, als sie zu ignorieren.
Mark
1
+0,5 für das, was ich sagen wollte, +0,5 für das Gehen zur Quelle.
ein Lebenslauf vom
21

Weil es das Richtige ist. Angenommen, Sie hatten ein Skript, das etwa Folgendes ausführt:

ls $LS_OPTIONS -l "$dir"

wo es möglich ist, dass $LS_OPTIONSbereits enthält -l. Es wäre nicht intuitiv und ärgerlich, wenn dieser Befehl einen Fehler erzeugen würde, und würde zusätzliche Logik im Skript erfordern, um ihn zu vermeiden.

-lVielleicht ist dies nicht das beste Beispiel, aber Sie können hoffentlich sehen, wie das Konzept im Allgemeinen angewendet wird. Ein viel besseres Beispiel sind Compileroptionen $CFLAGS, die explizite Optionen in einem bestimmten Aufruf des Compilers duplizieren können.

R ..
quelle
4
Dasselbe könnte auch passieren, wenn Sie einen Alias ​​definiert haben, der lsmit einer Reihe von Optionen aufruft.
Kasperd
1
@kasperd: Ja. Obwohl das Einfügen -lIhres lsAlias ​​eine schlechte Idee ist, tritt das gleiche Problem wahrscheinlich auch bei Optionen auf, die in einem interaktiven lsAlias ​​wie -poder nützlich sind --color=auto.
R ..
1
Der Alias ​​muss nicht aufgerufen werden ls. llkönnte ein Alias ​​für sein ls -l, und auf einem System mit diesem Alias ​​könnte ich tippen ll -lart.
Kasperd
11

lsist kein bashBefehl, sondern eine separate ausführbare Datei, von der aus Sie gerade starten bash. Dies -list jedoch nur eine Art Boolesches Flag, das, falls vorhanden, lszur Verwendung eines Long-Style-Formats für die Ausgabe führt. Die meisten Programme ignorieren einfach die Mehrfachverwendung ( ls -llist dasselbe wie ls -l -l) solcher Flags, obwohl es einige Ausnahmen gibt (wenn beispielsweise -v"ausführlich" bedeutet, kann ein Programm die Mehrfachverwendung so interpretieren, dass sie "noch ausführlicher" bedeutet).

chepner
quelle
2
Ein Beispiel für -vvvist ssh.
Bernhard
Oder sogaraptitude moo
Ruslan
8

Shell-Aliase wären ziemlich ärgerlich, wenn Befehle wie lskeine wiederholten Optionen zulassen würden.

Angenommen, Sie hätten

alias ls='ls --color=auto'
alias rm='rm -i'

Wenn dann widersprüchliche Flags nicht zulässig wären, wäre es ein Fehler, Befehle wie ls --color=neveroder ls --color=autooder auszugeben rm -i.

Daher können mit diesen Befehlen spätere Flags frühere überschreiben.

200_erfolg
quelle
In Konflikt stehende Schalter werden manchmal nicht zugelassen. (Probieren Sie zum Beispiel rsync mit beiden --inplaceund --delay-updatesaus.) Einige Tools nehmen nur das, was zuletzt kommt. rm -ifist da wohl ein gutes Beispiel. Aber es gibt keinen Konflikt in Option -l des ls, daher ls -lund ls -llist kein Problem, und es hat keinen Einfluss auf der Ausführung in nennenswerter Weise. Computer sind gut darin, Wiederholungen zu betäuben.
ein CVn