iFr*_*cht 5 command-line options utilities
编写 CLI 工具,我面临一个难题。
该工具应该检测图像中的人脸并自动模糊它们。但是,有时只应执行其中一项操作即可使用外部工具手动标记其他面。所以我想支持三种行为:
我解决这个问题的想法是两个相互排斥的选项,比如--only-detect和--only-blur。
但是,一位同事建议使用--detectand可能更有意义--blur,因此使用这两个选项会导致与使用 none 相同的行为,但我发现这不太直观。
我现在的问题是:我可以遵循任何惯例来做出这个决定吗?我找到了POSIX Utility Conventions,他们确实提到了互斥组,但这里没有任何帮助。
POSIX 只是说(关于 POSIX 实用程序中互斥的命令行选项):
除非实用程序描述另有说明,否则使用相互冲突的互斥参数会产生未定义的结果。
某些命令行工具具有冲突的命令行选项(例如--silent选项和--verbose选项)。在调用工具时同时使用这两个选项的情况下,如果允许,最后解析的选项(行中的最后一个)通常会获胜。
将使用--blur和的最后一个--detect。该文档将指定哪些选项是排他性的。
例如,ls -l -C与ls -C -l进行比较。
其他工具只是禁止冲突的命令行选项,在标准错误流上向用户提供诊断消息,并在发生这种情况时以非零退出代码退出。
如果同时使用--blur和--detect,您的代码会出错。
这是在cut具有冲突标志的eg中完成的-b,-c和-f。
某些工具可能会根据调用的名称提供不同的效果。因此,您的工具可以有两个名称(硬链接),一个detectface称为blurface. 这些将是完全相同的二进制文件,但程序将确定它被调用的名称,以确定要执行的操作。
这在系统上很常见,其中一些 shell 伪装成/bin/sh(POSIX shell)和它自己(例如bash在 Linux 或kshOpenBSD 上)并且sh在调用时切换到“POSIX模式” sh,或者您可能有一个编译器同时编译 C和C ++代码,并根据是否它援引作为开关模式cc或c++等(均为gcc和clang执行此)。