Risposte:
Risposta breve :
Perché è programmato per ignorare molteplici usi di un flag.
Risposta lunga:
Come puoi vedere nel codice sorgente di ls
, c'è una parte con la funzione getopt_long()
e un enorme caso di commutazione:
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 funzione getopt_long()
legge tutti i parametri dati al programma. Nel caso in cui -l
la variabile format
sia impostata. Pertanto, quando si digita più volte -lllllllll
quella variabile viene impostata più volte, ma ciò non cambia nulla.
Bene, cambia una cosa. Questa enorme dichiarazione del caso switch deve essere eseguita più volte, a causa di più -l
flag. ls
richiede più tempo per essere completato con più -l
flag. Ma questa volta non vale la pena menzionare. =)
Perché è la cosa giusta da fare. Supponi di avere una sceneggiatura che fa qualcosa del tipo:
ls $LS_OPTIONS -l "$dir"
dove è possibile che $LS_OPTIONS
contenga già -l
. Sarebbe controintuitivo e fastidioso per questo comando produrre un errore e richiederebbe una logica aggiuntiva nello script per evitarlo.
-l
potrebbe non essere il miglior esempio per questo, ma spero che tu possa vedere come il concetto si applica in generale. Un esempio molto migliore sono le opzioni del compilatore $CFLAGS
che potrebbero duplicare le opzioni esplicite in una particolare invocazione del compilatore.
ls
con un set di opzioni.
-l
tuo ls
alias sembra una cattiva idea, è probabile che si verifichi lo stesso problema con opzioni che sono utili in un ls
alias interattivo come -p
o --color=auto
.
ls
. ll
potrebbe essere un alias per ls -l
, e su un sistema con tale alias, potrei digitare ll -lart
.
ls
non è un bash
comando, ma un eseguibile separato da cui ti capita di avviarsi bash
. Detto questo, -l
è solo un tipo di flag booleano, che se presente fa sì ls
che utilizzi un formato di stile lungo per l'output. La maggior parte dei programmi ignorerà semplicemente più usi ( ls -ll
è lo stesso di ls -l -l
) di tali flag, anche se ci sono alcune eccezioni (ad esempio, se -v
significa 'verboso', un programma può interpretare usi multipli per significare "essere ancora più prolisso").
-vvv
è ssh
.
aptitude moo
Gli alias di shell sarebbero piuttosto fastidiosi se comandi come ls
non consentissero opzioni ripetute.
Supponi di averlo avuto
alias ls='ls --color=auto'
alias rm='rm -i'
Quindi, se i flag in conflitto non fossero consentiti, sarebbe un errore emettere comandi come ls --color=never
o ls --color=auto
o rm -i
.
Pertanto, questi comandi sono progettati per consentire ai flag successivi di sostituire quelli precedenti.
--inplace
e --delay-updates
, per esempio.) Alcuni strumenti prendono semplicemente tutto ciò che arriva per ultimo; rm -if
è probabilmente un buon esempio lì. Ma non c'è conflitto nell'opzione -s di l, quindi ls -l
e ls -ll
non è un problema, e non influisce sull'esecuzione in modo significativo. I computer sono bravi a ripetizioni che intorpidiscono la mente.