一部のプログラムは、次のようなオプションを取ります。
$ someprogram -orange Apple
そして他のプログラムはこのようなものを使用します:
$ otherprogram --orange Apple
Linux/Unix/OSXにこれに関する「ルール」または規則はありますか?
最も一般的なのはGNU getopt
スタイルで、短いオプションの場合は1つのダッシュ、長いオプションの場合は2つのダッシュがあります。
当初、Unixプログラムは、単一のダッシュが前に付いた1文字のオプションを取り、オプションでバンドルされていました。
_ls -laF
ls -l -a -F
_
上記の2つのコマンドは同じです。
オプションが値を取ると、バンドルがオーバーライドされます。_gpg -aofoo.gpg
_では、_-a
_と_-o
_はオプションであり、_foo.gpg
_は_-o
_に指定された値です。
とにかく、彼らのほとんどはそうしました。
_tar cvzf
_ はよくある光景です。現在のバージョンは_tar -cvzf
_も受け入れ、ダッシュを追加するかどうかに応じて、引数は非常に異なる方法で解釈されます。たとえば、これら2つは同じことを意味します(ダッシュレスオプションが値の直前にnotないことに注意してください):
_tar -xf file.tgz -vzO /etc/passwd /var/backups
_
_tar xfvzO file.tgz /etc/passwd /var/backups
_
BSD ps
常に_-
_を使用します; SysV ps
決してしません。 Linuxバージョンは両方のバージョンを受け入れ、オプションの前にダッシュが付いているかどうかに応じて動作を変更します。 (上記のtarの例とは異なり、psはオプションmeaningsも変更します。)
X11プログラムは、1つのダッシュまたは場合によってはプラス記号が前に付いた長いオプションを使用していました。
_xterm -class FooTerm +vb -u8
_
これにより、オプションclass
と_u8
_が設定され、unsetsvb
オプションが設定されます。
X11スタイルはオプションのバンドルと互換性がありません。
その後、1文字のオプションと互換性のある方法で、長いオプションがGNU getopt()
に追加されました。
_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
_を好むものもあります。/
_を使用し、_-
_を受け入れるものもあれば、only_-
_を受け入れるものもあります。/foo bar
_、_/foo=bar
_、_/foo:bar
_として指定できます。/quoted "like this"
_にすることができますが、一部のプログラムでは_"
_をリテラル文字として使用します。 (これは、プログラムに独自のワード分割を行わせることの欠点です。Unixでは、これはシェルによって処理されます。)getopt
の実装を使用する場合があります。一般的に、最初のものは、変更するにはあまりにも定着している古いプログラムに見られます。これらの種類の長いオプションは、標準のgetopt()
関数と互換性がありません。
2番目のスタイルはGNU getopt_long()
によって導入され、最初のスタイルに短いオプションがバンドルされることを期待する既存の標準に準拠しています(つまり、-orange
is -o -r -a -n -g -e
を意味することが期待されます)。このスタイルの長いオプションが強く推奨されます。