web-dev-qa-db-ja.com

コマンドラインオプションのスタイル-POSIXまたは何ですか?

どこかで、WindowsとUnixのスタイルの混合を使用しているとされるJava/javacに対する暴言を見ました

Java -classpath ... -ea ... Something

私見、それはミックスではなく、findも同様に機能するようですよね? AFAIK、POSIXによると、構文は次のようになります

Java --classpath ... --ea ... Something

および-abcdefは、6つの短いオプションを一度に指定することを意味します。一般に、どのバージョンが入力やエラーの減少につながるのでしょうか。

私はJavaで小さなユーティリティを書いており、決してWindowsスタイルを使用するつもりはありません/a /b私は主にUnixに興味があるからです。どのスタイルを選ぶべきですか?

16
maaartinus

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、および中間システム用)は、コンマで区切られた位置パラメーターを使用する傾向があり、一般にユーザーフレンドリーまたは優れたインターフェースではないと見なされています。

21

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マシン上):lsgrepmansedbashなど(EDIT:これらは明らかにGNU主義ですが、BSDおよびOS Xマシンはこのスタイルを使用していません)

これを解析するためのライブラリがいくつかあります(最もよく知られているのは GNUの実装getopt のことです)。長短のオプションを指定するだけです。存在するか、引数を取るかどうか、およびオプションが見つかった場合の対処方法。 (そしてもちろん、位置引数、つまり-で始まらず、以前のオプションの引数ではない引数)をどうするか)

findは非常に古いプログラム(または、おそらく非常に古いプログラムの書き直されたバージョン)であり、新しいコマンドライン構文を使用するように簡単に変更することはできません。スクリプトが多すぎると壊れ、古い構文に慣れているユーザーが多すぎると文句を言うでしょう。 javacgccとその友人の影響を受けた可能性が高く、歴史的な理由で古い構文に従っています。

15
Frits
  • ダッシュ-ダッシュ(--long-arg)はGNU規約です(それらの getopt 実装を参照))。
  • POSIXコマンドは、二重ダッシュ引数を使用しません。これは、デフォルトでGNU=を使用するLinuxを除き、Unix(Mac OS X、BSD)のほとんどのバリアントに適用されます。

Javaプロジェクトの場合、 GNU getopt for Java または Apache CLI をチェックアウトすることをお勧めします。これらは両方の規則をサポートしています。

3番目のオプションは、Java VM引数を使用して、ランタイムがそれらを解析できるようにすることです。

 $ Java -Dcolor=blue

そして、コードで:

 System.getProperty("color");

個人的には、-DイディオムとJavaクラスパスのチェックなどのコマンドライン解析を処理するシェルスクリプトでの呪文をラップします。これにより、ネイティブユーザーがJavaプログラム。

8
Martin Wickman

場合によります。私は個人的にはPOSIXスタイルを好みますが、あなたの場合、ツールが使用される環境との一貫性を目指していると思います。これは、JARのJava規則を使用することを意味します(典型的なUnixコマンドのように見えるラッパースクリプトを用意する予定がない限り)。

1
Adam Byrtek