Ist die Reihenfolge der Befehlsoptionen unter Linux wichtig?

14

Zum Beispiel, wenn ich eines von beiden eingab:

gcc -O hello.c -c

Oder

gcc hello.c -c -O

Beide haben sich nicht beschwert.

Ist die Reihenfolge der Befehlsoptionen wichtig?

Bobo
quelle

Antworten:

18

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

Die Optionen von GCC sind so gewaltig, dass ich mit keiner Autorität sagen kann, ob Sie eine Option in willkürlicher Reihenfolge bereitstellen können . Sie müssen die Dokumentation für diese Option lesen. Eine allgemeine Faustregel lautet jedoch, dass -O1 -O2Programme bei zwei oder mehr sich gegenseitig ausschließenden Optionen (z. B. für unterschiedliche Optimierungsstufen) in der Regel spätere Optionen über frühere Optionen stellen. 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. Das Auflisten aller Dateien im aktuellen Verzeichnis mit Details kann entweder mit ls -la, ls -aloder erfolgen ls -l -a. Ls -l1 (also 'el' 'one') gibt jedoch nicht die gleiche Ausgabe aus wie ls -1l ('one' 'l'). Dies sind sich gegenseitig ausschließende Optionen, und die zuletzt aufgelistete überschreibt die zuerst angegebene.

Es gibt auch ein ungerades Programm, das Optionen auf Argumente anwendet, sobald diese eintreffen. 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.

Auch dies hängt vom jeweiligen Programm ab. Wenn Sie sich nicht sicher sind, lesen Sie die Dokumentation.

DK.
quelle
5

Es gibt Fälle, in denen die Reihenfolge der Befehlszeilenoptionen auch in GCC von Bedeutung ist. Wenn Sie eine Verknüpfung mit statischen Bibliotheken (.a) herstellen -llib1 -llib2und eine Funktion angeben, die eine Funktion liblib2.aaufruft liblib1.a, die nicht in das Programm aufgenommen wurde, schlägt die Verknüpfung mit einem nicht aufgelösten Symbol fehl. Bei gemeinsam genutzten Bibliotheken ist dies kein Problem.

Im Allgemeinen kann, wie andere sagten, die Reihenfolge der Optionen einen Unterschied machen oder auch nicht. Die Ausgabe der beiden folgenden Befehle ist jedoch unterschiedlich - daher catändert sich die Ausgabe durch die Reihenfolge der Argumente :

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

Beachten Sie auch, dass GNU unter Linux (insbesondere) getopt()die Befehlszeile neu anordnen kann, sodass alle Optionen (beginnend mit einem Minus) vor den anderen Argumenten verarbeitet werden - es sei denn, Sie verwenden einen Doppelstrich --, um das Ende des Befehls zu markieren Argumente, oder es sei denn, Sie legen die Umgebungsvariable POSIXLY_CORRECT fest.

Jonathan Leffler
quelle
4

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

Dies kann natürlich variieren, je nachdem, wie das Programm geschrieben wurde, sollte jedoch für alle normalen * nix-Tools gelten.

Dan McGrath
quelle
3

Schwer zu wissen, wie andere bereits sagten, kann es einen Unterschied machen (oder auch nicht).

Eine gute Faustregel ist, die Manpage zu öffnen und das erste Beispiel zu betrachten und diese Reihenfolge zu verwenden, wenn Sie das Argument dort einfügen.

Wenn wir uns also den Befehl cat (man cat) ansehen:

SYNOPSIS
       cat [OPTION] [FILE]...

Es sieht so aus, als ob alles in Ordnung sein sollte, solange alle Optionen vor den Datei-Argumenten stehen.

Und wenn wir uns das gcc-Biest ansehen (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.

Es ist nicht so einfach zu verstehen wie das cat Kommando :)

Wenn Sie jedoch auf Nummer sicher gehen möchten, scheint -c vor -O zu stehen, und Infile (hello.c) scheint das letzte zu sein.

gcc -c -O hello.c

Aber wie Sie bereits wissen, da die anderen arbeiten ... das ist sehr sicher :)

Johan
quelle
Was ist mit dem Verknüpfen von Flags -static-libstdc++?
Royi