Sim, basta executar patchcom a --dry-runopção, ela falharia ou seria bem-sucedida, o que pode ser encontrado com seu status de saída.
Mas, de uma maneira mais comum (e propensa a erros) , você provavelmente precisará executá-lo com a -Ropção que significa "reverter", pois somente se ele pudesse reverter todo o patch, poderia ser considerado como "aplicado". Caso contrário (sem '-R'), poderá falhar devido a algumas partes do arquivo original terem sido alteradas. Abaixo está um exemplo simples:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Além disso, no snippet acima, você pode até preferir silenciar patcho redirecionamento completo de seu stdout e stderr para /dev/null)
Isso não funciona para mim. Quando executo esse comando, se o patch não tiver sido aplicado, ele pergunta se o patch será desassociado no modo interativo e, se eu usar o modo em lote, ele ignorará a operação reversa e aplicará o patch, retornando 0.
synack 19/10/19
11
Ei, tente adicionar -sfa patch(pode ser escrito como patch -Rsfp0 --dry-run) #
poige
11
@synack foi tudo bem?
poige
16
Apenas para o caso de ajudar alguém, se você estiver usando o script bash, o exemplo dado pelo Omnifarious não funcionaria. No bash, o status de saída de um comando bem-sucedido é 0
Portanto, o seguinte funcionaria:
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
A verificação deve ser contra, em 1vez de 0:if [ $? -eq 1 ]
Crisson 20/12/15
2
Não, 0 está correto. O patch sairia com zero se a execução a seco falhar por algum motivo; nesse caso, o patch não deve ser aplicado.
Fls'Zen
Meu script estava correto no bash. O bash considera um código de saída 0 truepara os fins de if. Precisamente porque a maioria dos comandos usa um código de saída 0 para indicar sucesso.
Omnifarious
2
Aqui está um palpite, supondo que você esteja usando o patchutilitário e cada arquivo a ser corrigido tenha seu próprio 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
Ou, se você corrigiu os arquivos antes e deseja saber se tocou em algum arquivo específico, é possível executar a primeira rodada de patches com a -Bopção, o que causaria o backup. Então você verifica a existência do backup.
Peterph
8
Você poderia expandir um pouco o porquê de escolher usar nohupnesse ifcaso?
Zrajm
@ zrajm - Não me lembro por que fiz isso. E quando notei (por causa de uma solicitação de aprovação de edição) que estava lá, faz tanto tempo que não há chance de recuperar o motivo. Parece-me inútil olhar para ele agora.
Omnifarious
0
No meu caso, eu queria fazer essa verificação para que a execução do comando patch não acabasse com um terminal interativo perguntando o que fazer (especialmente para CI).
Acontece que, se você precisar, também poderá usar o --forwardargumento e ele pulará o patch, se já estiver aplicado!
Respostas:
Sim, basta executar
patch
com a--dry-run
opção, ela falharia ou seria bem-sucedida, o que pode ser encontrado com seu status de saída.Mas, de uma maneira mais comum (e propensa a erros) , você provavelmente precisará executá-lo com a
-R
opção que significa "reverter", pois somente se ele pudesse reverter todo o patch, poderia ser considerado como "aplicado". Caso contrário (sem '-R'), poderá falhar devido a algumas partes do arquivo original terem sido alteradas. Abaixo está um exemplo simples:(Além disso, no snippet acima, você pode até preferir silenciar
patch
o redirecionamento completo de seu stdout e stderr para/dev/null
)fonte
-sf
apatch
(pode ser escrito comopatch -Rsfp0 --dry-run
) #Apenas para o caso de ajudar alguém, se você estiver usando o script bash, o exemplo dado pelo Omnifarious não funcionaria. No bash, o status de saída de um comando bem-sucedido é 0
Portanto, o seguinte funcionaria:
fonte
1
vez de0
:if [ $? -eq 1 ]
true
para os fins de if. Precisamente porque a maioria dos comandos usa um código de saída 0 para indicar sucesso.Aqui está um palpite, supondo que você esteja usando o
patch
utilitário e cada arquivo a ser corrigido tenha seu próprio patch:fonte
-B
opção, o que causaria o backup. Então você verifica a existência do backup.nohup
nesseif
caso?No meu caso, eu queria fazer essa verificação para que a execução do comando patch não acabasse com um terminal interativo perguntando o que fazer (especialmente para CI).
Acontece que, se você precisar, também poderá usar o
--forward
argumento e ele pulará o patch, se já estiver aplicado!fonte
Isso funcionou para mim.
fonte