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 patchavec --dry-runoption, 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' -Roption 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 patchcomplè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
1au lieu de 0:if [ $? -eq 1 ]
trueutilisé 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' patchutilitaire 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
-Boption, ce qui entraînerait la sauvegarde. Ensuite, vous vérifiez l'existence de la sauvegarde.
nohupdans ce ifcas?
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' --forwardargument et qu'il sautera le patch s'il est déjà appliqué!