अगर यह कोई त्रुटि देता है, तो bash स्क्रिप्ट: कमांड दोहराएँ


23

मैं एक लूप बनाना चाहूंगा जो एक ncftp हस्तांतरण को दोहराता है अगर यह एक त्रुटि देता है।

मैं थोड़ा अनिश्चित हूं कि निकास कोड चर का उपयोग लूप में कैसे किया जा सकता है। क्या यह काम पसंद आएगा?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

जवाबों:


40

मुझे इस खूबसूरत लूप का आधार कहीं और सर्वरफॉल्ट पर मिला। यह पता चलता है कि बाहर निकलने के कोड को बचाने की कोई आवश्यकता नहीं है, क्योंकि आप सीधे कमांड पर ही परीक्षण कर सकते हैं;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

लगभग। आप शायद एक चर के रूप में रिटर्न वैल्यू को बेहतर तरीके से सहेज रहे हैं ताकि आप इसे लूप से पहले सेट कर सकें। अन्यथा यह अंतिम रूप से संचालित कमांड से प्रभावित होगा।

आप sleepइसे जल्दी से सांस लेने से रोकने के लिए वहां स्लिंग करना चाहते हैं ।

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

मुझे लगता है कि आरईटी चर के लिए निकास कोड पारित करना भूल गया, लेकिन मुझे इसका विचार है। मेरा मुख्य सवाल यह है कि क्लॉज का मूल्यांकन कब तक किया जाएगा? सी में, लूप के पहले भाग के बाद इसका मूल्यांकन नहीं किया जाएगा, इस स्थिति में मेरा लूप काम करना चाहिए। तुम्हारा अभी भी बेहतर है, हालांकि, यह नींद जैसे मध्यवर्ती आदेशों के लिए अनुमति देता है। धन्यवाद!
रॉय

अच्छी तरह से देखा गया। मैंने इसे संपादित किया है। पहले रन से पहले क्लॉज का मूल्यांकन किया जाएगा। तो पहले यह किसी भी पूर्ववर्ती कमांड के रिटर्न कोड का उपयोग करेगा। डबल-बश बैश द्वारा लागू नहीं किए जाते हैं, लेकिन यह उपयोग करने के लिए अच्छा अभ्यास करता है।
डैन कार्ले

== स्ट्रिंग समानता के लिए है न कि संख्यात्मक, हालांकि मुझे नहीं लगता कि यह इस मामले में मायने रखता है ...
काइल ब्रांट

सिंगल और डबल समान हैं। लेकिन पूर्णांक समानता का उपयोग करने के लिए बेहतर होगा कि अब आप इसका उल्लेख करें।
डैन कार्ले

1
आपको रिटर्न कोड संख्या का परीक्षण करने की आवश्यकता नहीं है - आप केवल प्रोग्राम के रिटर्न कोड का परीक्षण कर सकते हैं - कार्यक्रम तक; सो जाओ 3; किया हुआ ।
क्रिस

3

बिट हैसी लेकिन मेरा समाधान सिर्फ एक बश फ़ंक्शन बनाना था जो विफलता के साथ बाहर निकलने पर खुद को चलाता है

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

जब आपका कमांड त्रुटि आए तो आप एक लूप कर सकते हैं:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
इस उत्तर को स्पष्टीकरण की आवश्यकता है।
कास्परैड

@kasperd स्पष्टीकरण जोड़ा गया
एन्ड्रेस रिवास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.