Respostas:
Resposta curta :
Porque está programado para ignorar vários usos de um sinalizador.
Resposta longa:
Como você pode ver no código fonte de ls
, há uma parte com a função getopt_long()
e um enorme gabinete de chave:
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 }
A função getopt_long()
lê todos os parâmetros dados ao programa. Caso -l
a variável format
esteja definida. Portanto, quando você digita múltiplo, -lllllllll
essa variável é definida várias vezes, mas isso não muda nada.
Bem, isso muda uma coisa. Essa declaração enorme de caso de switch deve ser executada várias vezes, devido a vários -l
sinalizadores. ls
precisa de mais tempo para concluir com vários -l
sinalizadores. Mas desta vez não vale a pena mencionar. =)
Porque é a coisa certa a fazer. Suponha que você tenha um script fazendo algo como:
ls $LS_OPTIONS -l "$dir"
onde é possível que $LS_OPTIONS
já contenha -l
. Seria contra-intuitivo e irritante para esse comando produzir um erro e exigiria lógica extra no script para evitá-lo.
-l
pode não ser o melhor exemplo disso, mas espero que você possa ver como o conceito se aplica em geral. Um exemplo muito melhor são as opções do compilador $CFLAGS
que podem duplicar opções explícitas em uma chamada específica do compilador.
ls
com algum conjunto de opções.
-l
seu ls
alias pareça uma má ideia, é provável que o mesmo problema ocorra com as opções que são boas em um ls
alias interativo como -p
ou --color=auto
.
ls
. ll
pode ser um alias para ls -l
, e em um sistema com esse alias, eu poderia digitar ll -lart
.
ls
não é um bash
comando, mas um executável separado do qual você inicia bash
. Dito isto, -l
é apenas um tipo de sinalizador booleano que, se presente, faz ls
com que use um formato de estilo longo para a saída. A maioria dos programas simplesmente ignora vários usos ( ls -ll
é o mesmo que ls -l -l
) desses sinalizadores, embora existam algumas exceções (por exemplo, se -v
significa 'detalhado', um programa pode interpretar vários usos para significar "ser ainda mais detalhado").
-vvv
é ssh
.
aptitude moo
Os aliases do shell seriam muito irritantes se comandos como ls
não permitissem opções repetidas.
Suponha que você tivesse
alias ls='ls --color=auto'
alias rm='rm -i'
Se não fossem permitidos sinalizadores conflitantes, seria um erro emitir comandos como ls --color=never
ou ls --color=auto
ou rm -i
.
Portanto, esses comandos foram projetados para permitir que sinalizadores posteriores substituam os sinalizadores anteriores.
--inplace
e --delay-updates
, por exemplo.) Algumas ferramentas apenas aceitam o que vier por último; rm -if
provavelmente é um bom exemplo lá. Mas não há conflito na opção -l das ls, portanto, ls -l
e ls -ll
não é um problema, e não afeta a execução de qualquer maneira significativa. Os computadores são bons em repetições entorpecentes.