命令选项的优先级?


21

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

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

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

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

结合命令选项时,最后一个优先吗?像rm -if,那么-f将优先考虑,但RM -fi那么-i将优先考虑。

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

因此,我猜这仅在您具有矛盾的命令选项(例如)时才重要rm -if吗?


Answers:


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.

以及在GNU info页面中:

‘-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.

让我们看看幕后情况:

rmgetopt(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;

这两个选项设置相同的变量,并且这些变量的状态将是命令行中最后一个选项。其效果与POSIX标准和rm文档一致。


3
大多数命令按顺序处理其args,或者在冲突时出错或采用最后的设置(如rm)。我认为命令很少具有选项的第一个设置,而忽略会更改已设置选项的参数。
彼得·科德斯

7

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

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

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

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


7

标志没有“优先级”,每个程序都按其希望的方式处理它们。大多数人都花了点力气来收集所有标志并检查是否有冲突,对于标准工具(如所引用的工具rm(1)),相关标准可能会强制执行某些操作(但同样,您的特定版本可能在解释标准的一些极端情况时草率行事/未经过专门测试)为他们)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.