命令选项的优先级?

alk*_*ary 21 command-line options rm command

我知道这rm -f file1会在file1不提示我的情况下强行删除。

我也知道rm -i file1在删除之前会先提示我file1

现在,如果您执行rm -if file1,这也将在file1不提示我的情况下强行删除。

但是,如果您执行rm -fi file1,它会在删除之前提示我file1

那么,在组合命令选项时,最后一个优先是真的吗?like rm -if, then-f将优先,但 rm -fithen the-i将优先。

ls例如命令,如果你说不要紧ls -latRls -Rtal

所以我想只有当你有矛盾的命令选项时才重要,比如rm -if,对吗?

cas*_*sey 23

使用时rm-i-f 选项,第一个将被忽略。这记录在POSIX标准中:

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.
Run Code Online (Sandbox Code Playgroud)

也在 GNUinfo页面中:

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.
Run Code Online (Sandbox Code Playgroud)

让我们看看引擎盖下发生了什么:

rm处理其选项getopt(3),特别是getopt_long。此函数将按**argv出现顺序处理命令行 ( ) 中的选项参数:

如果 getopt() 被重复调用,它会从每个选项元素中连续返回每个选项字符。

此函数通常在循环中调用,直到处理完所有选项。从这个函数的角度来看,选项是按顺序处理的。 然而,实际发生的情况取决于应用程序,因为应用程序逻辑可以选择检测冲突选项、覆盖它们或呈现错误。 对于rmif选项,它们完美地相互覆盖。来自rm.c

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;
Run Code Online (Sandbox Code Playgroud)

这两个选项设置相同的变量,这些变量的状态将是命令行中最后一个选项。这样做的效果符合 POSIX 标准和rm文档。

  • 大多数命令按顺序处理它们的参数,并且要么在冲突中出错,要么采用最后一个设置(如`rm`)。我认为很少有命令采用选项的第一个设置,并忽略会更改已设置选项的参数。 (3认同)

Fel*_*xJN 7

是的,因为rm这是有效的。如果最后一个选项覆盖以前的选项,则取决于单个程序本身。来自“信息”

'-f' '--force' 忽略不存在的文件和丢失的操作数,从不提示用户。忽略任何以前的 '--interactive' ('-i') 选项。

'-i' 提示是否删除每个文件。如果响应不是肯定的,则跳过该文件。忽略任何以前的 '--force' ('-f') 选项。相当于“--interactive=always”。

作为一般提示:info通常比 更详细man,它本身通常比--help选项更详细。


von*_*and 7

标志没有“优先级”,每个程序都按照它希望的方式处理它们。大多数人会努力收集所有标志并检查冲突,对于标准工具(如引用的rm(1)),相关标准可能会强制要求某些东西(但话说回来,您的特定版本在解释标准的极端情况时可能很草率/没有得到专门测试为他们)。

对于编写程序的程序员来说,最容易以严格的从左到右的顺序考虑参数(标志和其他),并且可能会在遇到障碍时跳出。如果使用库来处理标志(例如getopt(3),有几个版本浮动),程序员可能会做最简单/自然的事情。程序员也是人,人是懒惰的(或者至少不喜欢通过组合爆炸来思考)。