2016-03-20 17 views
0

Varolan bir bash komut dosyasını değiştiriyorum ve while döngüsünün doğru şekilde davranmasıyla ilgili bir sorun yaşıyorum. Bu benim Başarı durumunda 0 ve 1 döndürür executable1 aşağıdakiDöngü sırasında bir koşulda bileşik koşullu

while ! /usr/bin/executable1 && ! $(myfunc) 
do 
    # executable1 and myfunc both were unsuccessful. So sleep for some time 
    sleep 2 
done 

bu değiştirmek istiyorum orijinal kod

while ! /usr/bin/executable1 
do 
    # executable1 returned an error. So sleep for some time try again 
    sleep 2 
done 

olduğunu. yürütülebilir kadar döngü devam edecek özgün senaryo başarıyı Buna göre myfunc ben döngü yeni yapar benim ederken fark bu

myfunc() 
{ 
    # Check if file exists. If exits, return 0, If not, return 1 
    if [ -e someFile ]; then 
     return 0 
    fi 

    return 1 
} 

gibi kodlanmıştır

döndü neden bash 0 olarak değerlendirilir ben o "gerçek" anlamaları için şu çalıştırılabilir1 gibi görünmüyor. Her zaman myfunc() işlevini çağırır ve sonra hemen döngüden çıkar. Neyi yanlış yapıyorum?

ben while döngüsü kodlama çeşitli yollar denedik (ile (()), [], [[]] vs), ama hiçbir şey onu

+0

'executable1' hiç çalışmaz değildir; 'myfunc' çalıştırılıp çalıştırılmayacağına (' && 'nedeniyle) karar vermek için * çalıştırılmalıdır. – chepner

+0

yürütülebilir 1 kendisi tarafından çalıştırıldığında tamamlamak için 8-10 saniyeye yakın alır. (aslında "ntpdate" çalışır) Bu yüzden, hemen hemen geri döndüğünden emin olun, çünkü while döngüsü hemen geri döner. –

+0

Sanırım problemi kodumda çözmüş olabilirim. Bash'te, true değeri 0'a döner ve false 1'e dönüşür. Yani ((0)) aslında sonsuz bir döngüdür. Ne yapmak istediğim, dosya bulunmazken while döngüsünü girmek. Dosya bulunamadığı zaman 1 (yanlış), dosya bulunduğunda ise 0 (doğru) dönmeliyim. Bu değişikliği yaptıktan sonra, hepsi bu sorudaki kodumun temel bilgileri olan –

cevap

1

düzeltmek gibi görünüyor Bir işlevi çağırmak için $(...) gerekmez sadece standart çıktısını yakalamak için. Sadece istediğiniz

while ! /usr/bin/executable1 && ! myfunc 
do 
    sleep 2 
done 

myfunc da daha basitçe (bash olarak) bile

myfunc() { 
    [ -e someFile ] 
} 

yazılı veya edilebilmesi Not

myfunc() [[ -e someFile ]] 

iki durumda da, myfunc ayrı tanımlayan neredeyse değmez; Sadece bir until döngü kullanmak Ayrıca basit olabilir

while ! /usr/bin/executable1 && ! [[ -e someFile ]] 
do 
    sleep 2 
done 

kullanın: Sizce neden net değil

until /usr/bin/executable1 || [[ -e someFile ]]; do 
    sleep 2 
done 
+0

çalıştı. Myfunc() gerçekliğin çok fazla şey yapmasıdır, ancak asıl konu, arayan kişiye 1 veya 0 döndürmesidir. –