¿Por qué acepta ls interruptores duplicados?

16

Tengo curiosidad, ¿hay alguna diferencia entre ls -ly ls -lllllllllllllllllllllllllllll?

La salida parece ser la misma y estoy confundido sobre por qué lspermite interruptores duplicados. ¿Es esta una práctica estándar entre la mayoría de los comandos?

Mike B
fuente

Respuestas:

17

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. =)

caos
fuente
11
O para decirlo de otra manera, rechazarlos sería más trabajo para el programador que ignorarlos.
Mark
1
+0.5 por decir lo que iba a decir, +0.5 por ir a la fuente.
un CVn
21

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.

R .. GitHub DEJA DE AYUDAR AL HIELO
fuente
44
Lo mismo también podría suceder si hubiera definido un alias que llame lscon algún conjunto de opciones.
Kasperd
1
@kasperd: Sí Aunque poner -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.
R .. GitHub DEJA DE AYUDAR AL HIELO
1
El alias no tiene que ser llamado ls. llpodría ser un alias para ls -l, y en un sistema con ese alias, podría escribir ll -lart.
Kasperd
11

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").

chepner
fuente
2
Un ejemplo de -vvves ssh.
Bernhard
O inclusoaptitude moo
Ruslan
8

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.

200_success
fuente
Los interruptores conflictivos a veces no se permiten. (Pruebe rsync con ambos --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.
un CVn