Réponses:
Réponse courte :
Parce qu'il est programmé pour ignorer les utilisations multiples d'un drapeau.
Longue réponse:
Comme vous pouvez le voir dans le code source de ls
, il y a une partie avec la fonction getopt_long()
et un énorme boîtier de commutation:
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 }
La fonction getopt_long()
lit tous les paramètres donnés au programme. Dans le cas où -l
la variable format
est définie. Ainsi, lorsque vous tapez plusieurs, -lllllllll
cette variable est définie plusieurs fois, mais cela ne change rien.
Eh bien, cela change une chose. Cette énorme déclaration de cas de commutateur doit s'exécuter plusieurs fois, en raison de plusieurs -l
indicateurs. ls
a besoin de plus de temps pour terminer avec plusieurs -l
indicateurs. Mais cette fois ne mérite pas d'être mentionnée. =)
Parce que c'est la bonne chose à faire. Supposons que vous ayez un script faisant quelque chose comme:
ls $LS_OPTIONS -l "$dir"
où il est possible que $LS_OPTIONS
contient déjà -l
. Il serait contre-intuitif et ennuyeux que cette commande produise une erreur et nécessiterait une logique supplémentaire dans le script pour l'éviter.
-l
peut-être pas le meilleur exemple pour cela, mais j'espère que vous pouvez voir comment le concept s'applique en général. Un bien meilleur exemple est les options du compilateur $CFLAGS
qui pourraient dupliquer des options explicites dans une invocation particulière du compilateur.
ls
avec un ensemble d'options.
-l
de votre ls
alias semble être une mauvaise idée, le même problème est susceptible de se produire avec des options agréables dans un ls
alias interactif comme -p
ou --color=auto
.
ls
. ll
pourrait être un alias pour ls -l
, et sur un système avec cet alias, je pourrais taper ll -lart
.
ls
n'est pas une bash
commande, mais un exécutable distinct à partir duquel vous lancez bash
. Cela dit, ce -l
n'est qu'un type d'indicateur booléen qui, s'il est présent, entraîne l' ls
utilisation d'un format de style long pour la sortie. La plupart des programmes ignoreront simplement les utilisations multiples ( ls -ll
c'est la même chose que ls -l -l
) de ces indicateurs, bien qu'il y ait quelques exceptions (par exemple, si -v
signifie "verbeux", alors un programme peut interpréter plusieurs utilisations pour signifier "être encore plus verbeux").
-vvv
est ssh
.
aptitude moo
Les alias de shell seraient assez ennuyeux si des commandes telles ls
que ne permettaient pas les options répétées.
Supposons que vous ayez
alias ls='ls --color=auto'
alias rm='rm -i'
Ensuite, si des indicateurs conflictuels n'étaient pas autorisés, ce serait une erreur de lancer des commandes comme ls --color=never
ou ls --color=auto
ou rm -i
.
Par conséquent, ces commandes sont conçues pour permettre aux indicateurs ultérieurs de remplacer les indicateurs précédents.
--inplace
et --delay-updates
, par exemple.) Certains outils prennent simplement ce qui vient en dernier; rm -if
en est probablement un bon exemple. Mais il n'y a pas de conflit dans l' option -l de ls, par conséquent ls -l
et ls -ll
n'est pas un problème, et il ne modifie pas l' exécution d'une manière significative. Les ordinateurs sont bons pour la répétition ahurissante.