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 -lla variabile formatsia impostata. Pertanto, quando si digita più volte -lllllllllquella 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ù -lflag. lsrichiede più tempo per essere completato con più -lflag. 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_OPTIONScontenga già -l. Sarebbe controintuitivo e fastidioso per questo comando produrre un errore e richiederebbe una logica aggiuntiva nello script per evitarlo.
-lpotrebbe 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 $CFLAGSche potrebbero duplicare le opzioni esplicite in una particolare invocazione del compilatore.
lscon un set di opzioni.
-ltuo lsalias sembra una cattiva idea, è probabile che si verifichi lo stesso problema con opzioni che sono utili in un lsalias interattivo come -po --color=auto.
ls. llpotrebbe essere un alias per ls -l, e su un sistema con tale alias, potrei digitare ll -lart.
lsnon è un bashcomando, 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ì lsche 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 -vsignifica '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 lsnon 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=nevero ls --color=autoo rm -i.
Pertanto, questi comandi sono progettati per consentire ai flag successivi di sostituire quelli precedenti.
--inplacee --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 -le ls -llnon è un problema, e non influisce sull'esecuzione in modo significativo. I computer sono bravi a ripetizioni che intorpidiscono la mente.