W przypadku korzystania rm
z obu opcji -i
i -f
pierwsza z nich zostanie zignorowana. Jest to udokumentowane w standardzie 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.
a także na info
stronie 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.
Zobaczmy, co dzieje się pod maską:
rm
Procesy swojej opcji z getopt(3)
konkretnie getopt_long
. Ta funkcja przetwarza argumenty opcji w wierszu poleceń ( **argv
) w kolejności ich wyświetlania:
Jeżeli funkcja getopt () jest wywoływana wielokrotnie, zwraca kolejno każdy ze znaków opcji z każdego elementu opcji.
Ta funkcja jest zwykle wywoływana w pętli, dopóki wszystkie opcje nie zostaną przetworzone. Z tej perspektywy funkcje są przetwarzane w kolejności. To, co faktycznie się dzieje, zależy jednak od aplikacji, ponieważ logika aplikacji może wykrywać sprzeczne opcje, zastępować je lub wyświetlać błąd. W przypadku rm
i i
oraz f
opcje doskonale się nadpisują. Od 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;
Obie opcje ustawiają te same zmienne, a stan tych zmiennych będzie zależał od tego, która opcja będzie ostatnia w wierszu poleceń. Efekt tego jest zgodny ze standardem POSIX i rm
dokumentacją.