Sí, solo ejecute patchcon la --dry-runopció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 -Ropció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 patchcompletamente redirigiendo su stdout y stderr a /dev/null)
Esto no funciona para mi. Cuando ejecuto ese comando, si el parche no se ha aplicado, me pregunta si 'deshace' el parche en modo interactivo y, si uso el modo por lotes, ignorará la operación inversa y aplicará el parche, devolviendo 0.
synack
1
Oye, intenta agregar -sfa patch(se puede escribir como patch -Rsfp0 --dry-run)
poige
1
@synack, ¿te fue bien?
Poige
16
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
La comprobación debe estar en contra en 1lugar de 0:if [ $? -eq 1 ]
Crisson
2
No, 0 es correcto. El parche saldría con un valor distinto de cero si la ejecución en seco fallara por alguna razón, en cuyo caso el parche no debería aplicarse.
Fls'Zen
Mi guión fue correcto en bash. bash considera que un código de salida de 0 es truepara fines de if. Precisamente porque la mayoría de los comandos usan un código de salida de 0 para indicar el éxito.
Omnifarioso
2
Aquí hay una suposición, suponiendo que está utilizando la patchutilidad 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
O, si parcheó los archivos antes y desea saber si tocó algún archivo específico, puede ejecutar la primera ronda de parches con la -Bopción, lo que provocaría que se hiciera una copia de seguridad. Luego verifica la existencia de la copia de seguridad.
Peter
8
¿Podría ampliar un poco sobre por qué eligió usar nohupen ese ifcaso?
zrajm
@zrajm - No recuerdo por qué hice eso. Y cuando noté (debido a una solicitud de aprobación de edición) que estaba allí, fue hace tanto tiempo que no hay posibilidad de que recupere el motivo. Me parece bastante inútil mirarlo ahora.
Omnifarioso
0
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 --forwardargumento y se saltará el parche si ya está aplicado!
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:(Aún más, en el fragmento de arriba puede que incluso prefieras silenciar
patch
completamente redirigiendo su stdout y stderr a/dev/null
)fuente
-sf
apatch
(se puede escribir comopatch -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:
fuente
1
lugar de0
: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:fuente
-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 eseif
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!fuente
Esto me funcionó.
fuente