命令行选项是否在选项名称和值之间使用等号?

Jos*_*Fox 11 options

刚开始使用kubectl作为一个例子,我注意到,kubectl run --image nginx ...kubectl run --image=nginx ...双方的工作。

对于一般的命令行程序,是否有关于选项名称和值之间是否允许/需要等号的规则?

Adm*_*Bee 11

通常,如何解释命令行参数的实现完全由程序员决定。

也就是说,在许多情况下,“长”选项的值(例如引入--option_name=在选项名称和值(即--option_name=value)之间指定一个,而对于单字母选项,更习惯于将带有空格的标志和值,例如-o value,或者根本不使用分隔符(例如-oValue)。

GNU date 实用程序手册页中的示例:

  -d, --date=STRING
        display time described by STRING, not 'now'
Run Code Online (Sandbox Code Playgroud)
  -f, --file=DATEFILE
        like --date; once for each line of DATEFILE
Run Code Online (Sandbox Code Playgroud)

如您所见,当使用“短”形式(即-d)时,该值将与选项开关用空格隔开,但=在使用“长”形式(即--date)时用空格隔开。

编辑

正如 Stephen Kitt 所指出的,GNU 编码标准推荐使用 getoptgetopt_long解析命令行选项。状态的手册页getopt_long

长选项可以采用形式为--arg=param或的参数--arg param

因此,使用该函数的程序将接受这两种形式。


Ark*_*zyk 10

一般来说,对于命令行程序,是否存在关于开关和值之间是否允许/需要等号的规则?

不,没有。开源世界和一般计算领域有许多相互竞争的标准(强制性 xkcd),每个人都可以随时提出新的规则和标准。 例如,POSIX 实用程序参数语法=根本没有提及,而man getopt 则提到了它。在实践中你可能会遇到各种命令行程序:

那些在=空格之后或之后采用长选项值的选项:

$ touch a b c d
$ ls --format=verbose
total 0
-rw-r--r-- 1 ja users 0 Mar 17 14:39 a
-rw-r--r-- 1 ja users 0 Mar 17 14:39 b
-rw-r--r-- 1 ja users 0 Mar 17 14:39 c
-rw-r--r-- 1 ja users 0 Mar 17 14:39 d
$ ls --format verbose
total 0
-rw-r--r-- 1 ja users 0 Mar 17 14:39 a
-rw-r--r-- 1 ja users 0 Mar 17 14:39 b
-rw-r--r-- 1 ja users 0 Mar 17 14:39 c
-rw-r--r-- 1 ja users 0 Mar 17 14:39 d
Run Code Online (Sandbox Code Playgroud)

那些后面不需要很长的选项值=但需要空格的:

$ readelf  -a main | grep  'program interpreter'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ patchelf --set-interpreter=fake main
patchelf: getting info about '--set-interpreter=fake': No such file or directory
$ patchelf --set-interpreter fake main
$ readelf  -a main | grep  'program interpreter'
      [Requesting program interpreter: fake]
Run Code Online (Sandbox Code Playgroud)

那些在之后取值=但不采用-or 选项的--

dd if=/dev/urandom of=~/Desktop/test.txt bs=1M count=3
Run Code Online (Sandbox Code Playgroud)

给定的命令行程序以给定的方式接受输入可能有很多原因:作者的愿景,因为没有人关心,因为作者不知道其他人已经提出了标准,因为程序已经被移植到Unix 来自不同的操作系统,具有完全不同的约定,或者已经被做成了看起来像这样

  • 我认为“dd”是一个转移话题,提出它只会混淆要点,因为“dd”的“foo=bar”是_操作数_而不是选项。还有其他程序使用“key=value”形式的参数(“awk”、“make”、“env”等),并且它们也可以接受 _options_/switches(= 以破折号开头的命令行参数)。标准 `dd` 不接受任何命令行 [_options_](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/dd.html#tag_20_31_04),尽管 GNU `dd` 接受(2 个选项:`--帮助`和`--version`)。 (3认同)
  • @ArkadiuszDrabczyk GNU dd 接受的选项是 `--help` 和 `--version`,正如已经提到的。选项和其他参数/​​操作数/等之间的区别是由标准决定的,我没有发明它;-) (2认同)