Coi chừng những công thức nấu ăn như thế này
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Nó làm hai điều sai. Dòng đầu tiên trong công thức được thực thi trong một thể hiện shell riêng biệt từ dòng thứ hai. Các biến bị mất trong khi chờ đợi. Điều thứ hai sai $
là không thoát được.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Cả hai vấn đề đã được sửa chữa và biến có thể sử dụng được. Dấu gạch chéo ngược kết hợp cả hai dòng để chạy trong một shell duy nhất, do đó cài đặt biến và đọc các từ khóa biến, hoạt động.
Tôi nhận ra bài viết gốc cho biết làm thế nào để đưa kết quả của lệnh shell vào biến MAKE và câu trả lời này cho thấy cách đưa nó vào biến shell. Nhưng độc giả khác có thể có lợi.
Một cải tiến cuối cùng, nếu người tiêu dùng mong đợi một "biến môi trường" được đặt, thì bạn phải xuất nó.
my_shell_script
echo $MY_ID
sẽ cần điều này trong tệp thực hiện
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Hy vọng rằng sẽ giúp được ai đó. Nói chung, mọi người nên tránh thực hiện bất kỳ công việc thực tế nào ngoài công thức nấu ăn, bởi vì nếu ai đó sử dụng tệp thực hiện với tùy chọn '--dry-run', chỉ để XEM những gì nó sẽ làm, nó sẽ không có tác dụng phụ không mong muốn. Mỗi $(shell)
cuộc gọi được đánh giá tại thời gian biên dịch và một số công việc thực sự có thể vô tình được thực hiện. Tốt hơn là để công việc thực sự, như tạo id, vào bên trong công thức nấu ăn khi có thể.