web-dev-qa-db-ja.com

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

文字に単一のダッシュを使用し、単語に二重のダッシュを使用するという慣習はどこから来たのですか、なぜ引き続き使用されているのですか?

たとえば、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引用符を付けてもほとんど成功しません。

52
Larry

The Art of Unix Programming Eric Steven Raymondが、この実践がどのように進化したかを説明します。

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

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

[1] http://www.catb.org/esr/writings/taoup/html/ch10s05.html

64
jasonwryan

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

29
Arcege

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

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

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

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

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

すべてのプログラムがgetoptを使用したわけではありません:tarおよびpsは使用しませんでした。 rcs (または sccs )もそうではありませんでした。ダッシュがオプションで、オプション値がオプションであった場所に注意してください。

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

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開発者はこれをfirst新しいオプションを追加することでこれを行いませんでした;それらbegan既存のオプションを表にして、一致する長いオプションを提供します。

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

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

  • スクリプトはオプションに依存します。開発者はスクリプトを壊すことを心配していません
  • 書かれている コーディング基準 (効果的かもしれません)
  • 著しく互換性のない競合するツールのセットを考え出した人はいません(BSDとGNU開発者はお互いにオプション名をコピーします)。
10
Thomas Dickey

ウィキペディアで コマンドラインインターフェイス 報告されています:

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

3
enzotib

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

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

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

./aggregator -f 15

./aggregator --flush-time 15

長いオプションを使用する2番目の方法は自明です。

1
nickdu

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

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

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

0