web-dev-qa-db-ja.com

コマンドラインツールで相互に排他的なオプションを使用する必要がありますか?

CLIツールを書いているとき、私は難問に直面しています。

このツールは、画像内の顔を検出し、それらを自動的にぼかすようになっています。ただし、外部ツールを使用して追加の面を手動でマークできるようにするには、これらの1つだけを実行する必要がある場合があります。したがって、私がサポートしたい3つの動作があります。

  1. 顔を検出し、一度にぼかします
  2. 顔のみを検出する
  3. 顔をぼかすだけ

これを解決するという私の考えは、--only-detect--only-blurのような2つの相互に排他的なオプションでした。

ただし、同僚は、--detect--blurを使用する方が理にかなっている可能性があることを提案しました。これにより、両方のオプションを使用すると、noneを使用した場合と同じ動作になりますが、これは直感的ではありません。

私の質問は次のとおりです:この決定を行うために従うことができる規則はありますか?私は POSIXユーティリティ規則 を見つけました、そしてそれらは相互に排他的なグループについて言及していますが、ここで役立つことは何もありません。

4
iFreilicht

POSIXは次のように述べています(POSIXユーティリティの相互に排他的なコマンドラインオプションに関して):

ユーティリティの説明で特に指定されていない限り、競合する相互に排他的な引数を使用すると、未定義の結果が生成されます。


一部のコマンドラインツールには、競合するコマンドラインオプションがあります(--silentオプションと--verboseオプションの両方など)。ツールを呼び出すときに両方のオプションが使用される場合、許可されていれば、通常、最後に解析されたオプション(行の最後のオプション)が優先されます。

--blur--detectの最後のものが使用されます。ドキュメントには、どのオプションが排他的であるかが指定されています。

たとえば、ls -l -Cls -C -lを比較します。


他のツールは、競合するコマンドラインオプションを単に許可せず、ユーザーに標準エラーストリームの診断メッセージを提供し、そのような状況が発生したときにゼロ以外の終了コードで終了します。

--blur--detectの両方が使用された場合、コードはエラーになります。

これは、例えばで行われます。フラグ-b-c、および-fが競合するcut


一部のツールは、呼び出される名前に応じて異なる効果を提供する場合があります。したがって、ツールに2つの名前(ハードリンク)を付けることができます。1つはdetectfaceと呼ばれ、もう1つはblurfaceと呼ばれます。これらはまったく同じバイナリですが、プログラムは、実行する操作を把握するために呼び出された名前を決定します。

これは、一部のシェルが/bin/sh(POSIXシェル)とそれ自体(たとえば、Linuxではbash、OpenBSDではksh)の両方になりすまし、shまたはとして呼び出されると「POSIXshモード」に切り替わるシステムで一般的です。 ccまたはc++などとして呼び出されるかどうかに応じて、CコードとC++コードの両方をコンパイルし、モードを切り替えるコンパイラーがある場合があります(gccclangの両方がこれを行います)。

7
Kusalananda

ほとんどの場合、ユーザーがプログラムに何をしてほしいかを自問し、それをデフォルトの動作にします。このデフォルトの動作は、オプションが指定されていない場合に自動的にトリガーされます。一方、ifオプションが指定されている場合、nothingオプションで指定されていない限り、コマンドによって実行されます。


これが私が考えるものの反例です痛々しいほど貧しいプログラミング:

avconv -i file.avi

ビデオファイルに関する情報を出力します。-iは入力ファイルを設定します。出力が指定されていないため、avconvは情報が必要なだけです。

avconv file.avi

avconvは意図的に引数を出力ファイルとして受け取り、何があっても書き込みを行うため、何も書くことがなくても。

私はあなたがポイントを得ると思います。


これが私が直感的に呼ぶものです。デフォルトの動作が

  • 検出とぼかしの両方:
    • commandおよび
      command --detect --blurは検出してぼかします
    • command --detectは検出のみを行います
    • command --blurはぼやけるだけです
  • 1つだけ、たとえば検出用:
    • commandおよび
      command --detectは検出するだけです
    • command --blurはぼやけるだけです
    • command --detect --blurは検出してぼかします。これが便利だと思われる場合は、これの省略形としてcommand --detectblurもあります。

また、短いオプション-d-bを定義して、ユーザーがcommand -bdを呼び出して、デフォルトの動作に関係なく両方のオプションを設定できるようにします。

3
dessert