Di bagian bersih saya, Makefile
saya mencoba memeriksa apakah file ada sebelum menghapus secara permanen. Saya menggunakan kode ini tetapi saya menerima kesalahan.
Apakah ada yang salah?
if [ -a myApp ]
then
rm myApp
fi
Saya mendapatkan pesan kesalahan ini
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
bisa jadi alternatif. Atau mendahului perintah dengan tanda hubung (-rm myApp
) untuk membuat abaikan kesalahan dari rm (namun akan mencetak pesan yang jelek).Jawaban:
Namun jawaban atas kedua menyebutkan
ifeq
, gagal menyebutkan bahwa ini harus pada tingkat yang sama dengan nama target, misalnya, untuk mengunduh file hanya jika tidak ada saat ini, kode berikut dapat digunakan:sumber
Sungguh aneh melihat begitu banyak orang menggunakan skrip shell untuk ini. Saya sedang mencari cara untuk menggunakan sintaks makefile asli, karena saya menulis ini di luar target apa pun. Anda dapat menggunakan
wildcard
fungsi ini untuk memeriksa apakah file ada:Memperbarui:
Saya menemukan cara yang benar-benar berfungsi untuk saya:
sumber
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
sebenarnya dilakukan. Lihat tautan .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
Masalahnya adalah ketika Anda membagi perintah Anda ke beberapa baris. Jadi, Anda bisa menggunakan
\
akhir baris untuk kelanjutan seperti di atas atau Anda bisa mendapatkan semuanya di satu saluran dengan&&
operator di bash.Kemudian Anda dapat menggunakan
test
perintah untuk menguji apakah file itu ada, misalnya:atau tidak:
Itu
test
sama dengan[
perintah.dan itu akan bekerja seperti pada contoh asli Anda.
Lihat:
help [
atauhelp test
untuk sintaksis lebih lanjut.sumber
-s
ini adalah kasus khusus untukexists and has a size greater than zero
. Pertanyaan yang ditulis adalah size-agnostik, jadi keberadaannya harus diperiksa menggunakantest -e
file atau-d
direktori. File kosong dapat sangat berguna sebagai (untuk menginginkan istilah yang lebih baik) indikator / sentinel, yang mungkin cukup relevan untukmake
.-f
secara default, karena lebih umum digunakan.test
di Windows?|| true
di bagian akhir sehingga perintah mengembalikan true ketika file tidak ada.test -f myApp || CMD
, perhatikan||
, jadi jika-f
akan gagal - tidak ada (||
), maka jalankan perintah. Apakah masuk akal?Mungkin perlu garis miring terbalik pada akhir baris untuk kelanjutan (walaupun mungkin itu tergantung pada versi make):
sumber
make
baris baru akan menjadi perintah bash baru. Peringatan utama ini, selain gangguan memiliki banyak\
pada akhir baris adalah bahwa setiap perintah harus diakhiri dengan;
yang jika tidak akan tersirat dalam bash.Atau cukup letakkan di satu baris, seperti yang
make
diinginkansumber
Kehilangan titik koma
Namun, saya berasumsi Anda sedang memeriksa keberadaan sebelum penghapusan untuk mencegah pesan kesalahan. Jika demikian, Anda bisa menggunakan
rm -f myApp
"kekuatan" yang dihapus, yaitu tidak kesalahan jika file tidak ada.sumber
hasil eksekusi:
sumber
echo -n yes
kesuksesantest
menjadi stringyes
tanpa NL. Kemudianifeq
dapat membandingkannya dengan kode kerasyes
. Semua karenaifeq
ingin membandingkan string, bukan status sukses dari perintah shell.Solusi satu baris:
Solusi satu baris dengan tindakan kesalahan:
Contoh yang digunakan dalam
make clean
arahan saya :Dan
make clean
selalu berfungsi tanpa pesan kesalahan!sumber
-rm myfile
perintah dash dasbor membuat untuk mengabaikan kesalahan.@[ -f 'myfile' ] && rm myfile
"Jika README.md tidak ada, jangan lakukan apa-apa (dan keluar dengan sukses). Jika tidak, tambahkan teks ke akhir."
Jika Anda menggunakan
&&
alih-alih||
maka Anda menghasilkan kesalahan saat file tidak ada:sumber
Saya mencoba:
Dan kasing positif bekerja tetapi bash shell ubuntu saya menyebut ini BENAR dan merusak salinan:
Setelah mendapatkan kesalahan ini, saya google cara memeriksa apakah ada file di make, dan ini adalah jawabannya ...
sumber
Solusi yang diposting di atas berfungsi paling baik. Tetapi pastikan bahwa Anda tidak menetapkan tugas PATH_TO_FILE Misalnya,
Pasti begitu
sumber
Jawabannya seperti dari @ mark-wilkins menggunakan \ untuk melanjutkan baris dan; untuk menghentikan mereka di shell atau seperti yang dari @kenorb mengubah ini ke satu baris adalah baik dan akan memperbaiki masalah ini.
ada jawaban yang lebih sederhana untuk masalah aslinya (seperti yang ditunjukkan @ alexey-polonsky). Gunakan flag -f untuk rm sehingga tidak akan memicu kesalahan
ini lebih sederhana, lebih cepat dan lebih dapat diandalkan. Berhati-hatilah agar tidak berakhir dengan garis miring dan variabel kosong
rm -f / $ (myAppPath) #TIDAK PERNAH MELAKUKAN INIAnda mungkin akhirnya menghapus sistem Anda.
sumber
rm
sama sekali; BTW, saya cukup yakin iturm -f /$(myAppPath)
tidak akan merusak, karena itu/
adalah direktori, dan-r
hilang.rm -f
, misalnya mereka mungkin inginrm
variabel.