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.
让我们看看幕后情况:
rm
getopt(3)
专门处理的选项getopt_long
。此函数将按**argv
出现顺序处理命令行()中的选项参数:
如果重复调用getopt(),它将依次从每个选项元素中返回每个选项字符。
通常在循环中调用此函数,直到处理完所有选项为止。从这个功能的角度来看,选项是按顺序处理的。 但是,实际发生的情况取决于应用程序,因为应用程序逻辑可以选择检测冲突的选项,覆盖它们或显示错误。 对于rm
和i
和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
文档一致。