web-dev-qa-db-ja.com

プログラムへのオプションの受け渡し:1ダッシュと2ダッシュの規則は何ですか?

一部のプログラムは、次のようなオプションを取ります。

$ someprogram -orange Apple

そして他のプログラムはこのようなものを使用します:

$ otherprogram --orange Apple

Linux/Unix/OSXにこれに関する「ルール」または規則はありますか?

7
Closure Cowboy

最も一般的なのは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の実装を使用する場合があります。
22
user1686

一般的に、最初のものは、変更するにはあまりにも定着している古いプログラムに見られます。これらの種類の長いオプションは、標準のgetopt()関数と互換性がありません。

2番目のスタイルはGNU getopt_long()によって導入され、最初のスタイルに短いオプションがバンドルされることを期待する既存の標準に準拠しています(つまり、-orange is -o -r -a -n -g -eを意味することが期待されます)。このスタイルの長いオプションが強く推奨されます。

5
geekosaur