বাশ স্ক্রিপ্ট: পুনরায় কমান্ড যদি এটি একটি ত্রুটি প্রদান করে


23

আমি এমন একটি লুপ তৈরি করতে চাই যা যদি কোনও ত্রুটি ফিরে আসে তবে একটি এনসিএফটিপি স্থানান্তর পুনরাবৃত্তি করে।

আমি কীভাবে প্রস্থান কোড ভেরিয়েবলটি একটি লুপে ব্যবহার করতে পারি তা আমি নিশ্চিত না। এই কাজ ভালো কিছু হবে?

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

আমি মনে করি RET ভেরিয়েবলের প্রস্থান কোডটি ভুলে গিয়েছিলাম, তবে আমি ধারণাটি পেয়েছি। আমার মূল প্রশ্নটি হচ্ছে এই ক্লজটি কখন মূল্যায়ন করা হবে? সিতে এটি লুপের প্রথম চালানোর পরে মূল্যায়ন করা হবে না, এই ক্ষেত্রে আমার লুপটি কাজ করা উচিত। আপনার এখনও আরও ভাল, এটি ঘুমের মতো মধ্যবর্তী কমান্ডের অনুমতি দেয়। ধন্যবাদ!
রায়

ভাল বিক্ষোভ. আমি এটি সম্পাদনা করেছি। প্রথম দৌড়ার আগে এই ধারাটি মূল্যায়ন করা হবে। সুতরাং পূর্বে এটি কোনও পূর্ববর্তী কমান্ডের রিটার্ন কোড ব্যবহার করবে। ডাবল-সমান বাশ দ্বারা প্রয়োগ করা হয় না তবে এটি ব্যবহারের জন্য ভাল অনুশীলন করে।
ড্যান কারলি

== হ'ল স্ট্রিং সমতার জন্য সংখ্যাটি নয়, যদিও আমি মনে করি না যে এটি এই ক্ষেত্রে গুরুত্বপূর্ণ matters
কাইল ব্র্যান্ড্ট

একক এবং ডাবল সমান are তবে আপনি এখন এটির উল্লেখ করে পূর্ণসংখ্যার সাম্যতা ব্যবহার করা ভাল।
ড্যান কারলি

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
এই উত্তরের ব্যাখ্যা দরকার।
ক্যাস্পারড

@ ক্যাস্পার্ড ব্যাখ্যা যোগ করেছেন
অ্যান্ড্রেস রিভাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.