【问题标题】:Should "explicit off" command line switch be considered harmful?“显式关闭”命令行开关是否应该被认为是有害的?
【发布时间】:2011-10-08 03:42:29
【问题描述】:

我们尽量在命令行中为processing arguments and switches 遵循“标准”。例如,默认情况下,我们使用 Posix2 和 GNU standards 进行命令行解析。

但是,由于我们的实用程序是跨平台的,并且我们希望它们可以从跨平台脚本中访问,因此我们也尽量做到“健壮”。因此,我们隐含地允许这两种形式:

  myutil --longname

  myutil /longname

这在所有情况下都不是完美的,因为它可能有些模棱两可,例如 Posix 支持折叠“短”开关名称(它们是相同的):

  myutil -abcd
  myutil -a -b -c -d
  myutil /a /b /c /d

(...我们不支持在 Win 平台上折叠“短名称”,因为那是模棱两可的。)

另一个看起来有点奇怪的跨平台开关问题是“显式关闭”开关,其中尾随的“-”明确将开关标识为“关闭”:

  myutil -a-
  myutil --longname-
  myutil /a-
  myutil /longname-

这是明确的,所以我们认为它可以接受。 (“/a/”和“/longname/”的“显式关闭”看起来很奇怪,所以我们将尾随的“-”作为“跨平台内部标准”。)

回想一下,开关的这种历史“显式关闭”有时对于显式“关闭”默认为“打开”的值或删除以前可能已添加到命令行的开关很有用-组装(例如从脚本组装命令行时,稍后决定“删除”先前添加的开关)。

但是,经审查:这种“显式关闭”开关是否会被视为有害(不良形式)?

例如,如果一个实用程序默认将“-v”(--verbose)设置为“开启”,我们可以设置一个“否定开关”来开启关掉:

  myutil -v-

...或者,我们可以仅仅将“-q”(--quiet)定义为“开关”,隐含地变成“ on" 一个 "quiet" 选项(这意味着 "-v" 开关的 "off"):

  myutil -q

当然,对于任何给定的实用程序,支持“-v-”和“-q”两种形式都是冗余,因为它们会做同样的事情。 (在此示例中,另一个选项是多个“详细级别”,其中一个级别为“安静”,但目的是说明显式禁用开关的“开/关”性质。)

在浪费了太多时间的详尽网络搜索之后,“显式关闭”开关似乎在这些天已基本失宠(例如,它甚至没有在 (Gnu) "Standards for Command Line Interfaces". 中提及)

问题:是否应将开关的历史“显式关闭”视为有害?

除了支持“负开关”,新的命令行实用程序是否应该支持“正开关”或命令行选项到包含级别作为“良好形式”?)如果是这样,是甚至有理由再支持“显式关闭”开关(对于今天创作的新实用程序)?

【问题讨论】:

  • 请提供explicit off的参考。在我多年阅读 Sun 和 AIX 手册页(包含一些 Linux 和其他一些)的过程中,我从未见过尾随 - 表示“关闭它”。祝你好运!
  • @shellter:我很少看到这种情况,但一个例子是 Debian 的 aptitude 命令,其中 aptitude install foo- 实际上表示“卸载 foo”,aptitude remove foo+ 实际上表示“安装 foo”。这意味着您可以方便地同时进行这两项操作,例如aptitude install bar foo- 安装 bar 但删除 foo。我知道我在其他地方也看到了尾随 -,但我现在不记得在哪里。
  • 我想知道 explicit off 概念是否从非 Unix/Linux OS_s 的旧代码(可能是 DEC 或类似的东西)中渗入了一些开源项目?无论如何,它似乎进一步混淆了命令行处理的水,很难看出它是如何增加价值的。对于标有-+ 的args 隐含的反转含义已经够糟糕了。如果您发现有关explicit off 的来源和/或好处的其他信息,请编辑您的问题或添加其他评论。祝你好运!
  • 您也可以将此问题提交到其他论坛,在这些论坛中,此类内容会被视为有趣的侧边栏,即 comp.unix.shell inet 新闻组可能是合适的。祝你好运2!

标签: command-line cross-platform command-line-arguments


【解决方案1】:

我从来没有听说过- 用于关闭开关。在 UNIX 领域,它在 no- 前面使用 --no-verbose 关闭 --verbose。至少,Ruby 的OptionParser 直接支持这一点;不知道其他人。

至于这种“有害”的模式:绝对不是。拥有流畅的注释行界面总是好的。考虑一个更具破坏性的选项,例如覆盖现有文件的--force。进一步考虑,用户可以为给定命令指定她的默认命令行选项的方案。现在,如果她将--force 配置为默认开启;如何根据具体情况将其关闭?

我们不希望她编辑她的配置文件来禁用--force,因此我们提供--no-force 来覆盖它。

可否定的长格式选项在其他脚本或 crontab 中也很有帮助,可以非常清楚地说明发生了什么:

3 * 1 * * awesome_script.sh --force my_files
0 * * * * awesome_script.sh --no-force my_files

必须维护这个的可怜的系统管理员不必去寻找 awesome_script.sh 的文档(假设它甚至存在)来知道这里发生了什么。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2011-09-16
    • 2010-09-30
    • 2011-04-30
    • 2010-12-26
    • 2012-11-25
    • 1970-01-01
    • 2012-02-15
    • 2018-05-01
    相关资源
    最近更新 更多