बार-बार शेल कमांड चलाने तक यह विफल रहता है?


190

मैंने एक फजी टेस्ट लिखा है जो अविश्वसनीय रूप से विफल हो जाता है। मैंने कुछ डिबग कोड जोड़े हैं, लेकिन अब मैं परीक्षण चलाना चाहता हूं जब तक कि यह विफल न हो जाए, इसलिए मैं डिबग आउटपुट एकत्र कर सकता हूं।

मैंने परीक्षण सेटअप किया है इसलिए मैं इसका उपयोग करके चला सकता हूं:

./runtest

एक untilfailस्क्रिप्ट लिखने के लिए मेरा वर्तमान समाधान है :

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

फिर इसका उपयोग करें:

untilfail ./runtest

क्या कोई सरल उपाय है?


11
साइड नोट: आदतन बोली "$ @"।
जोर्डनम

जवाबों:


326

while निष्पादित करने के लिए एक कमांड लेता है, ताकि आप सरल का उपयोग कर सकें

while ./runtest; do :; done

जब ./runtestएक नॉनज़ेरो एग्जिट कोड (जो आमतौर पर विफलता का संकेत होता है) लौटाता है तो यह लूप बंद कर देगा ।

हालांकि अपने वर्तमान समाधान को और सरल बनाने के लिए, आपको इस तरह दिखने के लिए बस अपनी पटकथा को बदलना चाहिए:

#!/bin/bash

while "$@"; do :; done

और फिर आप इसे पहले से उपयोग कर रहे कमांड के साथ कह सकते हैं:

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

25
यह भी इंगित करना अच्छा है कि [एक कमांड है। यह नए उपयोगकर्ताओं के साथ एक आम गलतफहमी है जो कि और वाक्य रचना [का हिस्सा है । ifwhile
जोर्डनम

2
असफल होने से पहले मैं इसे कितनी बार गिन सकता था?
ग्रांटज

13
@ क्रांति: यह वास्तव में बहुत सरल है। count=0लूप से पहले रखो , फिर :लूप (एक नहीं सेशन) के बजाय , रखो (( count++ ))- यह काउंटर को बढ़ाता है।
nnonneo

14
एक उत्पादकता हैक: यदि आप एक प्रणाली sayऔर स्पीकर के साथ हैं, तो यदि आप while ./runtest; do :; done && say test failedकभी भी बंद हो जाते हैं, तो आपको सूचित किया जा सकता है
Schneems

5
@ साचे: ध्यान देने योग्य है कि macOS- sayविशिष्ट है।
nnonneo

13

यदि आप एक जटिल पाइप लाइन को शेल स्क्रिप्ट या फ़ंक्शन में लपेटना नहीं चाहते हैं तो यह काम करता है:

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

इस मामले में HTTP अनुरोध हमेशा 200 रिटर्न करता है, लेकिन कुछ JSON को भी लौटाता है, जिसमें एक त्रुटि "HasErrors" है: त्रुटि होने पर।


1

एक सिस्टम में एक समान समस्या थी, जिसमें शेल रीट्री लॉजिक को हर जगह डुप्लिकेट किया गया था जिसे मैंने "रिट्रीट" नामक एक हल करने के लिए एक समर्पित उपकरण बनाया था:

retry --until=fail ./runtest

एक अधिक जटिल उदाहरण:

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

टूल https://github.com/minfrin/retry से उपलब्ध है ।

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