我应该在命令行工具上使用互斥选项吗?

iFr*_*cht 5 command-line options utilities

编写 CLI 工具,我面临一个难题。

该工具应该检测图像中的人脸并自动模糊它们。但是,有时只应执行其中一项操作即可使用外部工具手动标记其他面。所以我想支持三种行为:

  1. 一次检测人脸并对其进行模糊处理
  2. 只检测人脸
  3. 只模糊人脸

我解决这个问题的想法是两个相互排斥的选项,比如--only-detect--only-blur

但是,一位同事建议使用--detectand可能更有意义--blur,因此使用这两个选项会导致与使用 none 相同的行为,但我发现这不太直观。

我现在的问题是:我可以遵循任何惯例来做出这个决定吗?我找到了POSIX Utility Conventions,他们确实提到了互斥组,但这里没有任何帮助。

Kus*_*nda 7

POSIX 只是说(关于 POSIX 实用程序中互斥的命令行选项):

除非实用程序描述另有说明,否则使用相互冲突的互斥参数会产生未定义的结果。


某些命令行工具具有冲突的命令行选项(例如--silent选项和--verbose选项)。在调用工具时同时使用这两个选项的情况下,如果允许,最后解析的选项(行中的最后一个)通常会获胜。

将使用--blur和的最后一个--detect。该文档将指定哪些选项是排他性的。

例如,ls -l -Cls -C -l进行比较。


其他工具只是禁止冲突的命令行选项,在标准错误流上向用户提供诊断消息,并在发生这种情况时以非零退出代码退出。

如果同时使用--blur--detect,您的代码会出错。

这是在cut具有冲突标志的eg中完成的-b-c-f


某些工具可能会根据调用的名称提供不同的效果。因此,您的工具可以有两个名称(硬链接),一个detectface称为blurface. 这些将是完全相同的二进制文件,但程序将确定它被调用的名称,以确定要执行的操作。

这在系统上很常见,其中一些 shell 伪装成/bin/sh(POSIX shell)和它自己(例如bash在 Linux 或kshOpenBSD 上)并且sh在调用时切换到“POSIX模式” sh,或者您可能有一个编译器同时编译 C和C ++代码,并根据是否它援引作为开关模式ccc++等(均为gccclang执行此)。