web-dev-qa-db-ja.com

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

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

gcc -O hello.c -c

または

gcc hello.c -c -O

どちらも文句を言わなかった。

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

15
bobo

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

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

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

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

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

19
DK.

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を設定しない限り。

6

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

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

4
Dan McGrath

他の人がすでにあなたに言ったように、それが違いを生むかもしれない(またはしないかもしれない)ので、知るのは難しいです。

経験則として、manページを開いて最初の例を確認し、そこに引数を配置するときにその順序を使用することをお勧めします。

したがって、catコマンド(man cat)を見ると、次のようになります。

SYNOPSIS
       cat [OPTION] [FILE]...

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

そして、gcc beast(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

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

3
Johan