Ao usar rm
com ambos -i
e -f
opções, o primeiro será ignorado. Isso está documentado no padrão 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.
e também na info
página 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.
Vamos ver o que acontece sob o capô:
rm
processa sua opção com getopt(3)
, especificamente getopt_long
. Esta função processará os argumentos das opções na linha de comando ( **argv
) na ordem em que aparecer:
Se getopt () for chamado repetidamente, ele retornará sucessivamente cada um dos caracteres de opção de cada um dos elementos de opção.
Essa função é normalmente chamada em loop até que todas as opções sejam processadas. Nesta perspectiva de funções, as opções são processadas em ordem. O que realmente acontece, no entanto, depende do aplicativo, pois a lógica do aplicativo pode optar por detectar opções conflitantes, substituí-las ou apresentar um erro. Para o caso de rm
e as opções i
e f
, eles substituem perfeitamente um ao outro. De 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;
As duas opções definem as mesmas variáveis e o estado dessas variáveis será a opção que for a última na linha de comando. O efeito disso está alinhado com o padrão POSIX e a rm
documentação.