При використанні 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
документації.