切り捨てられた長いコマンドラインオプションを許可するのはなぜですか?

切り捨てられた長いコマンドラインオプションを許可するのはなぜですか?

多くのコマンドラインユーティリティは長い([1]によると「GNUスタイル」)オプションを受け入れます--version。驚くべきことに、切り捨てられたバージョンは完全なオプションとして解釈されることがよくあります。たとえば、dfGNU Coreutils は以下を提供します。

user@computer ~ $ df --version
df (GNU coreutils) 8.32
Packaged by Gentoo (8.32-r1 (p0))
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund, David MacKenzie, and Paul Eggert.

--version--v切り捨てバリアント、、、およびを--ve変更すると、--ver同じ出力が得られます。ただし、オプションに文字を追加すると、突然そのオプションが無効であることが認識されます。--vers--versi--versio

user@computer ~ $ df --versionn
df: unrecognized option '--versionn'
Try 'df --help' for more information.

この動作は意図的なものですか?その理由は何ですか?私の理解は、ほとんどのユーティリティが(または同様の)依存しているということですgetoptsgetoptだからマンページで手がかりを見つけましたが、説明が見つかりませんでした。

[1] ESレーモンド。UNIXプログラミングの技術。ピアソン教育、Inc.、2004

答え1

ポイントは、タイピングを保存することです。たとえば、ls --col|less -Rスペルを書かずに入力できますls --color

(いいえ、参考資料が見つかりません。驚いたことに、getopt_long文書...でもないGNUコーディング標準。私はこれが民俗だと主張しています。 )

ユニバーサルシェルで長いオプションの完成をサポートすることはもはや役に立ちませんが、コマンドのカスタムコンプリートサポートは自動ではなく、bash(GNUシェル)のカスタムコンプリートサポートはgetopt_long約20年後に実装されました(1980年代初めから1990年代後半まで) IIRC)。

答え2

助けを求める問題の機能に加えて、他のものが関係しているかどうか疑われます。インタラクティブな使用では、ユーザーが怠惰にならないように、ユーティリティで略語を許可することが役に立ちます。

これは問題です。フォステルの法則(つまり、「受け取るものには寛大ですが、エクスポートするには厳しい」)いいえ人々の習慣的な行動は将来の変化の可能性に影響を与えるので、常に従うべき良いルールです。この場合、将来のオプションは以前に有効な略語を無効にする可能性がありますが、スクリプト作成者が時間をかけてオプションを完全に説明する限り、問題が発生するリスクは少なくなります。インタラクティブなユーザーは、アップグレード後にエラーが発生した場合にコマンドを簡単に修正できると仮定できるため、省略形を簡単に使用できます。

短縮されたスクリプトを使用することは実際には問題になる可能性があり、これらの問題を回避するために議論があります。いいえ入力に寛大です。しかし、明らかに、この場合、ライブラリの作成者が略語を受け入れることを選択したことは問題ありません。

関連情報