単一文字オプションの場合は単一ダッシュ「-」ですが、単語の場合は二重ダッシュ「-」ですか?


51

文字にシングルダッシュ、単語にダブルダッシュを使用するという慣習はどこから来たのですか?

たとえば、を入力するとls --help、次のように表示されます。

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

- and -- convention引用符でさえグーグルで試しましたが、ほとんど成功しませんでした。


6
ここではちょっとつまらないだけですが、-技術的にはハイフンと呼ばれています。ほとんどの場合、「ダッシュ」という言葉を使用してemダッシュ(—)を参照し、場合によってはenダッシュ(–)を参照しますが、どちらもハイフン(-)ではありません。
chharvey

4
よく知られているプログラムはかかわらず、規則に従わないとき、それは本当に私を悩ます:java -version
キンバリーW

4
@Jamilうん。なぜだろうと思ってここfind . -delete
クシシュトフ

以下のように物事を書くことができるように、このアイデアはある-abの両方の活性化するab。ダブルダッシュせずに、-helpアクティブになりhel、およびpオプションを。
アーロンフランケ

回答:


61

UNIXプログラミングのアートエリック・スティーブン・レイモンド、この練習はどのように進化したかについて説明します。

オリジナルのUnixの伝統では、コマンドラインオプションは単一のハイフンが先行する単一の文字です...オリジナルのUnixスタイルは、簡潔さを美徳にした低速のASR-33テレタイプで進化しました。したがって、1文字のオプション。シフトキーを押し続けるには、実際の努力が必要でした。したがって、小文字を優先し、オプションを有効にするために(おそらくより論理的な「+」ではなく)「-」を使用します。

GNUスタイルは、2つのハイフンが前に付いた(キーワード文字ではなく)オプションキーワードを使用します。数年後、かなり複雑なGNUユーティリティの一部が1文字のオプションキーを使い果たし始めたときに進化しました(これは症状のパッチであり、根本的な病気の治療法ではありませんでした)。GNUオプションは、古いスタイルのアルファベットスープより読みやすいため、人気があります。1

[1] http://www.faqs.org/docs/artu/ch10s05.html


getopt()は最初に1985年に公開されましたが、UNOS(最も古いUNIXクローン)は1982年に既にgetargs()を公開し(1980年に作成されました)、getargs()は短いオプションと単一ダッシュの長いオプション(Multicsスタイル)をサポートします。UNOSは単一ダッシュの長いオプションを大量に使用し、UNOSは元AT&Tの従業員によって作成されました。1988年に、UNOSが単一ダッシュの長いオプションがうまく機能することを確認したにもかかわらず、GNUは二重ダッシュの長いオプションを発表しました。
気味悪い

28

単一文字オプションを使用し続ける理由の1つは、それらを一緒に連結できるためです。入力ls -ltrするのはるかに簡単ですls --sort=time --reverse --format=long。両方の使用が適切な場合が何度もあります。このトピックの検索については、「unixコマンドラインオプションの規則」を試してください。


1
+1ありがとう、これは実装の背後にあるロジックを本当に助けてくれます。
ラリー

UNIX lsは理解しls --sort=time --reverse --format=longていないので、この非標準的な方法に言及するのも良い考えではありません。
schily

6

@jasonwryanによるRaymondから引用には、いくつかの有用な情報がありますが、ストーリーの途中から始まります。

  • UnixはMulticsの縮小スコープバージョンとして始まり、Unixの歴史を通じて、Unixの機能は他のシステムで見られ、使用されていた機能の模倣または適応であることが多いことに留意してください。
  • '-'オプション文字は、Multicsの中で使用されました。Bitsaversには、ユーザーコマンドのマニュアルがあります
  • 他のシステムでは異なる文字を使用し、キーストローク効率が高いと主張するもの('/'TOPSやVMSで使用されるものなど)とそうでないもの('('VM / SP CMSで使用されるものなど)があります。
  • Multics オプションは複数文字でした。たとえば、アンダースコアで区切られたキーワードです。
  • 長いMulticsオプションは、-printvs -pr(3-8ページ)のように、短く短縮された形式であることがよくありました。
  • Unixオプションは単一文字であり、数年後getoptに導入されました。元のUnixの一部ではなかったためgetopt、使用せずにそのままにしておいたユーティリティがあります。しかしgetopt、プログラムの一貫性を保つことに貢献したこと。

一方、Unixオプションgetoptは単一文字でした。他のシステム、特にすべてがより大きなシステムでは、キーワードを使用していました。一部(すべてではない)でこれらのキーワードを省略できました。つまり、オプションが明確である限り、すべての文字が提供されるわけではありません。そのテストにはあいまいさの落とし穴があります。例えば:

  • 1985年の初め、私はPrimOSに移植しなければならないプログラムに取り組んでいました。プライムの開発者は、他の各社を模倣(試行)し、各社から最もよく使用されるコマンドを提供するコマンド言語を提供することにより、他のいくつかの企業と競争しました。もちろん、略語をサポートしました(VMSと同様)。オンラインヘルプを読んだ後sta、を取得しようと入力しましたstatus。これはの略語でstart開始するものを何も与えなかったため、コマンドインタープリターはログオフしました。
  • Xツールキット(xtermで使用)では、省略オプションを使用できます。これをxtermで効果的に使用するには、コマンドパラメーターを前処理して-v(バージョンの場合)-vb(ビジュアルベル)よりも優先させる必要があります。Xツールキットには、あいまいさがある場合に優先オプションを指定する直接的な方法はありません。

このあいまいさの可能性のために、一部の開発者は略語を許可しないことを好みます。 たとえば、Lynxは略語を許可せずに複数文字オプションを使用します。

いないすべてのプログラムを使用getopttarしてpsませんでした。ダッシュがオプションであり、オプションの値がオプションであった場所に注目するとわかるように、rcs(またはsccs)もしませんでした。

これらすべてを考慮に入れて、GNU開発者は他のシステムで使用されているキーワードオプションをgetopt、各短いオプションの長いバージョンを提供するように拡張することにより適合させました。たとえば、textutils 1.0の変更ログには

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

fileutilsの変更は以前のものでした。

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

誰かがさらに早く見つけるかもしれませんが、ファイルヘッダーには最も早い日付が表示されているようです:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

(たとえば)X Toolkit(1987)と並行しています。あなたは(のような馴染みのあるUnixユーティリティのほとんどはlsps)手動に定期的に訪問を必要とする既存の単一文字のオプションを使用していました。を導入する際getopt_long、GNU開発者は最初に新しいオプションを追加することでこれを行いませんでした。彼ら、既存のオプションを集計し、一致する長いオプションを提供することから始めました。

それらが既存のレパートリーに追加されていたため、(再び)既存のオプションとの競合の問題がありました。これを避けるため、長いオプションの前に2つのダッシュを使用して構文を変更しました。

これらのプログラムはgetopt_long、通常の理由でこの方法で引き続き使用されます。

  • スクリプトはオプションに依存します。開発者はスクリプトを壊そうとはしません
  • 文書化されたコーディング標準があります(効果的かもしれません)
  • 著しく互換性のない競合ツールのセットをだれも作成していません(BSDとGNU開発者の両方が互いからオプション名をコピーします)

3

ウィキペディアのコマンドラインインターフェイスでは、次のことが報告されています。

Unixライクシステムでは、オプションを指定するためにASCIIハイフンマイナスがよく使用されます。通常、文字の後に1つ以上の文字が続きます。通常、文字を含まない単一のハイフン-マイナスの引数は、通常、プログラムが標準入力からのデータを処理するか、標準出力にデータを送信することを指定します。一部のプログラムでは、2つのハイフンマイナス文字(-)を使用して、より詳細なオプション名が使用される「長いオプション」を指定します。これはGNUソフトウェアの一般的な機能です。


これは、コンベンションがどこから来たのか、なぜそれが使用され続けるのかという質問には答えません。
chharvey

1

私の推測では、より説明的なオプションが望まれ、より長いオプションを使用すると、単一文字のオプションが不足することを心配する必要がなくなるでしょう。

長いオプションが必要だと判断したら、少なくとも長いオプションと短いオプションの両方をサポートする予定がある場合は、問題が発生します。私は前向きではありませんが、私はアルセジの答えがなぜ-と-の鍵を握ると信じています。一般的な処理ルーチン、たとえば getopt_long()は、単一のコマンドライン引数に複数のオプションを含めることができるかどうかを知る必要があります。-ltr。したがって、処理ルーチンは2つを区別できる必要があります。1つのダッシュ(-)を読んだ場合、コマンドラインの残りの引数は複数のオプションと一致する可能性があります。二重ダッシュ-を読んだ場合、残りのコマンドライン引数は単一のオプションと一致する必要があります。

私は最近getopt_long()を使用しましたが、覚えやすく自己文書化が容易であるため、長いオプションが好きになり始めています。次の2つのコマンドがある場合:

./aggregator -f 15

./aggregator --flush-time 15

長いオプションを使用する2つ目は、より自明です。


0

2つの方法が使用される理由はおそらくいくつかあります。もちろん、1つは伝統です。プログラマーとユーザーは人間であり、人間は物事が特定の方法で機能することを期待しています。変更する理由がない場合(実際、コマンドラインの場合、変更する理由はあまりありません)、変更しないでください。

そうは言っても、単一のハイフンを長いオプションに使用したり、ハイフンを完全に削除したりするツールがあることは知っています。これらのツールは、最初は難しい場合があり、そうでなければ統一されたシステムではいぼとして突出する傾向があります。

2つの違いを学習しているとき(および2番目の性質になる前)、「短い」ハイフンは「短い」オプションと一致し、「長い」(または二重)ハイフンは「長い」と一致することを常に覚えています。オプション。その推論がダブルハイフンスタイルの開発に使用されたかどうかはわかりませんが、可能性はあります。

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