我注意到,当在输入参数之前使用标志而不是在末尾添加标志时,某些程序的工作方式会有所不同。所以我想知道,在 Ubuntu CLI 程序中,通常接受的参数和标志的排序方式是什么。
我特别想问的是 Ubuntu,因为这是我关心的平台。我知道这取决于正在运行的程序,但标准是什么?
例如:
./myprog -d file.txt
对比
./myprog file.txt -d
答案1
没有正确的顺序,因为程序不同,顺序也不同。操作系统只是按照给出的顺序将命令行参数交给程序。解析它们的方式取决于程序或所使用的解析库。
在大多数情况下,顺序并不重要,常见的解析库(如getopt
Python 的argparse
解析库)允许顺序无关的解析。但其他程序可能更挑剔。还请注意,即使使用顺序无关的解析,您仍然有顺序相关的参数。这意味着某些选项必须跟在参数后面:
ls --sort time -l
此处time
是选项的参数,因此必须位于其后。但是和的--sort
顺序并不重要。许多程序允许书写以使其更明确,但并非所有程序都这样做。--sort time
-l
--sort=time
GNU 项目确实有一个命令行处理的编码标准并且他们的大多数工具都遵循这一点,但这并不是你可以依赖的东西。
在顺序确实重要的情况下,您通常会这样做,./myprog -d file.txt
而且在 shell 脚本中看起来也更好。./myprog file.txt -d
当您刚输入内容并想添加一个-d
标志时,这种书写风格更适合命令行,但不是将光标一直返回到行的中间。
答案2
据我所知,没有惯例。如果您正在开发程序/脚本,则由您决定如何处理顺序。例如,find
如果我将与目录相关的参数放在与命名相关的参数之后,命令将发出警告。
$ find /etc -iname "passwd" -maxdepth 1
find: warning: you have specified the -maxdepth option after a non-option argument -iname, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
/etc/passwd
其他程序可能不关心顺序。我有一个简单的getopts.sh
脚本,当我需要在另一个脚本中使用命令行参数时,我会保留它,它会不按特定顺序解析参数
$ getopts.sh test1 -w1 test2
Hello, I'm main
The arguments are test1 -w1 test2
答案3
POSIX 惯例和建议是选项(带有 - 的东西)位于参数/操作数(其他一切)之前。这是最安全的假设。
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02