最も一般的なのは GNU getopt
です スタイル、短いオプションには 1 つのダッシュ、長いオプションには 2 つのダッシュを使用します。
-
当初、Unix プログラムは 1 文字のオプションの前に 1 つのダッシュを付け、オプションでバンドルするオプションを取りました:
ls -laF ls -l -a -F
上記の 2 つのコマンドは同等です。
オプションが値を取る場合、バンドルをオーバーライドします:
gpg -aofoo.gpg
、-a
と-o
オプションとfoo.gpg
です-o
に与えられた値です . -
とにかく、彼らのほとんどはそうしました。
tar cvzf
はよくある光景です。現在のバージョンはtar -cvzf
を受け入れます また、ダッシュを追加するかどうかによって、引数は非常に異なる方法で解釈されます。たとえば、これら 2 つは同じことを意味します (ダッシュなしのオプションは ではないことに注意してください)。 値の直前):tar -xf file.tgz -vzO /etc/passwd /var/backups
tar xfvzO file.tgz /etc/passwd /var/backups
BSD
ps
常に-
を使用;システムVps
決してしません。 Linux バージョンは両方のバージョンを受け入れ、オプションの前にダッシュが付いているかどうかに応じて動作を変更します。 (上記の tar の例とは異なり、ps はオプション 意味 を変更します -
X11 プログラムは、単一のダッシュまたは場合によってはプラス記号の前に長いオプションを使用しました:
xterm -class FooTerm +vb -u8
これはオプション
class
を設定します とu8
、および設定解除vb
オプション。X11 スタイルは、オプションのバンドルと互換性がありません。
-
その後、長いオプションが GNU
getopt()
に追加されました。 1 文字のオプションと互換性のある方法で。gpg -se --no-armor --output=signed.gpg
これは
-s
を設定します 、-e
、および--no-armor
(これは--armor
の反対です ).通常、
--output=signed.gpg
および--output signed.gpg
同等です。 (ただし常にではありません。たとえば、curl は前者を受け入れず、後者のみを受け入れます。)(私の記憶が正しければ、長いオプションは
+
を使用しました--
に変更される前のプレフィックスとして .) -
POSIX 仕様には、1 文字のオプションを説明する「ユーティリティ引数構文」セクションがあります。
ほとんどの Windows プログラムは独自のパーサーを使用しており、ユーザーを怒らせています。
/a /b /c
が必要なものもあります 、その他は VMS スタイルの/a/b/c
を許可します 、さらに Unix スタイルの/abc
を好む人もいます .- ほとんどが
/
を使用 プレフィックスとして、-
を受け入れるものもあります 、他の人はのみ受け入れます-
. - 値は
/foo bar
として指定できます 、/foo=bar
、/foo:bar
. - 通常、スペースは
/quoted "like this"
にすることができます 、ただし、一部のプログラムは"
を使用します リテラル文字として。 (これは、プログラムに独自の単語分割を行わせることの欠点です。Unix では、これはシェルによって処理されます。) - クロスプラットフォーム プログラムは
getopt
の実装を使用する場合があります .
一般に、最初の脆弱性は、定着しすぎて変更できない古いプログラムに見られます。この種の長いオプションは、標準の getopt()
と互換性がありません 関数。
2 番目のスタイルは GNU getopt_long()
によって導入されました。 、および最初のスタイルがバンドルされた短いオプションであることを期待する既存の標準に準拠しています (つまり、 -orange
-o -r -a -n -g -e
を意味すると予想されます )。この長いオプションのスタイルが強く推奨されます。