При использовании 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.
а также на info
странице GNU :
‘-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
документации.