[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

58. Differenze tra i file

Spesso esiste la necessità di confrontare il contenuto di file differenti per verificare se esistono delle differenze, e soprattutto per conoscere quali sono, quando queste non sono troppe. Se le differenze tra i due file sono in numero ragionevolmente contenuto, si può generarne un rapporto, in modo da poter ottenere uno dei due file a partire dall'altro, assieme a tale elenco di variazioni.

Questo rapporto sulle differenze viene definito prevalentemente patch, e queste differenze si applicano a un file, o a una serie di file, per ottenere altrettanti file aggiornati.

Esistono tanti modi di costruire un file di differenze. Si distinguono in particolare due situazioni: i file di testo e gli altri. Si può comprendere che in un file di testo, tipicamente un sorgente di un programma, i cambiamenti avvengano a livello di righe, nel senso che se ne possono aggiungere, togliere e modificare. In un file binario invece, non avendo il riferimento delle righe, il problema è più complesso. La gestione delle differenze tra i file riguarda prevalentemente i file di testo normale, ed è di questo che si vuole trattare in questo capitolo.

58.1 Creazione di un file di differenze: diff

Il programma più importante per analizzare le differenze tra due file di testo è diff. Può funzionare con diverse modalità, per determinare semplicemente se una coppia di file è identica o meno, oppure per indicare le differenze che ci sono tra i due, con maggiore o minore dettaglio di informazioni al riguardo. La sintassi sintetica di questo programma è molto semplice.

diff [<opzioni>] <file1> <file2>

Il risultato del confronto dei file viene emesso attraverso lo standard output.

58.1.1 Regolazione della sensibilità di diff

Quando si confrontano file di testo, può darsi che alcuni tipi di differenze non siano da considerare, come per esempio l'aggiunta di spazi alla fine di una riga, o l'inserzione di righe vuote addizionali. Inoltre, si può desiderare si conoscere semplicemente se esiste una qualche differenza, senza entrare troppo nel dettaglio. Questa sensibilità alle differenze viene definita attraverso l'uso di opzioni apposite. Le più importanti sono elencate di seguito.

Rapporto sommario

-q | --brief

Attraverso questa opzione si richiede a diff di informare semplicemente sull'esistenza di differenze tra due file, senza l'indicazione esplicita di queste.

Maiuscole e minuscole

-i | --ignore-case

Attraverso questa opzione si può richiedere a diff di ignorare la differenza tra maiuscole e minuscole. Con questa opzione, le due righe seguenti sono considerate equivalenti.

Chi va piano,

chi va PIANO,

Spaziatura orizzontale e verticale

-b | --ignore-space-change

Questa opzione permette di fare ignorare a diff le differenze dovute a una diversa spaziatura orizzontale del testo. Questo riguarda quindi, sia il carattere spazio, <SP>, sia il carattere di tabulazione, <HT>. Con questa opzione, le due righe seguenti sono considerate equivalenti.

va sano e va lontano

va sano  e   va lontano

---------

-w | --ignore-all-space

Questa opzione permette di fare ignorare completamente a diff la presenza degli spazi. Per esempio, con questa opzione, le due righe seguenti sono equivalenti.

vasano e va lon   tano

va sano  e  va lontano

---------

-B | --ignore-blank-lines

Questa opzione permette di fare ignorare a diff le differenze dovute alla presenza o assenza di righe vuote. Deve trattarsi però di righe completamente vuote, cioè composte esclusivamente dal codice di interruzione di riga.

58.1.2 Confronto binario o testuale

Prima di iniziare un confronto tra due file, diff verifica che si tratti di file di testo in base al contenuto di alcune righe iniziali. Se diff incontra il carattere <NUL>, a meno che siano state usate opzioni particolari in senso contrario, assume che si tratti di un file binario e verifica semplicemente se i file sono identici.

Confronto binario

--binary

Il confronto binario può essere imposto attraverso questa opzione, e ciò che si ottiene è solo la verifica sull'identicità dei file. Se la prima parte di uno dei file da confrontare contiene il carattere <NUL>, diff assume implicitamente che debba essere eseguito un confronto binario.

Confronto testuale

-a | --text

Il confronto testuale, cioè quello normale, può essere imposto con questa opzione anche in presenza di caratteri <NUL> iniziali, per esempio quando si vogliono confrontare file generati da programmi per l'elaborazione testi che sfruttano quel carattere per scopi particolari.

58.1.3 Differenze senza contesto

Il funzionamento normale di diff prevede l'emissione attraverso lo standard output dell'indicazione delle sole differenze tra i file, secondo il formato seguente:

<comando>
< <riga-primo-file>
< <riga-primo-file>
< ...
---
> <riga-secondo-file>
> <riga-secondo-file>
> ...

In questo tipo di notazione, è il comando a stabilire l'operazione da compiere. Il comando si compone di tre parti: il numero di una riga, o di un intervallo di righe del primo file; una lettera che definisce l'operazione da compiere; il numero di una riga, o di un intervallo di righe del secondo file.

<righe-file1><azione><righe-file2>

Si distinguono le tre azioni seguenti.

Quando si vogliono distribuire file di differenze (o di patch se si preferisce il termine) per consentire ad altri di ottenere degli aggiornamenti da un file di partenza, è sconsigliabile l'utilizzo di questo formato, benché si tratti di quello predefinito per diff, secondo lo standard POSIX.

Esempi

Per verificare in pratica il funzionamento di diff in modo da ottenere l'indicazione delle differenze tra due file senza informazioni sul contesto, viene proposto il confronto tra i due file seguenti.

Chi va piano,
va sano
e va lontano

---------

chi va piano,
va     sano
e va lontano

I nomi dei due file siano rispettivamente: primo e secondo.

diff primo secondo[Invio]

1,2c1,2
< Chi va piano,
< va sano
---
> chi va piano,
> va     sano

In pratica, le prime due righe del primo file vanno sostituite con le prime due del secondo, mentre la terza riga è la stessa in entrambi i file.

diff -i primo secondo[Invio]

2c2
< va sano
---
> va     sano

In questo caso, utilizzando l'opzione -i, si vogliono ignorare le differenze tra lettere maiuscole e minuscole, pertanto risulta diversa solo la seconda riga.

diff -b primo secondo[Invio]

1c1
< Chi va piano,
---
> chi va piano,

In questo caso, utilizzando l'opzione -b si vogliono ignorare le differenze dovute a un uso differente delle spaziature tra le parole, pertanto risulta diversa solo la prima riga.

58.1.4 Formato contestuale standard

Il funzionamento normale di diff prevede l'emissione attraverso lo standard output dell'indicazione delle sole differenze tra i file, ma ciò è generalmente poco adatto alla distribuzione di file di differenze. Per questo è preferibile utilizzare un formato che, assieme alle modifiche, inserisca anche alcune righe di riferimento aggiuntive. In questo modo, il programma che deve applicare le modifiche, può agire anche se il contenuto del file sul quale vengono applicate ha subito piccoli spostamenti. Si ottiene un formato contestuale standard quando si utilizza l'opzione seguente:

-c | -C <righe> | --context[=<righe>]

Se viene indicato il numero di righe, si intende che venga utilizzato almeno quel numero di righe di riferimento contestuale. Se questo valore non viene indicato, si intende che siano tre. Il minimo perché il programma patch possa eseguire il suo compito è di due righe contestuali.

Il risultato di una comparazione contestuale standard è preceduto da due righe di intestazione contenenti l'indicazione dei due file.

*** <file1> <data-di-modifica-del-primo-file>
--- <file2> <data-di-modifica-del-secondo-file>

Successivamente appaiono i blocchi delle differenze, strutturati nel modo seguente:

***************
*** <righe-primo-file> ****
  <riga-primo-file>
  <riga-primo-file>
  ...
--- <righe-corrispondenti-secondo-file> ----
  <riga-secondo-file>
  <riga-secondo-file>
  ...

Si deve osservare che le righe vengono indicate a partire dalla terza colonna, lasciando cioè due spazi dall'inizio. La prima colonna viene utilizzata per indicare il ruolo particolare di quella riga:

Esempi

Per verificare in pratica il funzionamento di diff in modo da utilizzare il formato contestuale standard, viene proposto il confronto tra i due file seguenti.

Chi va piano,
va sano
e va lontano

---------

Chi va forte,
va alla morte;

chi va piano,
va     sano
e va lontano

I nomi dei due file siano rispettivamente: primo e secondo.

diff -c primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
! Chi va piano,
! va sano
  e va lontano
--- 1,6 ----
! Chi va forte,
! va alla morte;
! 
! chi va piano,
! va     sano
  e va lontano

In breve, le prime tre righe del primo file vanno sostituite con le prime sei del secondo, e l'unica riga in comune è l'ultima.

diff -c -i primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
  Chi va piano,
! va sano
  e va lontano
--- 1,6 ----
+ Chi va forte,
+ va alla morte;
+ 
  chi va piano,
! va     sano
  e va lontano

In questo caso, vanno aggiunte le prime tre righe del secondo file, quindi si incontra una riga uguale, dal momento che non contano le differenze tra lettere maiuscole e minuscole, infine viene sostituita una riga a causa della differente spaziatura orizzontale.

diff -b -i -c primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
--- 1,6 ----
+ Chi va forte,
+ va alla morte;
+ 
  chi va piano,
  va     sano
  e va lontano

In questo caso, avendo indicato che non contano le differenze dovute alla diversa spaziatura orizzontale e all'uso delle maiuscole, le ultime tre righe del secondo file corrispondono esattamente al primo file. In questo modo, queste non sono state indicate nella parte che riguarda il primo file.

58.1.5 Formato contestuale unificato

A fianco del formato contestuale standard, si pone un altro tipo di indicazione delle modifiche, definito «unificato», che ha il vantaggio di essere più compatto, e lo svantaggio di essere disponibile solo negli strumenti GNU. Per selezionare questo tipo di risultato si utilizza una delle opzioni seguenti.

-u | -U <righe> | --unified[=<righe>]

Se viene indicato il numero di righe, si intende che venga utilizzato almeno quel numero di righe di riferimento contestuale. Se questo valore non viene indicato, si intende che siano tre. Il minimo perché il programma patch possa eseguire il suo compito è di due righe contestuali.

Il risultato di una comparazione contestuale unificata è preceduto da due righe di intestazione contenenti l'indicazione dei due file.

--- <file1> <data-di-modifica-del-primo-file>
+++ <file2> <data-di-modifica-del-secondo-file>

Successivamente appaiono i blocchi delle differenze, strutturati nel modo seguente:

@@ -<righe-primo-file> +<righe-secondo-file> @@
 <riga-di-uno-dei-file>
 <riga-di-uno-dei-file>
 ...

In modo simile al caso del formato contestuale standard, le righe sono riportate a partire dalla seconda colonna, lasciando il primo carattere libero per indicare l'operazione da compiere:

Esempi

Per verificare in pratica il funzionamento di diff in modo da utilizzare il formato contestuale unificato, vengono proposti gli stessi esempi già visti nella sezione precedente.

diff -u primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
-Chi va piano,
-va sano
+Chi va forte,
+va alla morte;
+
+chi va piano,
+va     sano
 e va lontano

In breve, le prime tre righe del primo file vanno sostituite con le prime sei del secondo, e l'unica riga in comune è l'ultima.

diff -u -i primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
+Chi va forte,
+va alla morte;
+
 Chi va piano,
-va sano
+va     sano
 e va lontano

In questo caso, vanno aggiunte le prime tre righe del secondo file, quindi si incontra una riga uguale, dal momento che non contano le differenze tra lettere maiuscole e minuscole, infine viene sostituita una riga a causa della differente spaziatura orizzontale.

diff -b -i -c primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
+Chi va forte,
+va alla morte;
+
 Chi va piano,
 va sano
 e va lontano

In questo caso, avendo indicato che non contano le differenze dovute alla diversa spaziatura orizzontale e all'uso delle maiuscole, le ultime tre righe del secondo file corrispondono esattamente al primo file. In questo modo, queste non sono state indicate nella parte che riguarda il primo file.

58.1.6 Confronto dei file di due directory

diff è in grado di generare un unico file di differenze dal confronto di tutti i file di una directory con altrettanti file con lo stesso nome contenuti in un'altra. per questo, è sufficiente indicare il confronto di due directory, invece che di due file.

Se si desidera continuare l'analisi anche nelle sottodirectory successive, si può utilizzare l'opzione seguente:

-r | --recursive

Esempi

diff -u uno due

Si suppone che uno/ e due/ siano due sottodirectory della directory corrente nel momento in cui si esegue diff. Ciò che si ottiene attraverso lo standard output è l'elenco delle modifiche dei vari file incontrati in entrambe le directory. Quello che segue è un estratto delle intestazioni in cui si vede in che modo sono indicati i file, assieme al loro percorso relativo.

...
--- uno/primo	Thu Mar  5 09:48:10 1998
+++ due/primo	Fri Mar  6 08:30:07 1998
...
--- uno/secondo	Wed Mar  4 09:23:52 1998
+++ due/secondo	Fri Mar  6 08:29:59 1998
...

---------

diff -u -r uno due

Questa volta, il comando indicato come esempio utilizza anche l'opzione -r che indica a diff di attraversare anche le sottodirectory che fossero contenute eventualmente.

58.1.7 Come si prepara un file di differenze

Quando si prepara un file di differenze, è opportuno usare un po' di accortezza per facilitare il lavoro di chi poi deve applicare queste modifiche. È il caso di distinguere due situazioni fondamentali: le differenze riferite a un file singolo e quelle relative a un intero ramo di directory.

Per prima cosa occorre decidere il tipo di formato: quello predefinito non è molto comodo perché non contiene le informazioni sui nomi dei file, e quello contestuale unificato dovrebbe essere il migliore. Tuttavia, quando si devono produrre file di differenze da utilizzare con strumenti strettamente POSIX, ci si deve accontentare del formato contestuale standard.

In generale, è importante l'ordine in cui si indicano i file o le directory tra gli argomenti di diff: il primo dei due nomi rappresenta la situazione precedente, mentre il secondo quella nuova, ovvero l'aggiornamento verso cui si vuole andare. La situazione classica è quella in cui si modifica un file, ma prima di intervenire se ne salva una copia con la tipica estensione .orig. Si osservi l'esempio seguente:

diff -u prova.txt.orig prova.txt > prova.diff

Il file prova.txt è stato modificato, ma prima di farlo ne è stata salvata una copia con il nome prova.txt.orig. Il comando genera un file di differenze tra prova.txt.orig e prova.txt.

Per realizzare un file di differenze di un ramo intero di directory, si interviene in modo simile: si fa una copia del ramo, si modifica quello che si vuole nei file del ramo che si intende debba contenere gli aggiornamenti, e quindi si utilizza diff:

diff -u -r prova.orig prova > prova.diff

In questo caso, si intende fare riferimento al confronto tra le directory prova.orig/ e prova/. Il file di differenze che si ottiene è unico per tutti i file che risultano modificati effettivamente.

58.2 Applicazione delle modifiche: patch

Il programma più adatto per applicare delle modifiche è patch, il quale di solito è in grado di determinare automaticamente il tipo di formato utilizzato, e di saltare eventuali righe iniziali o finali aggiuntive. In pratica, con patch è possibile utilizzare file trasmessi come allegato nei messaggi di posta elettronica, senza doverli estrapolare.

patch [<opzioni>] < <file-di-differenze>

patch utilizza generalmente lo standard input per ricevere i file di modifiche. Questi devono contenere l'indicazione del file da modificare, e per questo si possono utilizzare soltanto file di differenze in formato contestuale (compreso quello unificato).

In linea di massima, patch sovrascrive i file a cui si vogliono applicare delle modifiche, a meno che venga specificata un'opzione con la quale si richiede l'accantonamento di una copia della versione precedente. In questo caso, il file originale viene rinominato (in condizioni normali gli viene aggiunta l'estensione .orig) e gli aggiornamenti vengono applicati a questo file ottenendone un altro con lo stesso nome di quello originale. patch cerca di applicare le modifiche anche quando il file di partenza non risulta perfettamente corrispondente a quanto indicato nel file di differenze. Se qualche blocco di modifiche non può essere applicato, questi vengono indicati in un file terminante con l'estensione .rej.

La tabella 58.1 riepiloga brevemente le opzioni più comuni del programma patch GNU.

Opzione Descrizione
-d <directory> Modifica la directory di lavoro prima di iniziare.
-pn Eliminazione di n barre oblique iniziali da un percorso.
-o <file-aggiornato> Indica precisamente il file da ottenere applicando le modifiche.
-b Mantiene una copia della versione precedente.
-l Tratta come equivalenti le sequenze di spazi orizzontali.
-r <file-rigetti> Indica precisamente il file che deve contenere gli errori.
-R Applica le modifiche in modo inverso.
-N Ignora le modifiche che sembrano essere già state applicate.

Tabella 58.1: Opzioni comuni di patch. Tutte tranne -b sono conformi allo standard POSIX.

58.2.1 Definizione dei file da modificare e del file di differenze

In condizioni normali, precisamente quando si dispone di file di differenze in formato contestuale (standard o unificato), non è necessario fornire a patch il nome del file su cui intervenire per applicare le modifiche, perché questo è indicato all'interno del file che le contiene. Tuttavia, il formato predefinito lo impone, e in ogni caso può essere utile indicare precisamente a patch il nome del file su cui intervenire.

patch [<opzioni>] <file-originale> [<file-di-differenze>]

Lo schema mostra semplicemente che è sufficiente accodare dopo le opzioni il nome del file originale al quale si vogliono applicare le modifiche. Queste possono essere contenute in un file indicato come argomento successivo, oppure fornito attraverso lo standard input, come si fa di solito. In alternativa, il file di differenze può anche essere indicato in modo esplicito attraverso l'opzione -i (ovvero --input).

Esempi

patch prova prova.diff

Applica al file prova le modifiche contenute nel file prova.diff. Il file prova viene sovrascritto.

patch prova < prova.diff

Esattamente come nell'esempio precedente.

patch -i prova.diff prova

Esattamente come nell'esempio precedente.

patch --input=prova.diff prova

Esattamente come nell'esempio precedente.

58.2.2 Definizione esplicita del formato del file di differenze

In alcune circostanze, può essere utile, o necessario, definire esplicitamente di quale tipo sia il formato del file di differenze. A questo proposito si utilizzano alcune opzioni:

58.2.3 Differenze multiple e directory

Un file di differenze che contiene informazioni su più coppie di file, deve essere di tipo contestuale (standard o unificato). Quando è stato generato facendo riferimento al contenuto di una directory, i nomi dei file presi in considerazione contengono l'indicazione di un percorso, e per riprodurre le modifiche in ambito locale, occorre tenere conto della posizione in cui cominciano a trovarsi i dati.

Inoltre, la directory corrente, nel momento in cui si avvia il programma patch, è importante per determinare quali siano i file a cui si devono applicare le modifiche.

Opzioni

-d <directory-di-riferimento> | --directory=<directory-di-riferimento>

Questa opzione permette di definire la directory di lavoro per patch.

-pn | --strip=n

In questo modo è possibile «togliere» un numero stabilito di barre oblique di separazione all'interno dei percorsi indicati per i file a cui applicare le modifiche. Questa opzione è praticamente obbligatoria in presenza di file di differenze in cui le informazioni sui file contengono un percorso. In generale, quando queste vengono applicate in un contesto equivalente a quello nel quale sono state generate, si utilizza l'opzione -p0, che indica il mantenimento della situazione attuale.

Esempi

patch -d ~/prove < prova.diff

Prima di applicare le modifiche contenute nel file di differenze prova.diff, si sposta nella directory ~/prove/.

patch -p0 < prova.diff

Applica le modifiche contenute nel file prova.diff che presumibilmente contiene informazioni sui percorsi. L'opzione -p0 garantisce che a partire dalla directory corrente si articolano gli stessi percorsi che appaiono nel file di differenze.

patch -p1 < prova.diff

Applica le modifiche contenute nel file prova.diff che presumibilmente contiene informazioni sui percorsi. L'opzione -p1 richiede l'eliminazione della prima barra obliqua nei percorsi, e questo, presumibilmente, per eliminare il primo livello di directory. Se all'interno del file di differenze si fa riferimento al file x/y/z/prova, significa che le modifiche relative vanno applicate localmente al file y/z/prova.

Nel caso in cui all'interno del file di differenze si facesse riferimento al file ./x/y/z/prova, eliminando la prima barra obliqua di questo percorso, non si otterrebbe alcun cambiamento, dal momento che ciò produrrebbe il percorso x/y/z/prova che è equivalente al primo. Questo significa che prima di decidere quante barre oblique togliere da un percorso, occorre osservare il contenuto del file di differenze.

In modo analogo, nel caso in cui all'interno del file di differenze si facesse riferimento al file /x/y/z/prova, che come si vede è indicato con un percorso assoluto a partire dalla radice, eliminando la prima barra obliqua si ottiene un percorso relativo: x/y/z/prova.

58.2.4 Conservazione delle versioni precedenti

In condizioni normali, patch sovrascrive i file a cui si applicano le modifiche. Per evitarlo è possibile definire precisamente il nome del file da generare, oppure si può gestire il sistema di mantenimento delle versioni precedenti, utilizzando in particolare l'opzione -b.

Opzioni

-o <file-aggiornato> | --output=<file-aggiornato>

Invece di modificare il file originale, ne crea uno nuovo, utilizzato il nome indicato come argomento dell'opzione.

-b | --backup

Attiva la conservazione della versioni precedenti. In condizioni normali, con questa opzione si ottiene di salvare i file, prima del loro aggiornamento, utilizzando l'estensione aggiuntiva .orig.

-z <suffisso-di-backup> | --suffix=<suffisso-di-backup>

Permette di definire il suffisso (ovvero l'estensione) da utilizzare per le eventuali copie di sicurezza delle versioni precedenti. Se non viene specificato con questa opzione, si utilizza il simbolo contenuto nella variabile di ambiente SIMPLE_BACKUP_SUFFIX. Se anche questa variabile non è stata predisposta, si utilizza l'estensione .orig.

-V <tipo-di-backup> | --version-control=<tipo-di-backup>

Permette di definire esplicitamente il modo con cui gestire le copie di sicurezza delle versioni precedenti, quando si usa anche l'opzione -b. Per la precisione cambia il tipo di estensione che viene aggiunto ai file:

Se questa opzione non viene indicata, si prende in considerazione il valore della variabile di ambiente PATCH_VERSION_CONTROL, o in mancanza di questa, il valore della variabile VERSION_CONTROL.

Variabili

PATCH_VERSION_CONTROL

Permette di definire la modalità di gestione delle copie di sicurezza delle versioni precedenti in modo predefinito. I valori attribuibili a questa variabile sono gli stessi utilizzati come argomento dell'opzione -V.

VERSION_CONTROL

Questa variabile ha lo stesso significato di PATCH_VERSION_CONTROL, ma viene presa in considerazione solo in mancanza di questa.

SIMPLE_BACKUP_SUFFIX

Definisce il simbolo da utilizzare come suffisso per i nomi dei file che rappresentano le copie di sicurezza.

Esempi

patch -o aggiornato < prova.diff

Applica le modifiche contenute nel file di differenze prova.diff generando il file aggiornato, senza toccare i file originali.

patch -b < prova.diff

Applica le modifiche contenute nel file di differenze prova.diff, avendo cura di fare una copia di sicurezza dei file che aggiorna, prima di modificarli.

patch -b -z .vecchio < prova.diff

Applica le modifiche contenute nel file di differenze prova.diff, avendo cura di fare una copia di sicurezza dei file che aggiorna utilizzando per questo l'estensione .vecchio, prima di modificarli.

patch -b -V numbered < prova.diff

Applica le modifiche contenute nel file di differenze prova.diff, avendo cura di fare una copia di sicurezza dei file che aggiorna utilizzando per questo un'estensione contenente un numero progressivo, prima di modificarli. La prima di queste copie di sicurezza avrà l'estensione .~1~, la seconda .~2~, e via di seguito.

58.2.5 Applicazione di modifiche imperfette

patch è generalmente in grado di applicare delle modifiche anche a file che non sono perfettamente identici a quelli con cui sono stati costruiti i file di differenze. Tuttavia, ci sono situazioni in cui patch, da solo, non è in grado di poter prendere una decisione autonoma.

Può capitare che i file di modifiche vengano rimaneggiati involontariamente, per esempio a causa di una trasmissione in un messaggio di posta elettronica o per una modifica attraverso un programma per la modifica di file di testo. In questi casi potrebbero essere alterate le spaziature orizzontali attraverso una sostituzione dei caratteri di tabulazione con caratteri spazio, e viceversa. Un problema del genere può essere risolto utilizzando l'opzione -l.

-l | --ignore-white-space

In questo modo, una sequenza di spazi qualunque, equivale a un'altra sequenza di spazi, indipendentemente dal fatto che siano stati usati caratteri di tabulazione, o caratteri spazio veri e propri, e indipendentemente dalla loro quantità.

58.2.6 Altre anomalie

Quando patch incontra dei problemi che non è in grado di risolvere da solo, richiede un intervento, ponendo delle domande all'utente. Se ciò accade, si può decidere di guidare patch nell'applicazione delle modifiche o di interrompere il procedimento.

Tutte le modifiche rigettate, vengono salvate in file terminanti con l'estensione .rej, a meno che sia stabilito diversamente con l'opzione -r.

-r <file-degli-errori> | --reject-file=<file-degli-errori>

Con questa opzione, in pratica, si stabilisce direttamente il nome del file che deve contenere le informazioni sulle modifiche che non sono state applicate per qualunque motivo.

58.2.7 Differenze invertite

Alla fine delle sezioni dedicate alla creazione di un file di differenze è stato chiarito che l'ordine in cui vanno indicati i file o le directory da confrontare, deve essere tale da avere prima l'oggetto che rappresenta la versione precedente, e dopo quello che rappresenta l'oggetto aggiornato.

Alle volte si hanno per le mani file di differenze ottenuti in modo inverso rispetto alle intenzioni reali, e per questo occorre richiedere a patch di adeguarvisi, se possibile.

Opzioni

-R | --reverse

Richiede a patch di intendere il file di differenze in modo inverso rispetto a quello che sembrerebbe.

-N | --forward

Richiede esplicitamente di ignorare le modifiche che sembrano essere state invertite, oppure che sembrano essere già state applicate.

58.3 Riferimenti

La documentazione info riguardo alla creazione, distribuzione e applicazione di modifiche, è molto dettagliata: info diff. Per il funzionamento di patch in particolare, conviene consultare patch(1).

---------------------------

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]