CLIツールを書いている間、難しい問題に直面しました。
このツールは画像内の顔を検出し、自動的にぼやけます。ただし、外部ツールを使用して他の顔を手動で表示するには、これらの操作のうちの1つだけを実行する必要があります。だから私は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シェル)およびそれ自体(たとえばbash
Linuxまたはksh
OpenBSD)であるふりをしてsh
呼び出されたときに「POSIXモード」に切り替えるシステムでよく発生しますsh
。あるいは、CとC ++の両方のコードをコンパイルするコンパイラがあるかもしれません。cc
または背面と呼ばれるかどうかに応じてc++
モードを切り替えます。 (gcc
両方ともclang
これを行います)