Bir komut başarısız olursa yapmayı bırakmayın, ancak çıkış durumunu kontrol edin


22

Bir komutun başarısız olması durumunda GNU Make 3.81'e durmamasını söylemeye çalışıyorum (bu yüzden komutu ön ekliyorum -) ama bir sonraki komutun çıkış durumunu kontrol etmek ve daha bilgilendirici bir mesaj yazdırmak istiyorum. Ancak aşağıdaki Makefile dosyam başarısız oluyor:

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

Neden yukarıdaki Makefile "başarı!" yerine "başarısızlık!" ?

güncelleştirme:

Kabul edilen cevabın ardından ve genişleyen, aşağıda nasıl yazılması gerektiğidir:

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     

2
.ONESHELL:Direktifi araştırmak isteyebilirsiniz .
Jonathan Leffler

.ONESHELL tüm makbuz bloğunu tek bir kabukta çalıştıracaktır: ilk komut başarısız olursa, sonraki bloklar sorunsuzca çalıştırılır. Bunu önlemek .SHELLFLAGS = -eciçin kullanılmalıdır. Ancak bu durumda -öneki daha fazla kullanamazsınız (makbuzun kişisel emri için), make bu hatayı görmezden gelir, ancak yine de tüm blokta başarısız olur. Yani, || :komutu görmezden gelmek için bir çözümdür. Ancak platformlar arası değil (Windows yok || :veya || true)
Paul-AG

Yanıtlar:


14

Makefile kuralındaki her güncelleme komutu ayrı bir kabukta yürütülür. Yani $ önceki başarısız komutun çıkış durumunu içermez, varsayılan değer $ için ne olursa olsun içerir? yeni bir kabukta. Bu yüzden [$? -eq 0] testi daima başarılıdır.


10

Sen test gerekmez $?çünkü &&eğer işler $?sıfırdır ve ||sıfır olmayan bir dönüş değeri durumunda yürütülmüştür.

Ve eksiğe ihtiyaç duymazsınız çünkü yapmak için dönüş değerinde satırın son program çağrısından alınır. Yani bu iyi çalışıyor

hatası:

      @/bin/false && echo "success!" || echo "failure!" 

başarı:

      @/bin/true && echo "success!" || echo "failure!"

Bunun tersi olur: Kendi mesajınızı yapmak istiyorsanız ve make işlemini sıfır olmayan bir değerle kesmek istiyorsanız, bunun gibi bir şey yazmanız gerekir:

hatası:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

8

Gönderen GNU yapmak belgelerinde :

Hatalar göz ardı edildiğinde, ya '-' ya da '-i' bayrağı nedeniyle, kabuğun çıktığı durum kodunu belirten bir mesaj yazması haricinde, bir hata dönüşümü başarıya benzer. hatanın göz ardı edildiğini söylüyor.

makeBöyle bir durumda çıkış durumunu kullanmak için makebir komut dosyasından çalıştır :

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

Makefile’nizin şunları içermesini sağlayın:

all:
    /bin/false
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.