bash script: bir hata verirse komutu tekrarla


Yanıtlar:


40

Serverfault üzerinde başka bir yerde bu zarif döngü için temel buldum. Doğrudan komutun kendisinde test edebileceğiniz gibi çıkış kodunu kaydetmeniz gerekmez;

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

Neredeyse. Dönen değeri önceden ayarlayabilmeniz için dönüş değerini değişken olarak kaydetmeniz daha iyi olacaktır. Aksi takdirde, son çalıştırma komutundan etkilenecektir.

sleepÇok hızlı bir şekilde yeniden doğmasını durdurmak için oraya asılmak da isteyebilirsiniz .

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

Çıkış kodunu RET değişkenine iletmeyi unuttuğumu düşünüyorum, ancak fikri anlıyorum. Asıl sorum şu ana kadar ne zaman değerlendirilecek? C'de döngünün ilk çalıştırılmasından sonra değerlendirilmez, bu durumda döngünüm çalışmalıdır. Yine de, uyku gibi ara komutlara izin verdiği için, yine de daha iyidir. Teşekkürler!
Roy

İyi benekli. Düzenledim. Madde, ilk çalıştırmadan önce değerlendirilecektir. Bu yüzden önceden herhangi bir önceki komutun dönüş kodunu kullanırdı. İkili eşitler Bash tarafından zorlanmaz ancak kullanımı iyi bir uygulama yapar.
Dan Carley

== bu durumda önemli olmadığını düşünmeme rağmen sayısal eşitlikten değil dize eşitliği içindir ...
Kyle Brandt

Tek ve çift eşitler aynıdır. Fakat şimdi bahsettiğiniz tamsayı eşitliği kullanmak daha iyi olacaktır.
Dan Carley

1
Dönüş kodu numarasını test etmeniz gerekmez - programın dönüş kodunu programın kendisine kadar test edebilirsiniz; 3 uyu; bitti.
chris

3

Bit hacky ama benim çözümüm, başarısızlıkla çıkması durumunda kendini çalıştıran bir bash işlevi yaratmaktı.

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

0

Komutunuz hata verirken bir döngü yapabilirsiniz:

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

3
Bu cevap açıklama gerektiriyor.
kasperd

@kasperd açıklama eklendi
Andrés Rivas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.