Konsoldaki komutları nasıl zincirlerim?


23

Olarak bash, bazen seri birkaç komut çalıştırmak istiyorum ve yenilerini yazmadan önce bitirmek için onları beklemek istemiyorum. Böylece böyle bir şey yapıyorum:

cmd1; cmd2; cmd3

Ne yazık ki, komutlardan biri başarısız olabilir. Bu durumda, durmak istiyorum. Bunu yapmanın kolay bir yolu var mı, ancak yalnızca önceki komutta 0 çıkış kodu varsa, komutları çalıştırmaya devam etmemi sağlayacak şekilde yapmak mı?


İşte Unix SE'den harika bir cevap .
NonlinearFruit

Yanıtlar:


39

&&Operatör kullan

cmd1 && cmd2 && cmd3

Kabuk komut dosyasında &&ve ||operatörler, C'deki mantıksal operatörlerin optimize edilmiş uygulamasından sonra modellenir &&ve AND ||anlamına gelir ve VEYA anlamına gelir. Unix, C ile sıkı sıkıya ilişkilidir ve C'de, sonuç ilk işlenenden zaten biliniyorsa, ikinci mantıksal işleç işleci değerlendirilmez. Örneğin "false && x", herkes falseiçin x, bu yüzden değerlendirmeye gerek yok x(özellikle xbir işlev çağrısı ise); benzer şekilde "true || x". Buna aynı zamanda kısa devre anlambilimi denir .

Unix'te, komutların dönüş değerlerini "başarılı tamamlama" gerçeği değerleri olarak yorumlamak gelenekseldir: çıkış kodu 0 anlamına gelir true(başarı), sıfır olmayan araçlar false(başarısızlık). Bu nedenle, cmd1 && cmd2döndürülen ilk komut "false"(başarısızlığı gösteren sıfır olmayan çıkış durumu), bileşik komutun durumu bilinir: başarısızlık. Bu nedenle, genel yorumu şöyle cmd1 && cmd2 olabilir: " cmd1başarısız olursa, yürütmek ve sonra cmd2.". Sorunuzda temel olarak istediğiniz şey budur.

OR ile benzer şekilde: cmd1 || cmd2"çalıştır cmd1, VEYA başarısız olursa " olarak yorumlanabilir cmd2.


Protip: daha uzun zincirler için betiğinizi eklemeyi&& düşünün set -e. Temelde noktalı virgül değiştirir ;içine &&özel durumlarda bir çift.


1
Açıklamak için +1||
Alp

ilk komutun durumu ne olursa olsun zincirleyebilir misiniz? (başarı veya başarısızlık)
Hugo Trentesaux

@HugoTrentesaux ne demek istiyorsun? .. Başarı / başarısızlık sonucu veya A || Bsadece [kısa devre yapan] mantıksal A VEYA B ile aynı . A || Bolduğu başarı olduğunda Aoldu başarı veya ne zaman Aoldu başarısızlık ama Boldu başarı ; ve A || Bbir arıza olduğunda Aoldu yetmezliği ve Boldu failure. Benzer şekilde &&, mantıksal AND izler.
ulidtko

Kabuk bağlamında, A başarısız olursa veya başarılı olursa olsun A ve sonra B'yi nasıl uygulayabilirim?
Hugo Trentesaux

1
@HugoTrentesaux normal düz ;(veya newline) varsayılan olarak yaptığı şeydir . set -edönecek ;içine &&kabaca söylemek gerekirse,. set +e[varsayılan] A; Bsöylediklerinize dönüşür : koşun A, sonra ne olursa olsun koşun B.
ulidtko

13

"Zincirleme onları gruplandırıyor"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

pings, eğer başarılı olmazsa, zincirleme komut grubunu parantez içinde uygular.

Dikkat:

Liste bir ";" ile sonlandırılmalıdır.

Parantezler ve gruplandırılmış komutlar arasında boşluk bırakılmalıdır!


6

Sadece &&operatörle. Örneğin:

cmd1 && cmd2 && cmd3

Komutlardan biri başarısız olursa (0 dışında bir çıkış değeri döndürür), diğer komutlar çalışmaz.

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.