मैं एक ऐसी स्क्रिप्ट पर काम कर रहा हूं जो इतना जटिल हो गया है कि मैं इसे नवीनतम संस्करण में अपडेट करने का एक आसान विकल्प शामिल करना चाहता हूं। यह मेरा दृष्टिकोण है:क्या यह एक बैश स्क्रिप्ट के लिए एक वैध स्व-अद्यतन दृष्टिकोण है?
set -o errexit
SELF=$(basename $0)
UPDATE_BASE=http://something
runSelfUpdate() {
echo "Performing self-update..."
# Download new version
wget --quiet --output-document=$0.tmp $UPDATE_BASE/$SELF
# Copy over modes from old version
OCTAL_MODE=$(stat -c '%a' $0)
chmod $OCTAL_MODE $0.tmp
# Overwrite old file with new
mv $0.tmp $0
exit 0
}
स्क्रिप्ट उद्देश्य के अनुसार कार्य करने लगता है, लेकिन अगर वहाँ दृष्टिकोण के इस प्रकार के साथ चेतावनियां हो सकता है मैं सोच रहा हूँ। मुझे बस इतना कठिन समय लगता है कि एक स्क्रिप्ट किसी भी प्रतिक्रिया के बिना खुद को ओवरराइट कर सकती है।
अधिक स्पष्ट होने के लिए, मुझे आश्चर्य है, अगर, शायद, स्क्रिप्ट लाइन-दर-रेखा को पढ़ और निष्पादित करेगा और mv
के बाद, exit 0
नई स्क्रिप्ट से कुछ और हो सकता है। मुझे लगता है कि मुझे याद है कि विंडोज .bat
फाइलों के साथ ऐसा व्यवहार कर रहा है।
अद्यतन: मेरे मूल स्निपेट में set -o errexit
शामिल नहीं था। मेरी समझ के लिए, मुझे wget
के कारण होने वाले मुद्दों से मुझे सुरक्षित रखना चाहिए।
इसके अलावा, इस मामले में, UPDATE_BASE
संस्करण नियंत्रण (चिंताओं को कम करने के लिए) के तहत एक स्थान पर इंगित करता है।
परिणाम: इन उत्तरों से इनपुट के आधार पर, मैं इस संशोधित दृष्टिकोण का निर्माण:
runSelfUpdate() {
echo "Performing self-update..."
# Download new version
echo -n "Downloading latest version..."
if ! wget --quiet --output-document="$0.tmp" $UPDATE_BASE/$SELF ; then
echo "Failed: Error while trying to wget new version!"
echo "File requested: $UPDATE_BASE/$SELF"
exit 1
fi
echo "Done."
# Copy over modes from old version
OCTAL_MODE=$(stat -c '%a' $SELF)
if ! chmod $OCTAL_MODE "$0.tmp" ; then
echo "Failed: Error while trying to set mode on $0.tmp."
exit 1
fi
# Spawn update script
cat > updateScript.sh << EOF
#!/bin/bash
# Overwrite old file with new
if mv "$0.tmp" "$0"; then
echo "Done. Update complete."
rm \$0
else
echo "Failed!"
fi
EOF
echo -n "Inserting update process..."
exec /bin/bash updateScript.sh
}
बेहतर नहीं होगा 'के साथ बाहर निकलने के 0' को बदलने के लिए' कार्यकारी "$ 0" 'किसी भी तर्क आप शायद रिले (जरूरत प्लस:' कार्यकारी "$ 0" "$ @" ')?यही है, @shellter द्वारा चर्चा के अनुसार स्क्रिप्ट के पिछले अवतार को डाउनलोड करने, बदलने और बदलने के यांत्रिकी के साथ निपटने के बाद। –
@ जोनाथन लेफ्लर हां, शायद। अभी के लिए, मैं इसे एक अलग और छोटी कार्रवाई रखना चाहता था ताकि यह संभवतः बाकी लिपि में हस्तक्षेप न करे। एक बार जब मैं दृष्टिकोण में आत्मविश्वास रखता हूं, तो मैं इसे बढ़ा सकता हूं। –
ध्यान दें कि स्टेट के साथ अनुमतियां प्राप्त करने के लिए ओएसएक्स पर एक अलग ध्वज और प्रारूप की आवश्यकता होती है। समकक्ष 'stat -f '% ए' $ 0' है। – meonlol