Respuestas:
Respuesta corta :
Porque está programado para ignorar los múltiples usos de una bandera.
Respuesta larga:
Como puede ver en el código fuente de ls
, hay una parte con la función getopt_long()
y un gran caso de cambio:
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 función getopt_long()
lee todos los parámetros dados al programa. En caso de que se establezca -l
la variable format
. Entonces, cuando escribe múltiples, -lllllllll
esa variable se establece varias veces, pero eso no cambia nada.
Bueno, cambia una cosa. Esta gran declaración de caso de cambio debe ejecutarse varias veces, debido a múltiples -l
indicadores. ls
necesita más tiempo para completarse con múltiples -l
banderas. Pero esta vez no vale la pena mencionar. =)
Porque es lo correcto. Suponga que tiene un script que hace algo como:
ls $LS_OPTIONS -l "$dir"
donde es posible que $LS_OPTIONS
ya contenga -l
. Sería contraintuitivo y molesto que este comando produjera un error y requeriría una lógica adicional en el script para evitarlo.
-l
Puede que no sea el mejor ejemplo para esto, pero espero que pueda ver cómo se aplica el concepto en general. Un ejemplo mucho mejor son las opciones del compilador, ya $CFLAGS
que podrían duplicar opciones explícitas en una invocación particular del compilador.
ls
con algún conjunto de opciones.
-l
su ls
alias parece una mala idea, es probable que surja el mismo problema con las opciones que son agradables en un ls
alias interactivo como -p
o --color=auto
.
ls
. ll
podría ser un alias para ls -l
, y en un sistema con ese alias, podría escribir ll -lart
.
ls
no es un bash
comando, sino un ejecutable separado desde el que se inicia bash
. Dicho esto, -l
es solo un tipo de bandera booleana, que si está presente hace ls
que use un formato de estilo largo para la salida. La mayoría de los programas simplemente ignorarán los usos múltiples ( ls -ll
es lo mismo que ls -l -l
) de tales indicadores, aunque hay algunas excepciones (como ejemplo, si -v
significa 'detallado', entonces un programa puede interpretar múltiples usos para que signifiquen "ser aún más detallado").
-vvv
es ssh
.
aptitude moo
Los alias de Shell serían bastante molestos si los comandos como ls
no permitieran opciones repetidas.
Supongamos que tuvieras
alias ls='ls --color=auto'
alias rm='rm -i'
Entonces, si no se permitieran indicadores en conflicto, sería un error emitir comandos como ls --color=never
o ls --color=auto
o rm -i
.
Por lo tanto, estos comandos están diseñados para permitir que las marcas posteriores anulen las anteriores.
--inplace
y --delay-updates
, por ejemplo). Algunas herramientas solo toman lo que viene al final; rm -if
Es probablemente un buen ejemplo allí. Pero no hay conflicto en la opción -l de ls, por lo tanto, ls -l
y ls -ll
no es un problema, y que no afecta a la ejecución de cualquier manera significativa. Las computadoras son buenas para la repetición que adormece la mente.