Düzeltme ekini uygulamadan önce bir dosyanın önceden yamalanmış olup olmadığını bilmek mümkün müdür?
Bunu bir senaryoda yapmak gerekiyor, herhangi bir düşünce?
Düzeltme ekini uygulamadan önce bir dosyanın önceden yamalanmış olup olmadığını bilmek mümkün müdür?
Bunu bir senaryoda yapmak gerekiyor, herhangi bir düşünce?
Yanıtlar:
Evet, sadece koşmak patch
ile --dry-run
seçeneği, ya başarısız olur ya da çıkış durumu ile tespit edilebilecek başarılı.
Ancak daha yaygın (ve hataya yatkın) bir şekilde , muhtemelen -R
"ters" anlamına gelen bir seçenekle çalıştırmanız gerekir, çünkü yalnızca tüm yamayı geri alabiliyorsa "uygulanmış" olarak kabul edilebilir. Aksi takdirde ('-R' olmadan), yalnızca orijinal dosyanın bazı bölümleri değiştiği için başarısız olabilir. Aşağıda basit bir örnek verilmiştir:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Dahası, yukarıdaki snippet'te patch
stdout ve stderr'ı tamamen yeniden yönlendirerek susturmayı bile tercih edebilirsiniz /dev/null
)
-sf
için patch
(olarak yazılabilir patch -Rsfp0 --dry-run
)
Birisine yardım etmesi durumunda, eğer bash betiği kullanıyorsanız, Omnifarious tarafından verilen örnek işe yaramaz. Bash'da başarılı bir komutun çıkış durumu 0'dır.
Yani aşağıdakiler işe yarar:
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
yerine karşı olmalıdır 0
:if [ $? -eq 1 ]
true
if amaçları için olduğunu düşünür . Çünkü çoğu komut başarıyı göstermek için 0 çıkış kodunu kullanır.
patch
Yardımcı programı kullandığınızı ve yamanacak her dosyanın kendi yamasını olduğunu varsayarsak, bir tahmin :
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
, yedeklemenin yapılmasına neden olacak seçenekle çalıştırabilirsiniz . Sonra yedek varlığını kontrol edin.
nohup
Bu if
durumda neden kullanmayı seçtiğiniz konusunda biraz genişleyebilir misiniz ?
Benim durumumda, yama komutunu çalıştırmanın ne yapacağını soran etkileşimli bir terminalle (özellikle CI için) sonuçlanmaması için bu kontrolü yapmak istedim.
Sadece ihtiyacınız varsa --forward
argümanı da kullanabileceğiniz ve zaten uygulanmışsa yamanın atlanacağı ortaya çıkıyor!