Quando si utilizza rm
con entrambe -i
e le -f
opzioni, la prima verrà ignorata. Questo è documentato nello standard 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 anche nella info
pagina 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.
Vediamo cosa succede sotto il cofano:
rm
elabora la sua opzione con getopt(3)
, in particolare getopt_long
. Questa funzione elaborerà gli argomenti delle opzioni nella riga di comando ( **argv
) in ordine di apparizione:
Se getopt () viene chiamato ripetutamente, restituisce in successione ciascuno dei caratteri di opzione da ciascuno degli elementi di opzione.
Questa funzione viene in genere chiamata in un ciclo fino a quando non vengono elaborate tutte le opzioni. Da questo punto di vista delle funzioni, le opzioni vengono elaborate in ordine. Ciò che effettivamente accade, tuttavia, dipende dall'applicazione, poiché la logica dell'applicazione può scegliere di rilevare opzioni in conflitto, sovrascriverle o presentare un errore. Nel caso di rm
e le opzioni i
e f
, si sovrascrivono perfettamente a vicenda. Da 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;
Entrambe le opzioni impostano le stesse variabili e lo stato di queste variabili sarà qualsiasi opzione sia l'ultima nella riga di comando. L'effetto di questo è in linea con lo standard POSIX e la rm
documentazione.