ระวังสูตรอาหารเช่นนี้
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
มันผิดสองอย่าง บรรทัดแรกในสูตรถูกดำเนินการในเชลล์อินสแตนซ์แยกจากบรรทัดที่สอง ตัวแปรจะหายไปในระหว่างนี้ สิ่งที่สองที่ผิด$
คือไม่หนี
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
ปัญหาทั้งสองได้รับการแก้ไขแล้วและสามารถใช้ตัวแปรได้ แบ็กสแลชรวมทั้งสองบรรทัดเพื่อทำงานในหนึ่งเชลล์ดังนั้นการตั้งค่าของตัวแปรและการอ่านตัวแปร afterwords จึงทำงานได้
ฉันรู้ว่าโพสต์ต้นฉบับบอกว่าจะได้ผลลัพธ์ของคำสั่ง shell ไปยังตัวแปร MAKE ได้อย่างไรและคำตอบนี้แสดงวิธีนำมันมาเป็นตัวแปร shell แต่ผู้อ่านคนอื่นอาจได้รับประโยชน์
การปรับปรุงขั้นสุดท้ายหนึ่งหากผู้บริโภคคาดว่าจะมีการตั้งค่า "ตัวแปรสภาพแวดล้อม" คุณต้องส่งออก
my_shell_script
echo $MY_ID
จะต้องใช้สิ่งนี้ใน makefile
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
หวังว่าจะช่วยใครซักคน โดยทั่วไปแล้วเราควรหลีกเลี่ยงการทำงานจริง ๆ นอกสูตรเพราะถ้ามีคนใช้ makefile พร้อมตัวเลือก '--dry-run' เพื่อดูว่ามันจะทำอะไรเท่านั้นมันจะไม่มีผลข้างเคียงใด ๆ การ$(shell)
โทรทุกครั้งจะถูกประเมินในเวลารวบรวมและงานจริงบางอย่างอาจเกิดขึ้นโดยไม่ตั้งใจ ดีกว่าที่จะออกจากงานจริงเช่นการสร้างรหัสไปยังด้านในของสูตรเมื่อเป็นไปได้