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?

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. =)


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.


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).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.