क्या पैच को लागू करने से पहले यह जानना संभव है कि क्या किसी फ़ाइल को पहले ही पैच कर दिया गया है?
मुझे एक स्क्रिप्ट में यह करने की आवश्यकता है, कोई विचार?
क्या पैच को लागू करने से पहले यह जानना संभव है कि क्या किसी फ़ाइल को पहले ही पैच कर दिया गया है?
मुझे एक स्क्रिप्ट में यह करने की आवश्यकता है, कोई विचार?
जवाबों:
हां, केवल विकल्प के patch
साथ दौड़ें --dry-run
, यह या तो विफल हो जाएगा या सफल होगा जिसे इसके बाहर निकलने की स्थिति के साथ पाया जा सकता है।
लेकिन अधिक सामान्य (और त्रुटि प्रवण) तरीके से , आपको संभवतः इसे -R
विकल्प के साथ चलाना होगा जिसका अर्थ है "रिवर्स" केवल तभी से जब यह पूरे पैच को वापस करने में सक्षम था, जिसे "लागू" माना जा सकता है। अन्यथा ('-R' के बिना) यह मूल फ़ाइल के कुछ हिस्सों के बदले बस विफल हो सकता है। नीचे एक सरल उदाहरण दिया गया है:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(इसके अलावा, ऊपर के स्निपेट में भी आप patch
पूरी तरह से अपने स्टडआउट और स्टैडर को पुनर्निर्देशित करना पसंद कर सकते हैं /dev/null
)
-sf
करने के लिए patch
(के रूप में लिखा जा सकता है patch -Rsfp0 --dry-run
)
बस अगर यह किसी की मदद करता है, यदि आप बैश स्क्रिप्ट का उपयोग कर रहे हैं, तो सर्वव्यापी द्वारा दिया गया उदाहरण काम नहीं करेगा। बैश में एक सफल कमांड का निकास स्थिति 0 है
तो निम्नलिखित काम करेगा:
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
इसके बजाय होनी चाहिए 0
:if [ $? -eq 1 ]
true
है, यदि वह प्रयोजनों के लिए है। सटीक रूप से क्योंकि अधिकांश कमांड सफलता को इंगित करने के लिए 0 के एक्जिट कोड का उपयोग करते हैं।
यहाँ एक अनुमान है, यह मानते हुए कि आप 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
-B
विकल्प के साथ पहला पैच राउंड चला सकते हैं , जिससे बैकअप बन जाएगा। फिर आप बैकअप के अस्तित्व की जाँच करें।
nohup
उस if
मामले में क्यों चुना ?
मेरे मामले में मैं वह जाँच करना चाहता था ताकि पैच कमांड चलाना एक इंटरैक्टिव टर्मिनल के साथ समाप्त न हो जाए, जिसमें यह पूछा जाए कि क्या करना है (विशेषकर CI के लिए)।
पता चला है कि अगर आपको केवल जरूरत है कि आप --forward
तर्क का भी उपयोग कर सकते हैं और यह पैच को छोड़ देगा यदि पहले से ही लागू है!