短いオプションの理論的根拠は、POSIXユーティリティ規則に文書化されています。ほとんどのオプションパーサーでは-n10
、主に広範な歴史的先例のために、値を文字()に「添付」することができます。
長いオプションの理論的根拠は、GNUのコーディング標準とのマニュアルページで指定されていますgetopt_long()
。
昔々、昔のStackOverflowで、コマンドオプションのスタイルについて質問がありました。おそらく良い質問ではありませんが、答えはそれを救ったと思います(しかし私はバイアスを認めます)。とにかく、それはその後削除されたので、ここで私の答えを復活させます。なぜなら、(a)答えを再発見するのは骨の折れるプロセスであり、(b)オプションに関連する有用な情報が含まれているからです。
何種類のオプションを認識していますか?私は以下を含む多くのことを考えることができます:
- 単一のダッシュが前に付いた1文字のオプション、引数がない場合はグループ化可能、引数はオプション文字または次の引数に付加できます(多くの多くのUnixコマンド、ほとんどのPOSIXコマンド)。
- 一重ダッシュが前に付いた一文字のオプション、グループ化は許可されていません。引数を付加する必要があります(RCS)。
- 一重ダッシュが前に付いた一文字のオプション、グループ化は許可されていません。引数は分離する必要があります(POSIX SCCS、IIRCより前)。
- 単一のダッシュが前に付いた複数文字のオプション、引数を付加するか、次の引数にすることができます(X11プログラム)。
- 1つのダッシュが前に付いた複数文字のオプションは、省略される場合があります(AtriaClearcase)。
- シングルプラス(廃止)が前に付いた複数文字のオプション。
- 二重ダッシュが前に付いた複数文字のオプション。引数は「=」の後に続く場合もあれば、別々の場合もあります(GNUユーティリティ)。
- 接頭辞/接尾辞のないオプション。一部の名前には省略形があるか、暗黙的に示されています。引数は個別にする必要があります。(AmigaOS Shell 、 porneLによって追加されました)
オプションの引数を取るオプションは、添付する必要がある場合もあれば、「=」記号の後に続く必要がある場合もあります。POSIXは、意味のあるオプションの引数をサポートしていません(POSIX getopt()は、コマンドラインの最後のオプションに対してのみオプションの引数を許可します)。
すべての賢明なオプションシステムは、--
「オプションの終わり」を意味するために二重ダッシュ('')のみで構成されるオプションを使用します。次の引数は、ダッシュで始まる場合でも「非オプション引数」(通常はファイル名)です。(私はこの表記法をサポートすることが必須であると考えています。)引数を期待cmd
するオプションを持つコマンドがある場合、引数の代わりに-f
それを呼び出すと( 、の多くのバージョンはのファイル名としてを扱うことに注意してください。次に、通常のオプションとして解析します。つまり、別のオプションの引数として解釈する必要がある場合は、オプションを終了しません。--
cmd -f -- -other
getopt()
--
-f
-other
--
すべてではありませんが、多くのプログラムは、標準入力(通常)または標準出力(場合によっては)を意味するファイル名として単一のダッシュを受け入れます。GNU' tar
'の場合と同様に、両方を1つのコマンドラインで使用できる場合があります。
tar -cf - -F - | ...
最初のソロダッシュは「stdoutへの書き込み」を意味します。2番目は「stdinからファイル名を読み取る」ことを意味します。
一部のプログラムは他の規則を使用します—つまり、ダッシュが前に付いていないオプションです。これらの多くは、Unixの最も古い時代のものです。たとえば、「tar」と「ar」はどちらもダッシュなしのオプションを受け入れるため、次のようになります。
tar cvzf /tmp/somefile.tgz some/directory
dd
コマンドはopt=value
排他的に使用します:
dd if=/some/file of=/another/file bs=16k count=200
一部のプログラムでは、オプションやその他の引数を完全にインターリーブできます。Cコンパイラ、make、GNUユーティリティは、環境内でPOSIXLY_CORRECTなしで実行されます。多くのプログラムは、オプションが他の引数の前にあることを期待しています。
などの最近のプログラムgit
では、基本コマンド名(git
)、サブコマンド(commit
)、オプション(-m "Commit message"
)が使用されるようになっています。これはsccs
、SCCSコマンドへのインターフェイス、次に、によって事前に設定されており、によってもcvs
使用されsvn
ます(これらはすべてバージョン管理システムです)。ただし、他の大きなコマンドスイートは、適切と思われる場合は同様のスタイルを採用します。
異なるシステム間で強い好みはありません。十分なオプションがない場合は、ニーモニック値を持つ1文字が便利です。GNUはこれをサポートしていますが、複数文字のオプションの前に二重ダッシュを付けてバックアップすることをお勧めします。
私が反対することがいくつかあります。最悪の1つは、同じオプション文字が、その前にある他のオプション文字に応じて異なる意味で使用されていることです。私の本では、それはノーノーですが、それが行われるソフトウェアについては知っています。
もう1つの好ましくない動作は、引数の処理スタイルの不整合です(特に、単一のプログラムの場合だけでなく、一連のプログラム内でも)。アタッチされた引数を要求するか、デタッチされた引数を要求する(またはいずれかを許可する)が、アタッチされた引数を必要とするオプションとデタッチされた引数を必要とするオプションはありません。=
また、オプションと引数を区切るために''を使用できるかどうかについて一貫性を保ってください。
多くの(ソフトウェア関連の)ものと同様に、一貫性は個々の決定よりも重要です。
何をするにしても、TAOUPのコマンドラインオプションを読み、コマンドラインインターフェイスの標準を検討してください。(JFセバスティアンによって追加されました—ありがとう;同意します。)