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


16

どこかで、次のようなWindowsスタイルとUnixスタイルの混在を使用したjava / javacに対する暴言を見ました

java -classpath ... -ea ... Something

私見、それはミックスではありません、それはちょうどfind作品のようでもありませんか?知る限り、POSIXによると、構文は次のようになります。

java --classpath ... --ea ... Something

そして-abcdef、一度に6短いオプションを指定することを意味します。どのバージョンが一般的にタイピングとエラーの減少につながるのだろうか。

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


1
POSIX 1003.1-2003、基本定義、第12章、セクション2には、ユーティリティのコマンドライン構文に関する次のガイドラインがあります。「すべてのオプションの前に「-」区切り文字を付ける必要があります。」
グレッグA.ウッズ

回答:


21

POSIX引数の規則は、ユーティリティの規則の章にあります。POSIXスタイルは、単一のダッシュの後にオプションを示す単一の文字が続くオプションで構成され、引数値はオプションとスペースで区切られます。

ルールには例外があります- findたとえば-しかし、これは歴史的なUnixの先例によるものです。

X Windows(X11)はfind、単一ダッシュのような長い名前のオプションを使用します。

二重ダッシュのロングネームオプションは、GNUによって開拓されました(+プレフィックスとして使用する迂回の後)。

さまざまな既知のコマンドライン引数処理システムの説明については、このStackOverflowの質問を参照してください-たくさんあります。(これが書かれて以来、SO 367309という質問はSOに適していないと判断されました。別の質問、Unixシェルコマンドの一般的な構文は?)に答えを移しました

テクニックのリストを拡張してgit、次のような構造を取得する(および他の多くのシステム)をカバーできます。

  • basecommand[ グローバルオプション ] subcommand[ サブコマンドオプション ] [名前...]

多くのサブコマンドがあり、それぞれにオプションの辞書があります。

もちろん、Windowsは(使用済みの)スラッシュ「/」を使用して、ダッシュ「-」の代わりにオプションを示します。

JCL(z / OS、OS / 360、および中間システム用)は、コンマで区切られた定位置パラメーターを使用する傾向があり、一般にユーザーフレンドリーまたは優れたインターフェースではないと見なされます。


1
+1素敵なリンクと言及についてgit
maaartinus

私はすべての答えが好きです、リンクのためにこれを受け入れました。
-maaartinus

stackoverflowの質問は削除された(または移動された可能性がある)ようです。私はそれを読んでみたいです。
mizipzor

1
@mizipzor:情報の現在の場所の更新を参照してください。オプション引数付きの短い/長いオプション
ジョナサンレフラー

「もちろん、Windowsはダッシュ(-)の代わりに(使用済み)スラッシュ '/'を使用してオプションを示します。 " Windowsコマンドラインツールの大部分は両方をサポートするようになり、PowerShellはダッシュのみの使用方法を採用しています。
jpmc26

15

編集:このスタイルはGNU主義であり、非GNUベースのUnixは一重ダッシュ構文(特にOS XとBSDの亜種)を使用する傾向があることが指摘されています。

GNU主義の状態にもかかわらず、新しく書かれた多くのUnixスタイルのプログラムはこのスタイルを使用しています。

  • --long-option 長いオプション名の場合、
  • -s 短い(1文字​​の)オプションの場合、
  • -abc 引数なしの複数の短いオプションの場合(オプションごとに1文字)。
  • 引数を持つオプション:
    • --long argまたは--long=arg長いオプションの場合、
    • -s arg-sargまたは(オプション)-s=arg短いオプションの場合。最後のオプションのみに引数がある限り、これは他の短いオプションと組み合わせることができます。
  • 同じ「セマンティック」オプションは、いくつかのエイリアスを持つことができます。最も一般的なのは、短い(入力が速い)エイリアスと、長い(覚えやすい)エイリアスです。

Linuxシェルを長い間使用している人は誰でもこのスタイルに精通している必要があります1。長いオプションとあいまいになることなく、複数の短いオプションをグループ化することもできます。

1は、例えば、(私のLinuxマシン上で)このスタイルを使用するプログラムのいくつかは:lsgrepmansedbash、など(EDIT:これらは、BSDおよびOS Xマシンがこのスタイルを使用していないものの、明らかGNU-ISMSです)

あなたのためにこれを解析することができるいくつかのライブラリがあります(最もよく知られているgetoptのGNUの実装である)、あなたが必要なのは、長いオプションと短いオプション、引数を取るかどうか、そしてオプションが見つかりました。(そしてもちろん、位置引数、つまり、前のオプションの引数ではなく、前の引数の引数に対して行うこと)-

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


+1-さらに、何百ものオプションがある場合、創造を得る必要があります(たとえば、コンパイラを書くとき)
ティムポスト

1
あなたは、すべてのUnicesがGNU utils(つまりダッシュ-ダッシュ引数)を使用していて、それが間違っているという印象を与えます。Mac OS Xはそれらをサポートしておらず、Free BSDにも同じことが当てはまります。
マーティンウィックマン

8
  • dash-dash(--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プログラムを実行しやすくなります。


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.