2015-05-10 14 views
6

Sto usando perl riga di comando per eseguire una sostituzione inplace in un file. Questo è il codice: (notare il perm radice con sudo)

sudo perl -i -pe "s/foo/bar/" config.txt 

Se l'esito è positivo, 'echo $?' restituire 0. ora faccio il file non-scrivibile anche per root usando chattr come questo:

sudo chattr +i config.txt 

corro lo stesso comando perl e viene a mancare con questo errore:

Can't remove config.txt: Operation not permitted, skipping file.

Che va bene. Tuttavia, "echo $?" ancora restituisce 0 in questo caso. Perché è così? Non dovrebbe restituire un valore diverso da zero che indica un errore?

risposta

2

Il problema è che Perl non torna con uno stato di uscita diverso da zero per questa condizione (sudo passa allo stato di uscita del comando che è stato fornito), che è un po 'fastidioso. È possibile aggirare il problema, riconoscendo che il ciclo linea di lettura non è mai entrato se il file non riesce a essere rinominato e gestirlo con una bandiera:

sudo perl -i -ne 's/foo/bar/; print; $wrk = 1; }{ $wrk or exit 1' config.txt 

Il saluto Eskimo (o farfalla) "operatore" }{ introduce un blocco END, in un modo; ciò che viene dopo viene eseguito quando le linee di lettura del ciclo del file sono terminate. Il modo in cui funziona è descritto here.

L'avvertenza è che questo segnalerà anche un errore se config.txt è vuoto. A breve se un po 'modo hackier è quello di utilizzare la variabile del contatore $. linea speciale per lo stesso scopo:

sudo perl -i -ne 's/foo/bar/; print; }{ $. or exit 1' config.txt 
+0

Grazie. funziona perfettamente –

Problemi correlati