Buat: bagaimana melanjutkan setelah perintah gagal?

143

Perintah $ make allmemberikan kesalahan seperti rm: cannot remove '.lambda': No such file or directoryitu berhenti. Saya ingin mengabaikan rm-not-found-errors. Bagaimana saya bisa memaksa?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex
hhh
sumber

Jawaban:

264

Coba -ibendera (atau --ignore-errors). Dokumentasi tampaknya menyarankan cara yang lebih kuat untuk mencapai ini, dengan cara:

Untuk mengabaikan kesalahan dalam baris perintah, tulis a -di awal teks baris (setelah tab awal). Itu -dibuang sebelum perintah dilewatkan ke shell untuk dieksekusi.

Sebagai contoh,

clean:
  -rm -f *.o

Ini menyebabkan rmuntuk melanjutkan bahkan jika tidak dapat menghapus file.

Semua contoh dengan rm, tetapi berlaku untuk perintah lain yang Anda butuhkan untuk mengabaikan kesalahan dari (yaitu mkdir).

Eli Bendersky
sumber
30
Jangan lakukan itu! Anda seharusnya tidak mengabaikan kesalahan. Cukup tambahkan flag -f ke rm dan itu tidak akan lagi gagal ketika mencoba untuk menghapus file yang tidak ada. Namun akan tetap kembali dan salah jika benar-benar gagal menghapus file. Itu perilaku yang Anda inginkan, gagal ketika ada masalah!
Kristof Provost
15
@Kristof Provost Setuju. rm -flebih baik untuk masalah spesifik yang dialami pengguna, tetapi masih bagus untuk mengetahui tentang solusi umum meskipun kadang-kadang tidak aman.
brian_o
1
Itu sangat berguna, Eli. Terima kasih.
Dr Beco
1
Make juga menyediakan $(RM), yang bisa Anda gunakan sebagai ganti rm -f.
reitermarkus
32

make -k(atau --keep-goinggnumake) akan melakukan apa yang Anda minta, saya pikir.

Anda benar-benar harus menemukan baris del atau rm yang gagal dan menambahkannya -funtuk mencegah kesalahan itu terjadi pada orang lain.

TED
sumber
1
Saya tidak ingin mengatakan apa-apa, tetapi saya bertanya-tanya apa pemikiran mereka juga. Jika ada beberapa alasan saya tidak melihat mengapa bendera itu tidak sesuai, itu akan menjadi hal yang baik untuk diangkat.
TED
3
Anda seharusnya tidak mengabaikan kesalahan. Solusi yang diajukan oleh Brian, Oded dan NebuSoft sudah benar. Yang ini dan jawaban yang diterima salah.
Kristof Provost
1
@KristofProvost - Ah. Kurasa cukup adil. Secara umum saya juga percaya bahwa jawaban yang menjadi akar masalah lebih unggul daripada yang (seperti ini) yang menjawab pertanyaan yang diajukan. Saya tidak yakin saya akan menurunkan suara seseorang untuk itu, tetapi pukulan yang berbeda ...
TED
5
Jawaban bagus. Ini berisi bendera langsung tingkat atas yang tidak mengandung jawaban lain, namun tetap merekomendasikan perilaku yang benar. Kesalahan seharusnya tidak diabaikan, tetapi ada baiknya mengetahui opsi.
brian_o
1
Sesuatu yang berguna untuk dilakukan adalah mengabaikan kesalahan kompiler ... yang memungkinkan makeuntuk membangun unit kompilasi sebanyak mungkin saat Anda memperbaiki apa pun yang dikompilasi oleh kompiler. Dengan begitu ketika Anda telah memperbaiki apa pun yang rusak, Anda tidak perlu menunggu hal lain untuk dibangun juga.
inetknght
20

Ubah bersih menjadi

rm -f .lambda .lambda_t .activity .activity_t_lambda

Yaitu jangan meminta untuk menghapus; jangan mengeluh jika file tidak ada.

Brian Carlton
sumber
16

Kembali dengan sukses dengan memblokir rmkembali kode di belakang pipa dengan trueperintah, yang selalu kembali 0(berhasil)

rm file | true
Bryce Guinta
sumber
11

Untuk membuat benar-benar mengabaikan kesalahan pada satu baris, Anda bisa dengan akhiran dengan ; true, mengatur nilai kembali ke 0. Misalnya:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

Ini akan mengarahkan output stderr ke null, dan mengikuti perintah dengan true (yang selalu mengembalikan 0, membuat make percaya bahwa perintah berhasil terlepas dari apa yang sebenarnya terjadi), memungkinkan aliran program untuk melanjutkan.

Kerusuhan
sumber
1
Ini berfungsi untuk saya di mana dasbor utama tidak (saya diberi makefile untuk menjalankan tes yang perlu gagal, dan akan mengurai log nanti)
Sean Houlihane
2

Ubah cleanjadi Anda rmtidak akan mengeluh:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
Oded
sumber
1

Masukkan -fopsi dalam rmperintah Anda .

rm -f .lambda .lambda_t .activity .activity_t_lambda
NebuSoft
sumber