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 -lla variable format. Entonces, cuando escribe múltiples, -lllllllllesa 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 -lindicadores. lsnecesita más tiempo para completarse con múltiples -lbanderas. 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_OPTIONSya 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.
-lPuede 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 $CFLAGSque podrían duplicar opciones explícitas en una invocación particular del compilador.
lscon algún conjunto de opciones.
-lsu lsalias parece una mala idea, es probable que surja el mismo problema con las opciones que son agradables en un lsalias interactivo como -po --color=auto.
ls. llpodría ser un alias para ls -l, y en un sistema con ese alias, podría escribir ll -lart.
lsno es un bashcomando, sino un ejecutable separado desde el que se inicia bash. Dicho esto, -les solo un tipo de bandera booleana, que si está presente hace lsque use un formato de estilo largo para la salida. La mayoría de los programas simplemente ignorarán los usos múltiples ( ls -lles lo mismo que ls -l -l) de tales indicadores, aunque hay algunas excepciones (como ejemplo, si -vsignifica 'detallado', entonces un programa puede interpretar múltiples usos para que signifiquen "ser aún más detallado").
-vvves ssh.
aptitude moo
Los alias de Shell serían bastante molestos si los comandos como lsno 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=nevero ls --color=autoo rm -i.
Por lo tanto, estos comandos están diseñados para permitir que las marcas posteriores anulen las anteriores.
--inplacey --delay-updates, por ejemplo). Algunas herramientas solo toman lo que viene al final; rm -ifEs probablemente un buen ejemplo allí. Pero no hay conflicto en la opción -l de ls, por lo tanto, ls -ly ls -llno 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.