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

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

CLIツールを書いている間、難しい問題に直面しました。

このツールは画像内の顔を検出し、自動的にぼやけます。ただし、外部ツールを使用して他の顔を手動で表示するには、これらの操作のうちの1つだけを実行する必要があります。だから私は3つのアクションをサポートしたいと思います:

  1. 一度に顔を検出してぼやけて処理
  2. 顔のみ検出
  3. 顔だけをぼかしてください。

この問題を解決するための私の考えは、などの相互に--only-detect排他的な2つのオプションです--only-blur

しかし、同僚は、--detect使用する方が合理的である可能性があるため、両方のオプションを--blur使用すると、そうでない場合と同じ動作が発生することが示唆されましたが、これはあまり直感的ではないと思います。

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

ベストアンサー1

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

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


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

合計の最後の金額が使用されます--blur--detectドキュメントにはどのオプションが排他的であるかが記載されています。

たとえば、ls -l -C次のように比較します。ls -C -l


他のツールは単に競合するコマンドラインオプションを抑制し、標準エラーストリームからユーザーに診断メッセージを提供し、この問題が発生するとゼロ以外の終了コードで終了します。

と両方を使用すると--blurコードが破損します。--detect

これは、たとえば、cut競合フラグとを使用して行われます-b-c-f


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

これは、一部のシェルが/bin/sh(POSIXシェル)およびそれ自体(たとえばbashLinuxまたはkshOpenBSD)であるふりをしてsh呼び出されたときに「POSIXモード」に切り替えるシステムでよく発生しますsh。あるいは、CとC ++の両方のコードをコンパイルするコンパイラがあるかもしれません。ccまたは背面と呼ばれるかどうかに応じてc++モードを切り替えます。 (gcc両方ともclangこれを行います)

おすすめ記事