命令选项的优先级?

命令选项的优先级?

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

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

现在如果你执行rm -if file1,这也会强制删除file1而不提示我。

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

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

例如命令,如果你说orls并不重要。ls -latRls -Rtal

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

答案1

当与和选项rm一起使用时 ,第一个将被忽略。这记录在-i-fPOSIX标准:

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

以及 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.

让我们看看幕后发生了什么:

rmgetopt(3)专门处理其选项getopt_long。该函数将**argv按照出现的顺序处理命令行 ( ) 中的选项参数:

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

该函数通常在循环中调用,直到处理完所有选项。从这个函数的角度来看,选项是按顺序处理的。 然而,实际发生的情况取决于应用程序,因为应用程序逻辑可以选择检测冲突的选项、覆盖它们或显示错误。rm对于和 thei和选项 的情况f,它们完美地相互覆盖。从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文档。

答案2

是的,因为rm这是有效的。然而,最后一个选项是否覆盖之前的选项取决于各个程序本身。来自“信息室”

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

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

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

答案3

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

对于编写程序的程序员来说,最简单的方法是严格按照从左到右的顺序考虑参数(标志和其他),并且在遇到一些障碍时也许可以摆脱困境。如果使用库来处理标志(例如getopt(3),有多个版本),程序员可能会做最简单/自然的事情。程序员也是人,人都是懒惰的(或者至少不喜欢思考组合爆炸)。

相关内容