Est-il possible de savoir si un fichier a déjà été patché, avant d'appliquer le patch?
Je dois le faire dans un script, des pensées?
Est-il possible de savoir si un fichier a déjà été patché, avant d'appliquer le patch?
Je dois le faire dans un script, des pensées?
Réponses:
Oui, exécutez simplement patch
avec --dry-run
option, il échouerait ou réussirait, ce qui peut être découvert avec son état de sortie.
Mais de manière plus courante (et sujette aux erreurs) , vous devez probablement l'exécuter avec l' -R
option qui signifie "inverser" car ce n'est que s'il était en mesure de rétablir la totalité du correctif qu'il pourrait être considéré comme "appliqué". Sinon (sans '-R'), il pourrait échouer simplement parce que certaines parties du fichier d'origine ont été modifiées. Voici un exemple simple:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(De plus, dans l'extrait ci-dessus, vous préférerez peut-être même réduire patch
complètement au silence la redirection de sa stdout et de sa stderr /dev/null
)
-sf
à patch
(peut être écrit comme patch -Rsfp0 --dry-run
)
Juste au cas où cela aiderait quelqu'un, si vous utilisez un script bash, l'exemple donné par Omnifarious ne fonctionnerait pas. Dans bash, le statut de sortie d'une commande réussie est 0
Donc, ce qui suit fonctionnerait:
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
au lieu de 0
:if [ $? -eq 1 ]
true
utilisé pour if. Précisément parce que la plupart des commandes utilisent un code de sortie de 0 pour indiquer le succès.
Voici une supposition, en supposant que vous utilisez l' patch
utilitaire et que chaque fichier à corriger a son propre correctif:
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
option, ce qui entraînerait la sauvegarde. Ensuite, vous vérifiez l'existence de la sauvegarde.
nohup
dans ce if
cas?
Dans mon cas, je voulais faire cette vérification pour que l'exécution de la commande patch ne se termine pas par un terminal interactif demandant quoi faire (en particulier pour CI).
Il s'avère que si vous n'en avez besoin que vous pouvez également utiliser l' --forward
argument et qu'il sautera le patch s'il est déjà appliqué!