Estou curioso - existe uma diferença entre ls -l
e ls -lllllllllllllllllllllllllllll
?
A saída parece ser a mesma e estou confuso sobre o porquê de ls
permitir opções duplicadas. Essa é uma prática padrão entre a maioria dos comandos?
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:
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.fonte
ls
com algum conjunto de opções.-l
seuls
alias pareça uma má ideia, é provável que o mesmo problema ocorra com as opções que são boas em umls
alias interativo como-p
ou--color=auto
.ls
.ll
pode ser um alias parals -l
, e em um sistema com esse alias, eu poderia digitarll -lart
.ls
não é umbash
comando, mas um executável separado do qual você iniciabash
. Dito isto,-l
é apenas um tipo de sinalizador booleano que, se presente, fazls
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 quels -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").fonte
-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
Se não fossem permitidos sinalizadores conflitantes, seria um erro emitir comandos como
ls --color=never
ouls --color=auto
ourm -i
.Portanto, esses comandos foram projetados para permitir que sinalizadores posteriores substituam os sinalizadores anteriores.
fonte
--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
els -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.