¿Es posible saber si un archivo ya ha sido parcheado antes de aplicar el parche?
Necesito hacer esto en un guión, ¿alguna idea?
¿Es posible saber si un archivo ya ha sido parcheado antes de aplicar el parche?
Necesito hacer esto en un guión, ¿alguna idea?
Respuestas:
Sí, solo ejecute patch
con la --dry-run
opción, ya sea que falle o tenga éxito, lo que se puede descubrir con su estado de salida.
Pero de una manera más común (y propensa a errores) , probablemente tenga que ejecutarlo con la -R
opción que significa "revertir", ya que solo si pudiera revertir todo el parche podría considerarse como "aplicado". De lo contrario (sin '-R'), podría fallar solo debido a que se modificaron algunas partes del archivo original. A continuación se muestra un ejemplo simple:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Aún más, en el fragmento de arriba puede que incluso prefieras silenciar patch
completamente redirigiendo su stdout y stderr a /dev/null
)
-sf
a patch
(se puede escribir como patch -Rsfp0 --dry-run
)
En caso de que ayude a alguien, si está utilizando un script bash, entonces el ejemplo dado por Omnifarious no funcionaría. En bash, el estado de salida de un comando exitoso es 0
Entonces lo siguiente funcionaría:
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
lugar de 0
:if [ $? -eq 1 ]
true
para fines de if. Precisamente porque la mayoría de los comandos usan un código de salida de 0 para indicar el éxito.
Aquí hay una suposición, suponiendo que está utilizando la patch
utilidad y que cada archivo que se va a parchar tiene su propio parche:
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
opción, lo que provocaría que se hiciera una copia de seguridad. Luego verifica la existencia de la copia de seguridad.
nohup
en ese if
caso?
En mi caso, quería hacer esa verificación para que ejecutar el comando parche no terminara con un terminal interactivo preguntando qué hacer (especialmente para CI).
¡Resulta que si solo necesita eso, también puede usar el --forward
argumento y se saltará el parche si ya está aplicado!