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 -l
die Variable format
gesetzt ist. Wenn Sie also mehrere -lllllllll
eingeben, wird diese Variable mehrmals festgelegt, dies ändert jedoch nichts.
Nun, eines ändert sich. Diese umfangreiche switch case-Anweisung muss aufgrund mehrerer -l
Flags mehrmals ausgeführt werden . ls
braucht länger, um mit mehreren -l
Flags abzuschließen . Aber diese Zeit ist nicht erwähnenswert. =)
Weil es das Richtige ist. Angenommen, Sie hatten ein Skript, das etwa Folgendes ausführt:
wo es möglich ist, dass
$LS_OPTIONS
bereits 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.-l
Vielleicht 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.quelle
ls
mit einer Reihe von Optionen aufruft.-l
Ihresls
Alias eine schlechte Idee ist, tritt das gleiche Problem wahrscheinlich auch bei Optionen auf, die in einem interaktivenls
Alias wie-p
oder nützlich sind--color=auto
.ls
.ll
könnte ein Alias für seinls -l
, und auf einem System mit diesem Alias könnte ich tippenll -lart
.ls
ist keinbash
Befehl, sondern eine separate ausführbare Datei, von der aus Sie gerade startenbash
. Dies-l
ist jedoch nur eine Art Boolesches Flag, das, falls vorhanden,ls
zur Verwendung eines Long-Style-Formats für die Ausgabe führt. Die meisten Programme ignorieren einfach die Mehrfachverwendung (ls -ll
ist dasselbe wiels -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).quelle
-vvv
istssh
.aptitude moo
Shell-Aliase wären ziemlich ärgerlich, wenn Befehle wie
ls
keine wiederholten Optionen zulassen würden.Angenommen, Sie hätten
Wenn dann widersprüchliche Flags nicht zulässig wären, wäre es ein Fehler, Befehle wie
ls --color=never
oderls --color=auto
oder auszugebenrm -i
.Daher können mit diesen Befehlen spätere Flags frühere überschreiben.
quelle
--inplace
und--delay-updates
aus.) Einige Tools nehmen nur das, was zuletzt kommt.rm -if
ist da wohl ein gutes Beispiel. Aber es gibt keinen Konflikt in Option -l des ls, daherls -l
undls -ll
ist kein Problem, und es hat keinen Einfluss auf der Ausführung in nennenswerter Weise. Computer sind gut darin, Wiederholungen zu betäuben.