Ao usar rm
com as opções -i
e -f
, o primeiro será ignorado. Isto 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 no GNU info
page:
‘-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 irá processar os argumentos da opção na linha de comando ( **argv
) em ordem de aparição:
If getopt() is called repeatedly, it returns successively each of the option characters from each of the option elements.
Essa função é normalmente chamada em um 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 i
e f
options, eles sobrescrevem-se 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;
Ambas as opções definem as mesmas variáveis, e o estado dessas variáveis será a última opção na linha de comando. O efeito disso está em linha com o padrão POSIX e a documentação rm
.