Bash: command1 başarısız olursa command2'yi çalıştırın


43

Böyle bir şey yapmak istiyorum:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

Bunu nasıl yapmalıyım?


1
Sadece "echo success" komutundan önce "sonra" anahtar sözcüğünü kaçırıyorsunuz.
glenn jackman

10
Hmmm; sözde
kodunuz

Bazı kabuk komut dosyası çıkış koşulları için iyi bir kaynak pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Yanıtlar:


71

Bunlar ihtiyacınız olanı yapmalı:

cmd1 && cmd2 && echo success || echo epic fail

veya

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi

3
Bu işe yarar, ancak neden ||ilk echokomutun çıktısına bakmadığı konusunda kafam karıştı .
mlissner

1
@mlissner, if başkası kodlarından çıkmayı bekler, eğer komut nereden başlatılırsa 0, nerede hata olursa 1. Çıkışta okumayın. Just try whoami && whoami && echo success || echo epic failve şimdi whoami && whoareyou && echo success || echo epic fail. "İlk yankı komutunun çıktısına bakmıyor" derken ne demek istediğinizi
çözemiyorum

@mlissner Sorunuzu aldığımı düşünüyorum, ancak cevabı yankı komutunun hiçbir zaman başarısız olmayacağı yönünde. Yani, dönüşü 0, yani truthy olacaktır. Öyleyse gerçekten önemli olan şey adilcmd1 && cmd2
Kazim Zaidi

22

Petr Uzel yerini alıyor ancak aynı zamanda $ $ sihiriyle oynayabilirsiniz.

, $? çıkış kodunu çalıştırılan son komuttan tutar ve bunu kullanırsanız komut dosyalarınızı oldukça esnek bir şekilde yazabilirsiniz.

Bu sorular bu konuya biraz dokunuyor, $ kullanmak için en iyi yöntem? bash olarak mı? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Daha sonra farklı çıkış kodlarına da tepki verebilir ve isterseniz farklı şeyler yapabilirsiniz.


1
Şirketim, PHP Experts, Inc. ve ben, dahili CI betiğimizin ayrılmaz bir parçası olduğunuz için teşekkür ederim. Teşekkür ederim!
Theodore R. Smith

7

Sorudaki sahte kod, sorunun başlığına uymuyor.

Komut 1 başarısız olursa komut 2'nin nasıl çalıştırılacağını bilen biri varsa, bu basit bir açıklamadır:

  • cmd1 || cmd2: Bu çalışacak cmd1ve başarısızlık durumunda çalışacakcmd2
  • cmd1 && cmd2: Bu çalışacak cmd1ve başarı durumunda çalışacakcmd2
  • cmd1 ; cmd2: Bu koşacak cmd1ve cmd2koşmanın başarısızlığından veya başarısından bağımsız olarak koşacak cmd1.
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.