Waspadai resep seperti ini
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Itu melakukan dua hal yang salah. Baris pertama dalam resep dijalankan dalam instance shell terpisah dari baris kedua. Sementara itu variabel hilang. Hal kedua yang salah adalah bahwa hal $
itu tidak luput.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Kedua masalah telah diperbaiki dan variabel dapat digunakan. Garis miring terbalik menggabungkan kedua baris untuk berjalan dalam satu shell tunggal, maka pengaturan variabel dan pembacaan kata penutup variabel, bekerja.
Saya menyadari posting asli mengatakan bagaimana cara mendapatkan hasil dari perintah shell ke dalam variabel MAKE, dan jawaban ini menunjukkan bagaimana memasukkannya ke dalam variabel shell. Tetapi pembaca lain mungkin mendapat manfaat.
Satu perbaikan terakhir, jika konsumen mengharapkan "variabel lingkungan" untuk ditetapkan, maka Anda harus mengekspornya.
my_shell_script
echo $MY_ID
akan membutuhkan ini di makefile
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Semoga itu bisa membantu seseorang. Secara umum, seseorang harus menghindari melakukan pekerjaan nyata di luar resep, karena jika seseorang menggunakan makefile dengan opsi '--dry-run', untuk hanya MELIHAT apa yang akan dilakukan, itu tidak akan memiliki efek samping yang tidak diinginkan. Setiap $(shell)
panggilan dievaluasi pada waktu kompilasi dan beberapa pekerjaan nyata dapat dilakukan tanpa sengaja. Lebih baik meninggalkan pekerjaan nyata, seperti membuat id, ke bagian dalam resep bila memungkinkan.