どこかで、WindowsとUnixのスタイルの混合を使用しているとされるJava/javacに対する暴言を見ました
Java -classpath ... -ea ... Something
私見、それはミックスではなく、find
も同様に機能するようですよね? AFAIK、POSIXによると、構文は次のようになります
Java --classpath ... --ea ... Something
および-abcdef
は、6つの短いオプションを一度に指定することを意味します。一般に、どのバージョンが入力やエラーの減少につながるのでしょうか。
私はJavaで小さなユーティリティを書いており、決してWindowsスタイルを使用するつもりはありません/a /b
私は主にUnixに興味があるからです。どのスタイルを選ぶべきですか?
tility Conventions の章にPOSIX引数の規則があります。 POSIXスタイルは、1つのダッシュとそれに続くオプションを示す1文字のオプションで構成され、引数の値はスペースでオプションと区切られています。
ルールには例外があります-たとえばfind
-が、これらは歴史的なUnixの先例によるものです。
Xウィンドウ(X11)は、find
のような単一ダッシュの長い名前のオプションを使用します。
二重ダッシュの長い名前のオプションは、GNU(接頭辞として+
を使用した迂回の後)によって開拓されました)。
さまざまな既知のコマンドライン引数処理システムの説明については、この StackOverflow 質問を参照してください。たくさんあります。 (これが書かれてから、質問が決定された権限SO 367309はSOに適していませんでした。別の質問 nix Shellコマンドの一般的な構文は何ですか? 。)
次のような構造が得られるgit
(および他の多くのシステム)をカバーするように手法のリストを拡張できます。
basecommand
[グローバルオプション] subcommand
[サブコマンドオプション] [名前...]多くのサブコマンドがあり、それぞれに独自のオプションの辞書があります。
もちろん、Windowsでは、ダッシュ '/
'ではなく、スラッシュ '-
'を使用してオプションを示します。
JCL(z/OS、OS/360、および中間システム用)は、コンマで区切られた位置パラメーターを使用する傾向があり、一般にユーザーフレンドリーまたは優れたインターフェースではないと見なされています。
EDIT:このスタイルはGNU-ismであり、GNUベースでないUnixはシングルダッシュ構文を使用する傾向があることが指摘されています(特に、OS XおよびBSDバリアント)。
GNU-ismステータスであるにもかかわらず、新しく作成された多くのUnixスタイルのプログラムはこのスタイルを使用しています。
--long-option
長いオプション名の場合、-s
は短い(1文字の)オプション、-abc
引数なしの複数の短いオプションの場合(オプションごとに1文字)。--long arg
または長いオプションの場合は--long=arg
-s arg
、-sarg
または(オプションで)-s=arg
短いオプション。 only最後のものに引数がある限り、これは他の短いオプションと組み合わせることができます。Linuxシェルを任意の時間使用したことがある人は、このスタイルに精通している必要があります1、それゆえ、それはその側に最小の驚きの原則を持っています。長いオプションがあいまいになることなく、複数の短いオプションをグループ化できることも素晴らしいことです。
1たとえば、このスタイルを使用しているいくつかのプログラム(私のLinuxマシン上):ls
、grep
、man
、sed
、bash
など(EDIT:これらは明らかにGNU主義ですが、BSDおよびOS Xマシンはこのスタイルを使用していません)
これを解析するためのライブラリがいくつかあります(最もよく知られているのは GNUの実装getopt のことです)。長短のオプションを指定するだけです。存在するか、引数を取るかどうか、およびオプションが見つかった場合の対処方法。 (そしてもちろん、位置引数、つまり-
で始まらず、以前のオプションの引数ではない引数)をどうするか)
find
は非常に古いプログラム(または、おそらく非常に古いプログラムの書き直されたバージョン)であり、新しいコマンドライン構文を使用するように簡単に変更することはできません。スクリプトが多すぎると壊れ、古い構文に慣れているユーザーが多すぎると文句を言うでしょう。 javac
はgcc
とその友人の影響を受けた可能性が高く、歴史的な理由で古い構文に従っています。
--long-arg
)はGNU規約です(それらの getopt 実装を参照))。Javaプロジェクトの場合、 GNU getopt for Java または Apache CLI をチェックアウトすることをお勧めします。これらは両方の規則をサポートしています。
3番目のオプションは、Java VM引数を使用して、ランタイムがそれらを解析できるようにすることです。
$ Java -Dcolor=blue
そして、コードで:
System.getProperty("color");
個人的には、-D
イディオムとJavaクラスパスのチェックなどのコマンドライン解析を処理するシェルスクリプトでの呪文をラップします。これにより、ネイティブユーザーがJavaプログラム。
場合によります。私は個人的にはPOSIXスタイルを好みますが、あなたの場合、ツールが使用される環境との一貫性を目指していると思います。これは、JARのJava規則を使用することを意味します(典型的なUnixコマンドのように見えるラッパースクリプトを用意する予定がない限り)。