ด้วย:
FILES = $(shell ls)
เยื้องใต้all
แบบนั้นมันเป็นคำสั่งสร้าง ดังนั้นการขยายตัวนี้แล้วพยายามที่จะเรียกใช้คำสั่ง$(shell ls)
FILES ...
หากFILES
ควรเป็นmake
ตัวแปรต้องกำหนดตัวแปรเหล่านี้นอกส่วนของสูตรอาหารเช่น:
FILES = $(shell ls)
all:
echo $(FILES)
แน่นอนว่านั่นหมายความว่าFILES
จะถูกตั้งค่าเป็น "เอาต์พุตจากls
" ก่อนที่จะรันคำสั่งใด ๆ ที่สร้างไฟล์. tgz (แม้ว่าในขณะที่Kaz ตั้งข้อสังเกตว่าตัวแปรจะถูกขยายใหม่ทุกครั้งดังนั้นในที่สุดก็จะรวมไฟล์. tgz บางตัวทำให้ตัวแปรต้องFILES := ...
หลีกเลี่ยงสิ่งนี้เพื่อประสิทธิภาพและ / หรือความถูกต้อง1 )
หากFILES
ควรเป็นตัวแปรเชลล์คุณสามารถตั้งค่าได้ แต่ต้องทำในเชลล์เอสโดยไม่เว้นวรรคและยกมา:
all:
FILES="$(shell ls)"
อย่างไรก็ตามแต่ละบรรทัดถูกเรียกใช้โดยเชลล์ที่แยกจากกันดังนั้นตัวแปรนี้จะไม่อยู่รอดในบรรทัดถัดไปดังนั้นคุณต้องใช้มันทันที:
FILES="$(shell ls)"; echo $$FILES
ทั้งหมดนี้เป็นเรื่องงี่เง่าเล็กน้อยเนื่องจากเชลล์จะขยาย*
(และนิพจน์เชลล์ลูกโลกอื่น ๆ ) ให้คุณในตอนแรกดังนั้นคุณสามารถ:
echo *
เป็นคำสั่งเชลล์ของคุณ
สุดท้ายตามกฎทั่วไป (ใช้ไม่ได้กับตัวอย่างนี้): ตามที่esperantoบันทึกไว้ในความคิดเห็นการใช้เอาต์พุตจากls
ไม่น่าเชื่อถืออย่างสมบูรณ์ (รายละเอียดบางอย่างขึ้นอยู่กับชื่อไฟล์และบางครั้งแม้แต่เวอร์ชันของls
บางเวอร์ชันls
พยายามล้างเอาต์พุต ในบางกรณี). ดังนั้นในฐานะที่เป็นl0b0และidelic note หากคุณใช้ GNU ทำให้คุณสามารถใช้$(wildcard)
และ$(subst ...)
ทำทุกอย่างภายในmake
ตัวเองให้สำเร็จ(หลีกเลี่ยงปัญหา "อักขระแปลก ๆ ในชื่อไฟล์") (ในsh
สคริปต์รวมถึงส่วนสูตรของ makefiles อีกวิธีหนึ่งคือใช้find ... -print0 | xargs -0
เพื่อหลีกเลี่ยงการสะดุดบนช่องว่างบรรทัดใหม่อักขระควบคุมและอื่น ๆ )
1 ลิขสิทธิ์ GNU บันทึกเอกสารยี่ห้อต่อไปว่า POSIX ทำให้เพิ่ม::=
การกำหนดในปี 2012 ฉันไม่พบลิงก์อ้างอิงด่วนไปยังเอกสาร POSIX สำหรับสิ่งนี้และฉันไม่รู้ว่าตัวเลือกใดบ้างที่make
รองรับการ::=
มอบหมายงานแม้ว่า GNU จะทำในวันนี้ แต่ก็มีความหมายเดียวกัน:=
คือทำการมอบหมายทันทีด้วยการขยาย
โปรดทราบว่าVAR := $(shell command args...)
สามารถสะกดได้VAR != command args...
หลายmake
รูปแบบรวมถึงรูปแบบ GNU และ BSD ที่ทันสมัยทั้งหมดเท่าที่ฉันรู้ สายพันธุ์อื่น ๆ เหล่านี้ไม่มี$(shell)
ดังนั้นการใช้งานVAR != command args...
จึงดีกว่าทั้งในด้านที่สั้นกว่าและทำงานในตัวแปรอื่น ๆ
ls
ด้วยsed
และตัด) จากนั้นใช้ผลลัพธ์ใน rsync และคำสั่งอื่น ๆ ฉันต้องพูดคำสั่งยาว ๆ ซ้ำแล้วซ้ำเล่า? ฉันไม่สามารถเก็บผลลัพธ์ไว้ในตัวแปร Make ภายในได้หรือไม่?