È 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 patchcon l' --dry-runopzione, 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' -Ropzione 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 patchreindirizzando completamente il suo stdout e lo stderr a /dev/null)
-sfa 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
1invece di 0:if [ $? -eq 1 ]
truefini 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' patchutilità 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
-Bopzione, che causerebbe il backup. Quindi si controlla l'esistenza del backup.
nohupin quel ifcaso?
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' --forwardargomento e salterà la patch se già applicato!