Cuando se usa rm
con ambos -i
y -f
opciones, se ignorará el primero. Esto está documentado en el estándar 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.
y también en la info
página de 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.
Veamos qué pasa debajo del capó:
rm
procesa su opción con getopt(3)
, específicamente getopt_long
. Esta función procesará los argumentos de la opción en la línea de comando ( **argv
) en orden de aparición:
Si se llama getopt () repetidamente, devuelve sucesivamente cada uno de los caracteres de opción de cada uno de los elementos de opción.
Esta función generalmente se llama en un bucle hasta que se procesen todas las opciones. Desde esta perspectiva de funciones, las opciones se procesan en orden. Sin embargo, lo que sucede realmente depende de la aplicación, ya que la lógica de la aplicación puede elegir detectar opciones en conflicto, anularlas o presentar un error. Para el caso de rm
y las opciones i
y f
, se sobrescriben perfectamente entre sí. 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 opciones establecen las mismas variables, y el estado de estas variables será la última opción en la línea de comando. El efecto de esto está en línea con el estándar POSIX y la rm
documentación.