L'ordine delle opzioni di comando in Linux è importante?


14

Ad esempio, quando ho inserito uno dei due:

gcc -O hello.c -c

O

gcc hello.c -c -O

Entrambi non si sono lamentati.

L'ordine delle opzioni di comando è importante?

Risposte:


18

Questo dipende dal programma stesso; il sistema operativo non determina se l'ordine è importante.

L'insieme di opzioni di GCC è così colossale che non posso dire con alcuna autorità se è possibile fornire qualsiasi opzione in ordine arbitrario; dovrai leggere la documentazione per quell'opzione. Detto questo, una regola empirica generale è che se si hanno due o più opzioni reciprocamente esclusive (come -O1 -O2per i diversi livelli di ottimizzazione), i programmi generalmente prenderanno opzioni successive rispetto a quelle precedenti. Ancora una volta, questo non è applicato da Linux.

Un semplice programma che ti consente di specificare la maggior parte delle opzioni in qualsiasi ordine sarebbe ls. Elencare tutti i file nella directory corrente con i dettagli può essere fatto con ls -la, ls -alo ls -l -a. Tuttavia, ls -l1 (ovvero 'el' 'one') non fornisce lo stesso output di ls -1l ('one' 'l'). Queste sono opzioni che si escludono a vicenda, e l'ultima elencata sopra cavalca la prima data.

C'è anche il programma dispari che applica opzioni agli argomenti man mano che arrivano. Quindi, ad esempio, potresti avere un comando ipotetico in blah -a 1 2 -b 3cui si -aapplica a tutti e tre gli argomenti, ma -bsi applica solo a 3.

Ancora una volta, questo dipende dal singolo programma in questione. Se non sei sicuro, leggi la documentazione.


5

Ci sono casi in cui l'ordine delle opzioni della riga di comando è importante anche in GCC. Se si sta effettuando il collegamento con librerie statiche (.a), se si specifica -llib1 -llib2e c'è una funzione liblib2.ache chiama una funzione liblib1.ache non è stata portata nel programma, il collegamento fallirà con un simbolo non risolto. Con le librerie condivise, questo non è un problema.

In generale, come altri hanno affermato, l'ordine delle opzioni può o meno fare la differenza. Tuttavia, l'output dei due comandi seguenti è diverso, quindi l'ordine degli argomenti per catalterare l'output:

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

Si noti inoltre che su Linux (in particolare), GNU getopt()è in grado di riordinare la riga di comando in modo che tutte le opzioni (che iniziano con un --segno meno) siano elaborate prima di uno qualsiasi degli altri argomenti, a meno che non si usi il doppio trattino per segnare la fine del argomenti o se non si imposta la variabile di ambiente POSIXLY_CORRECT.


4

Solo se hai 2 opzioni che si escludono a vicenda. Altrimenti, l'ordine non ha importanza.

Naturalmente, questo può variare a seconda di come è stato scritto il programma, ma dovrebbe applicarsi a tutti gli strumenti * nix normali.


3

Difficile da sapere, come altri ti hanno già detto che potrebbe fare la differenza (o no).

Una buona regola empirica è aprire la pagina man e guardare il primo esempio e usare quell'ordine quando si inserisce arg.

Quindi, se guardiamo il comando cat (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

Sembra che fino a quando tutte le opzioni sono prima che il file sostenga che dovresti andare bene.

E se guardiamo 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.

Non è così semplice da capire come il comando cat :)

Ma se vuoi giocarci sul sicuro, -c sembra venire prima di -O e quindi infile (hello.c) sembra essere l'ultimo.

gcc -c -O hello.c

Ma come già sapete, dal momento che gli altri lavorano ... questo è molto sicuro :)


Che dire di collegare flag come -static-libstdc++?
Royi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.