Linuxのコマンドオプションの順序は重要ですか?


14

たとえば、次のいずれかを入力した場合:

gcc -O hello.c -c

または

gcc hello.c -c -O

両方とも文句を言いませんでした。

コマンドオプションの順序は重要ですか?

回答:


18

これはプログラム自体に依存します。オペレーティングシステムは、順序が重要かどうかを決定しません。

オプションのGCCのセットは、ユーザーが指定することができれば、私はすべての権限を持って言うことができないほど巨大である任意の任意の順序でオプションを。そのオプションのドキュメントを読む必要があります。とはいえ、一般的な経験則では、2つ以上の相互に排他的なオプション(-O1 -O2最適化のレベルが異なる場合など)がある場合、プログラムは通常、以前のオプションよりも後のオプションを使用します。繰り返しになりますが、これはLinuxでは強制されません。

ほとんどのオプションを任意の順序で指定できる単純なプログラムは次のようになりますls。現在のディレクトリ内のすべてのファイルを詳細にリストするにはls -lals -alまたはを使用しls -l -aます。ただし、ls -l1(つまり 'el' 'one')はls -1l( 'one' 'l')と同じ出力を提供しません。これらは相互に排他的なオプションであり、最後にリストされたものが最初に与えられたものに乗ります。

引数が到着したときにオプションを適用する奇妙なプログラムもあります。したがって、たとえば、3つの引数すべてblah -a 1 2 -b 3-a適用されるが、に-bのみ適用される仮想コマンドがあるとします3

繰り返しますが、これは問題の個々のプログラム次第です。よくわからない場合は、ドキュメントを読んでください。


5

GCCでもコマンドラインオプションの順序が重要になる場合があります。あなたは静的ライブラリ(.aという)とリンクしている場合は、指定した場合-llib1 -llib2とでは機能がありますliblib2.a内の関数呼び出しそのliblib1.aことがプログラムに持ち込まれていなかった、リンクが未解決のシンボルで失敗しますが。共有ライブラリーでは、これは問題ではありません。

一般に、他の人が言ったように、オプションの順序は違いを生むかもしれません。ただし、以下の2つのコマンドの出力は異なるため、引数の順序catによって出力が変更されます。

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

また、Linux(特に)では、GNU getopt()がコマンドラインの順序を変更し、すべてのオプション(マイナスで始まる)が他の引数の前に処理されることに注意してください-ダブルダッシュ--を使用して引数、または環境変数POSIXLY_CORRECTを設定しない限り。


4

相互に排他的な2つのオプションがある場合のみ。それ以外の場合、順序は関係ありません。

もちろん、これはプログラムの作成方法によって異なりますが、すべての通常の* nixツールに適用する必要があります。


3

他の人が既にあなたに言ったように、それは違いを生むかもしれない(またはそうしないかもしれない)

経験則としては、マニュアルページを開いて最初の例を見て、そこに引数を入れるときにその順序を使用することです。

したがって、catコマンド(man cat)を見ると:

SYNOPSIS
       cat [OPTION] [FILE]...

すべてのオプションがファイル引数の前にある限り、問題ないようです。

そして、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.

catコマンドとして理解するのはそれほど簡単ではありません:)

しかし、安全にプレイしたい場合は、-cが-Oの前に来ているようで、infile(hello.c)が最後のようです。

gcc -c -O hello.c

しかし、あなたがすでに知っているように、他の人が働いているので...これは非常に安全にプレイしています:)


フラグのリンクはどう-static-libstdc++ですか?
Royi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.