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:
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.fuente
ls
con algún conjunto de opciones.-l
suls
alias parece una mala idea, es probable que surja el mismo problema con las opciones que son agradables en unls
alias interactivo como-p
o--color=auto
.ls
.ll
podría ser un alias parals -l
, y en un sistema con ese alias, podría escribirll -lart
.ls
no es unbash
comando, sino un ejecutable separado desde el que se iniciabash
. Dicho esto,-l
es solo un tipo de bandera booleana, que si está presente hacels
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 quels -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").fuente
-vvv
esssh
.aptitude moo
Los alias de Shell serían bastante molestos si los comandos como
ls
no permitieran opciones repetidas.Supongamos que tuvieras
Entonces, si no se permitieran indicadores en conflicto, sería un error emitir comandos como
ls --color=never
ols --color=auto
orm -i
.Por lo tanto, estos comandos están diseñados para permitir que las marcas posteriores anulen las anteriores.
fuente
--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
yls -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.