POSIXシステム(Linux、MacOSXなど)では、少なくともシェルターミナルで起動される可能性のあるプログラム(たとえばそれらのほとんど)については、GNUコーディング規則(一般的な引数名もリストします)を使用し、POSIXユーティリティガイドラインを調べることをお勧めします、プロプライエタリなソフトウェアでも:
常に扱い--version
と--help
(でも/bin/true
、それらを受け入れる!!)。私は理解していないソフトウェアの作者を呪います--help
、私は彼らを嫌います(なぜならprog --help
、私は新しいプログラムで試みている最初のコマンドだからです!)多くの--help
場合、略すことができます-h
持っている--help
(あなたが最も一般的なものと、その場合リストに...それらのあまりに多くを持っていない限り、すべてのオプションのメッセージのリストを明示的には、いくつかを参照man
し、オプションのデフォルト値ページまたは一部のURL)、そしておそらく重要な(とプログラム固有) 環境変数。オプション引数エラーでこれらのオプションリストを表示します。
受け入れ-a
短い引数(単一の文字)を、いくつか同等のものを持っている--long-argument
ので-a2
--long-argument=2
、--long-argument 2
。もちろん、(めったに使用されないオプションのために)何らかの--only-long-argument
名前を持つことができます。追加のオプションのないモーダル引数の場合-cf
、一般的-c -f
になどとして処理されるため、あなたの-argument:value
提案は奇妙であり、それを行うことはお勧めしません。
GLIBC getopt_long以上を使用します(例:argp_parse、OCamlではArg
モジュール、...)
頻繁に使用する-
(あなたがそれを行うことができない場合、取り扱う標準入力または出力のために/dev/stdin
&/dev/stdout
さらにいくつかのオペレーティング・システム上でそれらを持っていません)
オプションの規則のほとんどを再利用することにより、同様のプログラムの動作を模倣します。特に-n
、ドライラン(アラmake
)、-h
ヘルプ、-v
冗長性などのために...
--
オプションとファイルまたは他の引数の間のセパレータとして使用
プログラムisatty
がstdinがターミナルであるよりもテストするために使用する場合(およびその場合は「対話的に」動作する)、プログラムにGUIインターフェースがある(およびgetenv("DISPLAY")
X11デスクトップでテストする)場合と同様に、非対話モードを強制するオプションを提供するバッチまたはコマンドラインで使用されます。
一部のプログラム(例gcc
)は間接引数リストを受け入れます。@somefile.txt
つまり、プログラム引数をsomefile.txt
; から読み取ることを意味します。これは、プログラムが非常に多くの引数(カーネルの引数を超えるARG_MAX
)を受け入れる場合に便利です。
ところで、あなたのプログラムと通常のシェル(bash
またはのようなzsh
)にオートコンプリート機能を追加することもできます。
いくつかの古いUnixコマンド(例えばdd
、またはsed
)には、歴史的な互換性のために奇妙なコマンド引数があります。私は彼らの悪い習慣に従わないことをお勧めします(あなたがそれらのより良い変種を作っているのでない限り)。
お使いのソフトウェアは、関連するコマンドラインプログラムのシリーズからインスピレーションを取る場合にはgitの受け入れ(あなたはきっと開発ツールとして使用)、git help
そしてgit --help
、多くのを持っているgit
subcommand
し、git
subcommand
--help
まれargv[0]
に、(プログラムでシンボリックリンクを使用して)を使用することもあります。たとえば、異なる動作(制限されたシェル)bash
として起動されrbash
ます。しかし、私は通常、そうすることはお勧めしません。プログラムがshebangを使用するスクリプトインタープリターとして、つまりexecve(2)によって解釈される最初の行で使用できる場合、それは理にかなっているかもしれません。このようなトリックを行う場合は、メッセージを含めてそれらを文書化してください。#!
--help
POSIXでは、シェルは(プログラムを実行する前に)引数をグロブしていることに注意してください。したがって、シェルエスケープする必要があるオプション(またはなど)の文字を要求しないでください。*
$
~
場合によっては、GNU guileやLuaなどのインタープリターをソフトウェアに埋め込むことができます(プログラミング言語の専門家でない場合は、独自のチューリング完全なスクリプト言語を発明しないでください)。これは、ソフトウェアの設計に大きな影響を及ぼします(したがって、早期に検討する必要があります!)。そうすれば、簡単にスクリプトまたは式をそのインタープリターに渡すことができるはずです。その興味深いアプローチをとる場合は、ソフトウェアとその解釈されるプリミティブを慎重に設計してください。あなたはあなたのために大きなスクリプトをコーディングする奇妙なユーザーを持つことができます。
他の例では、あなたは、高度なユーザーが自分のロードせたいかもしれないプラグインを(使用して、ソフトウェアに動的ロードラà技術dlopen
&をdlsym
)。繰り返しになりますが、これは非常に重要な設計上の決定です(したがって、プラグインインターフェイスを慎重に定義および文書化します)。これらのプラグインにプログラムオプションを渡すための規則を定義する必要があります。
ソフトウェアが複雑な場合は、いくつかの構成ファイル(プログラム引数の追加または置換)を受け入れ、おそらくすべてのコードを実行せずにこれらの構成ファイルをテスト(または単に解析)する方法があります。たとえば、メール転送エージェント(EximやPostfixなど)は非常に複雑であり、「ハーフドライ」で実行できると便利です(たとえば、実際にメールを送信せずに特定のメールアドレスを処理する方法を観察できます)。
/option
はWindowsまたはVMSのものであることに注意してください。これは、POSIXシステムでは正気ではありません(ファイル階層が/
ディレクトリセパレータとして使用するため、またシェルがグロビングを行うため)。私の答えはほとんどがLinux(およびPOSIX)に対するものです。
PS可能であれば、プログラムをフリーソフトウェアにします。一部のユーザーと開発者から改善が得られます(そして、新しいプログラムオプションを追加することは、多くの場合、既存のフリーソフトウェアに追加する最も簡単なものの1つです)。また、あなたの質問は対象となる視聴者に大きく依存します。ティーンエイジャー向けのゲームやおばあちゃん向けのブラウザは、おそらくコンパイラ、データセンターのシステム管理者向けのネットワークインスペクタ、またはマイクロプロセッサ用のCADソフトウェアと同じ種類と量のオプションを必要としません建築家または橋梁設計者向け。プログラミングとスクリプティングに精通しているエンジニアは、おばあちゃんよりも多くの調整可能なオプションを持っていることを好み、おそらくX11なしで(おそらくcrontab
仕事中に)アプリケーションを実行したいと思うかもしれません。
ls -ltr
オプションを組み合わせること-l
、-t
および-r
。GNUスタイルのプログラムでは、通常、の--reverse
代わりに二重ハイフンを使用した単語ベースのオプションも許可されます-r
。-h
ヘルプを表示したり、--
オプションの終了を通知し-
たり、stdinからの読み取りを許可するファイル名として指定したりするなど、その他の一般的な規則があります