Antworten:
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:
ls $LS_OPTIONS -l "$dir"
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.
ls
mit einer Reihe von Optionen aufruft.
-l
Ihres ls
Alias eine schlechte Idee ist, tritt das gleiche Problem wahrscheinlich auch bei Optionen auf, die in einem interaktiven ls
Alias wie -p
oder nützlich sind --color=auto
.
ls
. ll
könnte ein Alias für sein ls -l
, und auf einem System mit diesem Alias könnte ich tippen ll -lart
.
ls
ist kein bash
Befehl, sondern eine separate ausführbare Datei, von der aus Sie gerade starten bash
. 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 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).
-vvv
ist ssh
.
aptitude moo
Shell-Aliase wären ziemlich ärgerlich, wenn Befehle wie ls
keine 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=never
oder ls --color=auto
oder auszugeben rm -i
.
Daher können mit diesen Befehlen spätere Flags frühere überschreiben.
--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, daher ls -l
und ls -ll
ist kein Problem, und es hat keinen Einfluss auf der Ausführung in nennenswerter Weise. Computer sind gut darin, Wiederholungen zu betäuben.