Command line 应该";“明确关闭”;命令行开关是否有害?

Command line 应该";“明确关闭”;命令行开关是否有害?,command-line,cross-platform,command-line-arguments,Command Line,Cross Platform,Command Line Arguments,我们尽量从命令行中遵循“标准”。例如,默认情况下,我们使用Posix2和命令行解析 然而,由于我们的实用程序是跨平台的,并且我们希望可以通过跨平台脚本访问它们,因此我们也尝试做到“健壮”。因此,我们隐含地允许两种形式: myutil --longname myutil /longname 这并非在所有情况下都是完美的,因为它可能有点模棱两可,例如Posix支持折叠“短”开关名称(这些名称相同): (…我们不支持在Win平台上折叠“短名称”,因为这是不明确的。) 另一个似乎有点奇怪的跨

我们尽量从命令行中遵循“标准”。例如,默认情况下,我们使用Posix2和命令行解析

然而,由于我们的实用程序是跨平台的,并且我们希望可以通过跨平台脚本访问它们,因此我们也尝试做到“健壮”。因此,我们隐含地允许两种形式:

  myutil --longname

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

(…我们不支持在Win平台上折叠“短名称”,因为这是不明确的。)

另一个似乎有点奇怪的跨平台交换机问题是“显式关闭”交换机,其中尾随的“
-
”将交换机显式标识为“关闭”:

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

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

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

例如,如果实用程序将“
-v
”(
-verbose
)默认为“开”,我们可以使用“负开关””将其关闭:

  myutil -v-
…或者,我们可以仅将“
-q
”(
-quiet
)定义为“正开关”,它隐式地打开“安静”选项(这意味着“
-v
”开关的“关闭”):

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

在一次浪费了太多时间的彻底的网络搜索之后,“显式关闭”这一开关现在似乎已经不受欢迎了(例如,在文章中甚至没有提到)

问题:开关的历史“明确关闭”是否应被视为有害的?


新的命令行实用程序不应该支持“负开关”,而是应该支持“正开关”或命令行选项以将级别包含为“良好形式”?)如果是这样,是否还有理由再支持“显式关闭”开关(对于今天编写的新实用程序)?

我从未听说过用于关闭开关的拖尾
-
。在UNIX land中,它在前面加上
no-
,就像在
--no verbose
中一样,关闭
--verbose
。至少,Ruby的
OptionParser
直接支持这一点;对别人不确定

至于这种“有害”的模式:绝对不是。有一个流畅的评论行界面总是好的。考虑一个更具破坏性的选项,如<代码>——强制< /代码>重写现有文件。进一步考虑,一个用户可以为给定命令指定默认命令行选项的方案。现在,如果她配置了
——强制默认打开
;如何根据具体情况关闭它

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

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

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

必须维护该脚本的可怜的系统管理员不必去寻找
awesome\u script.sh
的文档(假设它存在)来了解这里发生了什么。

请提供
显式关闭的参考。在我多年阅读Sun和AIX手册页(其中包括一些Linux和其他版本)的过程中,我从未见过在
-
后面写上“关机”的字样。祝你好运@Shelleter:我很少看到这种情况,但Debian的
aptitude
命令就是一个例子,其中
aptitude install foo-
实际上意味着“卸载foo”,而
aptitude remove foo+
实际上意味着“安装foo”。这意味着您可以方便地同时执行这两项操作,例如,
aptitude install bar foo-
安装bar但删除foo。我知道我在其他地方也见过使用拖尾
-
,但我现在记不起在哪里。我想知道
显式关闭
的概念是否从非Unix/Linux操作系统(可能是DEC或类似的)的旧代码中潜入了一些开源项目?无论如何,它似乎进一步搅浑了命令行处理的水,很难看到它如何增加价值。对于标记为
-
+
的args来说,倒装的含义已经够糟糕的了。如果您发现有关
explicit off
的来源和/或好处的其他信息,请编辑您的问题或添加其他注释。祝你好运您还可以将此问题提交给其他论坛,在这些论坛中,此类内容将被视为一个有趣的边栏,即comp.unix.shell inet新闻组可能是合适的。祝你好运!
  myutil -v-
  myutil -q
3 * 1 * * awesome_script.sh --force my_files
0 * * * * awesome_script.sh --no-force my_files