Ist die Reihenfolge der Befehlsoptionen in Linux von Bedeutung?

4395
bobo

Wenn ich zum Beispiel Folgendes eingegeben habe:

gcc -O hello.c -c 

Oder

gcc hello.c -c -O 

Beide haben sich nicht beschwert.

Ist die Reihenfolge der Befehlsoptionen wichtig?

13

4 Antworten auf die Frage

18
DK.

Dies hängt vom Programm selbst ab. Das Betriebssystem gibt nicht vor, ob die Reihenfolge wichtig ist oder nicht.

Die Optionen des GCC sind so kolossal, dass ich mit keiner Autorität sagen kann, ob Sie eine beliebige Option in beliebiger Reihenfolge angeben können . Sie müssen die Dokumentation für diese Option lesen. Eine allgemeine Faustregel lautet: Wenn Sie zwei oder mehr Optionen haben, die sich gegenseitig ausschließen (z. B. -O1 -O2für unterschiedliche Optimierungsstufen), werden Programme in der Regel spätere Optionen als frühere verwenden. Auch dies wird von Linux nicht erzwungen.

Ein einfaches Programm, mit dem Sie die meisten Optionen in beliebiger Reihenfolge angeben können, wäre ls. Eine Auflistung aller Dateien im aktuellen Verzeichnis mit Detail kann entweder mit getan werden ls -la, ls -aloder ls -l -a. Ls -l1 (das ist 'el' 'one') liefert jedoch nicht dieselbe Ausgabe wie ls -1l ('one' 'l'). Diese Optionen schließen sich gegenseitig aus, und die zuletzt genannten Überfahrten sind die ersten.

Es gibt auch das ungerade Programm, das Optionen auf Argumente anwendet, sobald sie ankommen. So zum Beispiel könnte man eine hypothetische Befehl haben, blah -a 1 2 -b 3wo -aalle drei Argumente gilt, sondern -bbezieht sich nur auf 3.

Dies liegt wiederum am jeweiligen Programm. Wenn Sie sich unsicher sind, lesen Sie die Dokumentation.

4
Dan McGrath

Nur wenn Sie zwei Optionen haben, die sich gegenseitig ausschließen. Ansonsten spielt die Reihenfolge keine Rolle.

Dies kann natürlich abhängig von der Art und Weise, wie das Programm geschrieben wurde, variieren, sollte jedoch für alle normalen * nix-Werkzeuge gelten.

4
Jonathan Leffler

Es gibt Fälle, in denen die Reihenfolge der Befehlszeilenoptionen selbst in GCC von Bedeutung ist. Wenn Sie mit statischen Bibliotheken (.a) verknüpfen, dann, wenn Sie angeben, -llib1 -llib2und es gibt eine Funktion in liblib2.adas ruft eine Funktion in liblib1.ader nicht in das Programm gebracht wurde, dann ist die Verbindung mit einem ungelösten Symbol fehlschlagen. Bei gemeinsam genutzten Bibliotheken ist dies kein Problem.

Wie andere bereits gesagt haben, kann die Reihenfolge der Optionen im Allgemeinen einen Unterschied machen. Die Ausgabe der beiden folgenden Befehle unterscheidet sich jedoch - daher catändert sich die Reihenfolge der Argumente, um die Ausgabe zu ändern:

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

Beachten Sie auch, dass GNU (insbesondere) unter Linux getopt()die Befehlszeile so anordnen kann, dass alle Optionen (beginnend mit einem Minuszeichen) vor allen anderen Argumenten verarbeitet werden - es sei denn, Sie --markieren das Ende des Befehls mit einem Doppelstrich Argumente, oder wenn Sie die Umgebungsvariable POSIXLY_CORRECT setzen.

3
Johan

Schwer zu wissen, da andere bereits gesagt haben, dass es einen Unterschied machen kann (oder nicht).

Eine gute Faustregel ist, die Manpage zu öffnen und das erste Beispiel zu betrachten und diese Reihenfolge zu verwenden, wenn das Argument dort eingefügt wird.

Also, wenn wir uns das Katzenkommando ansehen (Mannkatze):

SYNOPSIS cat [OPTION] [FILE]... 

Es scheint so, als wenn alle Optionen vor den Dateiregeln sind, sollten Sie in Ordnung sein.

Und wenn wir uns das gcc-Biest (man gcc) ansehen:

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. 

Es ist nicht so einfach zu verstehen wie der Katzenbefehl :)

Aber wenn Sie auf Nummer sicher gehen möchten, scheint -c vor -O zu kommen und dann scheint infile (hello.c) der letzte zu sein.

gcc -c -O hello.c 

Aber wie du schon weißt, da die anderen arbeiten, ist das sehr sicher :)

Was ist mit dem Verlinken von Flags wie -static-libstdc ++? Royi vor 5 Jahren 0