ব্যর্থ হওয়া অবধি বার বার শেল কমান্ড চালাবেন?


190

আমি একটি अस्पष्ट পরীক্ষা লিখেছি যা অবিশ্বাস্যভাবে ব্যর্থ হয়। আমি কিছু ডিবাগ কোড যুক্ত করেছি, তবে এখন আমি পরীক্ষা চালাতে চাই যতক্ষণ না এটি ব্যর্থ হয় ততক্ষণ আমি ডিবাগ আউটপুট সংগ্রহ করতে পারি।

আমি পরীক্ষাটি সেটআপ করেছি যাতে এটি ব্যবহার করে চালাতে পারি:

./runtest

আমার বর্তমান সমাধানটি একটি untilfailস্ক্রিপ্ট লেখার জন্য:

#!/bin/bash
$@
while [ $? -eq 0 ]; do
    $@
done

তারপরে এটি ব্যবহার করুন:

untilfail ./runtest

এর চেয়ে সহজ সমাধান কি আছে?


11
পার্শ্ব নোট: অভ্যাসগতভাবে উদ্ধৃতি "qu @"।
জর্দান

উত্তর:


326

while কার্যকর করার জন্য একটি কমান্ড নেয়, যাতে আপনি আরও সহজ ব্যবহার করতে পারেন

while ./runtest; do :; done

ননজারো প্রস্থান কোড (যা সাধারণত ব্যর্থতার পরিচায়ক) ./runtestফেরত দেয় তখন লুপটি থামবে ।

আপনার বর্তমান সমাধানটি আরও সরল করার জন্য, আপনাকে কেবল নিজের অব্যবহৃত স্ক্রিপ্টটি দেখতে দেখতে এটি পরিবর্তন করা উচিত:

#!/bin/bash

while "$@"; do :; done

এবং তারপরে আপনি এটি ইতিমধ্যে যে কোনও আদেশ ব্যবহার করছেন তা দিয়ে কল করতে পারেন:

untilfail ./runTest --and val1,val2 -o option1 "argument two"

25
এটি [একটি কমান্ড এটিও উল্লেখ করা ভাল । এটি নতুন ব্যবহারকারীদের কাছে একটি সাধারণ ভুল ধারণা [যা অংশ ifএবং whileসিনট্যাক্সের অংশ ।
জর্ডানম

2
এটি ব্যর্থ হওয়ার আগে এটি কতবার চালিয়েছিল তার একটি গণনা আমি কীভাবে পেতে পারি?
গ্রান্টজে

13
@ গ্রান্টজে: এটি আসলেই সহজ। count=0লুপের আগে রাখুন , তারপরে লুপের পরিবর্তে :(কোনও অপ-অপশন) রাখুন (( count++ ))- এটি কাউন্টারকে বাড়িয়ে তোলে।
নিনেনিও

14
একটি উত্পাদনশীলতা হ্যাক: আপনি যদি কোনও সিস্টেমে sayএবং স্পিকারের সাথে while ./runtest; do :; done && say test failedথাকেন তবে যদি এটি কখনও থামে তবে আপনাকে অবহিত করার জন্য ব্যবহার করতে পারেন
শ্নিম্নস

5
@ স্নেমেটস: sayম্যাকোস-নির্দিষ্ট এটি লক্ষণীয় ।
nneonneo

13

আপনি যদি কোনও শেল স্ক্রিপ্ট বা ফাংশনে কোনও জটিল পাইপ লাইন মোড়তে না চান তবে এটি কাজ করে:

while true; do 
  curl -s "https:..." | grep "HasErrors.:true"
  if [[ "$?" -ne 0 ]]; then 
    break
  fi
  sleep 120
done

এই ক্ষেত্রে এইচটিটিপি অনুরোধটি সর্বদা 200 ফেরত দেয় তবে কিছু জেএসওএনও ফিরিয়ে দেয় যার "হাস্যররিজ" একটি বৈশিষ্ট্য রয়েছে: ত্রুটি থাকলে সত্য।


1

কোনও সিস্টেমে একই সমস্যা হওয়ার পরে শেল পুনরায় চেষ্টা করার যুক্তি সর্বত্র নকল হয়েছিল আমি এই "পুনরায় চেষ্টা" বলা সমাধানের জন্য একটি উত্সর্গীকৃত সরঞ্জাম তৈরি করেছি:

retry --until=fail ./runtest

আরও জটিল উদাহরণ:

retry --until=fail --message="test succeeded" --delay=1 ./runtest

Https://github.com/minfrin/retry থেকে উপলব্ধ সরঞ্জাম ।

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