Lors de l'utilisation rm
avec les deux options -i
et -f
, la première sera ignorée. Ceci est documenté dans la norme 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.
et aussi dans la info
page 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.
Voyons ce qui se passe sous le capot:
rm
traite son option avec getopt(3)
, spécifiquement getopt_long
. Cette fonction traitera les arguments d'option dans la ligne de commande ( **argv
) par ordre d'apparition:
Si getopt () est appelée à plusieurs reprises, elle renvoie successivement chacun des caractères d'option de chacun des éléments d'option.
Cette fonction est généralement appelée en boucle jusqu'à ce que toutes les options soient traitées. Dans cette perspective de fonctions, les options sont traitées dans l'ordre. Ce qui se passe en réalité, cependant, dépend de l'application, car la logique d'application peut choisir de détecter les options en conflit, de les remplacer ou de présenter une erreur. Pour le cas de rm
et les options i
et f
, ils se superposent parfaitement. 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;
Les deux options définissent les mêmes variables, et l'état de ces variables sera la dernière option dans la ligne de commande. L'effet est conforme au standard POSIX et à la rm
documentation.