¿Importa el orden de las opciones de comando en Linux?

14

Por ejemplo, cuando ingresé:

gcc -O hello.c -c

O

gcc hello.c -c -O

Ambos no se quejaron.

¿Importa el orden de las opciones de comando?

bobo
fuente

Respuestas:

18

Esto depende del programa en sí; el sistema operativo no dicta si el orden importa o no.

El conjunto de opciones de GCC es tan colosal que no puedo decir con ninguna autoridad si puede proporcionar alguna opción en orden arbitrario; Tendrá que leer la documentación para esa opción. Dicho esto, una regla general es que si tiene dos o más opciones mutuamente excluyentes (como -O1 -O2para diferentes niveles de optimización), los programas generalmente tomarán opciones posteriores en lugar de las anteriores. Nuevamente, esto no es impuesto por Linux.

Sería un programa simple que le permite especificar la mayoría de las opciones en cualquier orden ls. Listar todos los archivos en el directorio actual con detalles se puede hacer con ls -la, ls -alo ls -l -a. Sin embargo, ls -l1 (es decir, 'el' 'one') no da el mismo resultado que ls -1l ('one' 'l'). Estas son opciones mutuamente excluyentes, y la última listada supera a la primera.

También está el programa impar que aplica opciones a los argumentos a medida que llegan. Entonces, por ejemplo, puede tener un comando hipotético blah -a 1 2 -b 3donde se -aaplica a los tres argumentos, pero -bsolo se aplica a 3.

Nuevamente, esto depende del programa individual en cuestión. Si alguna vez no está seguro, lea la documentación.

DK.
fuente
5

Hay casos en los que el orden de las opciones de línea de comando es importante incluso en GCC. Si está vinculando con bibliotecas estáticas (.a), si especifica -llib1 -llib2y hay una función liblib2.aque llama a una función liblib1.aque no se incorporó al programa, el enlace fallará con un símbolo no resuelto. Con las bibliotecas compartidas, esto no es un problema.

En general, como dijeron otros, el orden de las opciones puede o no marcar la diferencia. Sin embargo, la salida de los dos comandos a continuación son diferentes, por lo que el orden de los argumentos para catalterar la salida:

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

Tenga en cuenta también que en Linux (en particular), GNU getopt()es capaz de reordenar la línea de comando para que todas las opciones (comenzando con un menos) se procesen antes que cualquiera de los otros argumentos, a menos que use doble guión --para marcar el final del argumentos, o a menos que establezca la variable de entorno POSIXLY_CORRECT.

Jonathan Leffler
fuente
4

Solo si tiene 2 opciones que son mutuamente excluyentes. De lo contrario, el orden no importa.

Por supuesto, esto puede variar dependiendo de cómo se haya escrito el programa, pero debería aplicarse a todas las herramientas normales * nix.

Dan McGrath
fuente
3

Difícil de saber, como otros ya te dijeron que puede hacer la diferencia (o no).

Una buena regla general es abrir la página de manual y mirar el primer ejemplo y usar ese orden al colocar el argumento allí.

Entonces, si miramos el comando cat (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

Parece que siempre y cuando todas las opciones estén antes de que el archivo se defina, deberías estar bien.

Y si nos fijamos en la bestia gcc (man gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

No es tan simple de entender como el comando cat :)

Pero si desea jugar a lo seguro, -c parece aparecer antes que -O y luego infile (hello.c) parece ser el último.

gcc -c -O hello.c

Pero como ya sabes, ya que los otros trabajan ... esto es muy seguro :)

Johan
fuente
¿Qué hay de vincular banderas como -static-libstdc++?
Royi