Successivo: , Precedente: , Su: Esempi di estensione   [Contenuti][Indice]


17.7.4 Consentire la modifica in loco dei file

L’estensione inplace svolge un lavoro simile a quello dell’opzione -i nel programma di utilità GNU sed, che svolge delle funzioni di modifica “al volo” su ogni file in input. Viene usato il file inplace.awk, caricato dinamicamente, per richiamare l’estensione in maniera corretta:

# inplace --- carica e richiama l'estensione inplace.

@load "inplace"

# È buona cosa impostare inplace::suffix in modo da fare
# una copia di backup.
# Per esempio, si potrebbe impostare inplace::suffix a .bak
# sulla riga di comando, o in una regola BEGIN.

# Prima che fossero introdotti gli spazi di nomi in gawk, quest'estensione
# usava INPLACE_SUFFIX come variabile per fare delle copie di backup.
# Questo è ancora possibile, in modo che ogni codice che usava la
# precedente versione di questo script possa continuare a funzionare.

# Per default, ogni file specificato sulla riga di comando
# verrà modificato sovrascrivendo il file originale.
# Ma è possibile evitarlo specificando l'argomento inplace::enable=0
# davanti al nome del file che non si desidera elaborare in questo modo.
# Si può poi abilitare di nuovo l'aggiornamento diretto del file
# sulla riga di comando, specificando inplace::enable=1 prima dei file
# che si vogliono modificare direttamente.

# N.B. La funzione inplace::end() è invocata nelle regole
# BEGINFILE ed END, in modo che ogni eventuale azione
# in una regola ENDFILE sarà ridiretta come previsto.

@namespace "inplace"

BEGIN {
    enable = 1         # abilitato per default
}

BEGINFILE {
    sfx = (suffix ? suffix : awk::INPLACE_SUFFIX)
    if (filename != "")
        end(filename, sfx)
    if (enable)
        begin(filename = FILENAME, sfx)
    else
        filename = ""
}


END {
    if (filename != "")
        end(filename, (suffix ? suffix : awk::INPLACE_SUFFIX))
}

Per ogni file elaborato, l’estensione ridirige lo standard output verso un file temporaneo definito in modo da avere lo stesso proprietario e le stesse autorizzazioni del file originale. Dopo che il file è stato elaborato, l’estensione riporta lo standard output alla sua destinazione originale. Se INPLACE_SUFFIX non è una stringa vuota, il file originale è collegato a un nome-file di backup, creato aggiungendo il suffisso al nome originale. Infine, il file temporaneo è rinominato in modo da essere lo stesso del nome-file originario.

Si noti che l’uso di questa funzionalità può essere controllato specificando ‘inplace=0’ sulla riga di comando, prima del nome del file che non dovrebbe essere elaborato come appena descritto. Si può richiedere ancora l’aggiornamento diretto di un file, specificando l’argomento ‘inplace=1’ davanti al nome del file da elaborare in maniera diretta.

La variabile _inplace_filename serve per tener traccia del nome del file corrente, in modo da non eseguire la funzione inplace_end() prima di aver elaborato il primo file.

Se si verifica un errore, l’estensione emette un messaggio di errore fatale per terminare l’elaborazione immediatamente, senza danneggiare il file originale.

Ecco alcuni semplici esempi:

$ gawk -i inplace '{ gsub(/pippo/, "pluto") }; { print }' file1 file2 file3

Per mantenere una copia di backup del file originale, si provi a fare così:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/pippo/, "pluto") }
> { print }' file1 file2 file3

Si noti che, anche se l’estensione tenta di mantenere il proprietario e i permessi di accesso del file originario, non viene tentata la copia degli ulteriori permessi di accesso (ACL - Access Control Lists) del file originale.

Se il programma termina prima del previsto, come potrebbe succedere se riceve dal sistema un segnale non gestito, può lasciare come residuo un file temporaneo.


Successivo: , Precedente: , Su: Esempi di estensione   [Contenuti][Indice]