我知道这会在没有提示的情况下rm -f file1
强制删除。file1
我也知道rm -i file1
在删除之前会先提示我file1
现在如果你执行rm -if file1
,这也会强制删除file1
而不提示我。
但是,如果您执行rm -fi file1
,它会在删除之前提示我file1
。
那么组合命令选项时,最后一个选项优先吗? like rm -if
, then-f
将优先,但 rm -fi
then-i
将优先。
例如命令,如果你说orls
并不重要。ls -latR
ls -Rtal
所以我想只有当你有矛盾的命令选项时才重要,比如rm -if
,这是正确的吗?
答案1
当与和选项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.
以及 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.
让我们看看幕后发生了什么:
rm
getopt(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)
,有多个版本),程序员可能会做最简单/自然的事情。程序员也是人,人都是懒惰的(或者至少不喜欢思考组合爆炸)。