Saya mencoba untuk menginstruksikan GNU Make 3.81 untuk tidak berhenti jika suatu perintah gagal (jadi saya awali perintah dengan -
) tetapi saya juga ingin memeriksa status keluar pada perintah berikutnya dan mencetak pesan yang lebih informatif. Namun Makefile saya di bawah gagal:
$ 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!
Mengapa Makefile di atas bergema "sukses!" bukannya "gagal!" ?
memperbarui:
Mengikuti dan memperluas jawaban yang diterima, di bawah ini adalah bagaimana seharusnya ditulis:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.ONESHELL:
arahan..SHELLFLAGS = -ec
sebaiknya digunakan. Tetapi dalam hal ini Anda tidak dapat menggunakan-
awalan lebih (untuk perintah tanda terima pribadi) karena make akan menulis bahwa kesalahan diabaikan tetapi masih akan gagal semua blok. Jadi,|| :
merupakan salah satu solusi untuk mengabaikan perintah. Tapi itu bukan cross-platform (Windows belum|| :
atau|| true
)Jawaban:
Setiap perintah pembaruan dalam aturan Makefile dieksekusi di shell terpisah. Jadi $? tidak mengandung status keluar dari perintah gagal sebelumnya, itu berisi apa pun nilai defaultnya adalah $? di shell baru. Itu sebabnya [$? -eq 0] Tes selalu berhasil.
sumber
Anda tidak perlu pengujian
$?
sejak&&
berhasil jika$?
nol dan||
diproses jika nilai pengembalian tidak nol.Dan Anda tidak perlu minus karena nilai pengembalian untuk membuat diambil dari panggilan program proses terakhir dari saluran. Jadi ini berfungsi dengan baik
kegagalan:
keberhasilan:
Sebaliknya yang terjadi: Jika Anda ingin melakukan pesan Anda sendiri dan tetap ingin menghentikan proses make dengan nilai yang tidak nol, Anda perlu menulis sesuatu seperti ini:
kegagalan:
sumber
Dari GNU, buat dokumentasi :
Untuk memanfaatkan
make
status keluar dalam kasus seperti ini, jalankanmake
dari skrip:Dan siapkan Makefile Anda:
sumber