Perché accetta switch duplicati?


16

Sono curioso - c'è una differenza tra ls -le ls -lllllllllllllllllllllllllllll?

L'output sembra essere lo stesso e sono confuso sul perché lsconsente switch duplicati. È una pratica standard nella maggior parte dei comandi?

Risposte:


17

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. =)


11
O per dirla in altro modo, rifiutarli sarebbe più lavoro per il programmatore che ignorarli.
Segna l'

1
+0.5 per dire quello che stavo per dire, +0.5 per andare alla fonte.
un CVn

21

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.


4
La stessa cosa potrebbe accadere anche se avessi definito un alias che chiama lscon un set di opzioni.
Kasperd,

1
@kasperd: Sì. Anche se inserire il -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.
R .. GitHub smette di aiutare ICE il

1
Non è necessario chiamare l'alias ls. llpotrebbe essere un alias per ls -l, e su un sistema con tale alias, potrei digitare ll -lart.
Kasperd,

11

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").


2
Un esempio di -vvvè ssh.
Bernhard,

O addiritturaaptitude moo
Ruslan,

8

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.


A volte gli interruttori in conflitto sono vietati. (Prova rsync con entrambi --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.
un CVn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.