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

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

kubectl作为示例,我注意到

kubectl run --image nginx ...

kubectl run --image=nginx ...

两者都有效。

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

答案1

一般来说,如何解释命令行参数的实现完全由程序员自行决定。

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

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

  -d, --date=STRING
        display time described by STRING, not 'now'
  -f, --file=DATEFILE
        like --date; once for each line of DATEFILE

正如您所看到的,当使用“短”形式(即 )时,该值将与选项开关以空格分隔-d,而=当使用“长”形式(即--date)时,该值将由 。

编辑

正如史蒂芬·基特所指出的,GNU编码标准建议使用 getoptgetopt_long来解析命令行选项。手册页的getopt_long状态:

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

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

答案2

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

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

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

$ 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

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

$ 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]

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

dd if=/dev/urandom of=~/Desktop/test.txt bs=1M count=3

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

相关内容