È possibile sapere se un file è già stato patchato, prima di applicare la patch?
Devo farlo in una sceneggiatura, qualche pensiero?
È possibile sapere se un file è già stato patchato, prima di applicare la patch?
Devo farlo in una sceneggiatura, qualche pensiero?
Risposte:
Sì, basta eseguire patch
con l' --dry-run
opzione, o fallirebbe o avrebbe successo, che può essere scoperto con il suo stato di uscita.
Ma in un modo più comune (e soggetto a errori) , probabilmente devi eseguirlo con l' -R
opzione che significa "reverse" poiché solo se fosse in grado di ripristinare l'intera patch, potrebbe essere considerato "applicato". Altrimenti (senza '-R') potrebbe non riuscire a causa della modifica di alcune parti del file originale. Di seguito è riportato un semplice esempio:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Inoltre, nello snippet sopra potresti persino preferire il silenzio patch
reindirizzando completamente il suo stdout e lo stderr a /dev/null
)
-sf
a patch
(può essere scritto come patch -Rsfp0 --dry-run
)
Nel caso in cui aiuti qualcuno, se si utilizza lo script bash, l'esempio fornito da Omnifarious non funzionerebbe. In bash lo stato di uscita di un comando riuscito è 0
Quindi il seguente funzionerebbe:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
1
invece di 0
:if [ $? -eq 1 ]
true
fini di if. Proprio perché la maggior parte dei comandi utilizza un codice di uscita 0 per indicare il successo.
Ecco una supposizione, supponendo che tu stia utilizzando l' patch
utilità e ogni file da patchare ha la sua patch:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
-B
opzione, che causerebbe il backup. Quindi si controlla l'esistenza del backup.
nohup
in quel if
caso?
Nel mio caso volevo fare quel controllo in modo che l'esecuzione del comando patch non finisse con un terminale interattivo che chiedeva cosa fare (specialmente per CI).
Si scopre che se hai solo bisogno che puoi anche usare l' --forward
argomento e salterà la patch se già applicato!