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 -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. =)
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.
lsmit einer Reihe von Optionen aufruft.
-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.
ls. llkönnte ein Alias für sein ls -l, und auf einem System mit diesem Alias könnte ich tippen ll -lart.
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).
-vvvist ssh.
aptitude moo
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.
--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.