จริงๆแล้วมันกำลังดำเนินการคำสั่งเปลี่ยนไดเรกทอรีเป็นsome_directory
อย่างไรก็ตามสิ่งนี้จะดำเนินการในเปลือกกระบวนการย่อยและส่งผลกระทบต่อทั้งไม่สร้างหรือเปลือกที่คุณกำลังทำงานจาก
หากคุณต้องการทำงานภายในเพิ่มเติมsome_directory
คุณต้องเพิ่มเซมิโคลอนและต่อท้ายคำสั่งอื่นเช่นกัน โปรดทราบว่าคุณไม่สามารถใช้การขึ้นบรรทัดใหม่ได้เนื่องจากถูกตีความโดย make เป็นจุดสิ้นสุดของกฎดังนั้นการขึ้นบรรทัดใหม่ใด ๆ ที่คุณใช้เพื่อความชัดเจนจะต้องถูก backslash
ตัวอย่างเช่น:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
โปรดทราบว่าเครื่องหมายอัฒภาคจำเป็นระหว่างทุกคำสั่งแม้ว่าคุณจะเพิ่มแบ็กสแลชและบรรทัดใหม่ นี่เป็นเพราะข้อเท็จจริงที่ว่าสตริงทั้งหมดถูกวิเคราะห์คำเป็นบรรทัดเดียวโดยเชลล์ ตามที่ระบุไว้ในความคิดเห็นคุณควรใช้ '&&' เพื่อเข้าร่วมคำสั่งซึ่งหมายความว่าพวกเขาจะได้รับการดำเนินการหากคำสั่งก่อนหน้านี้ประสบความสำเร็จ
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
สิ่งนี้มีความสำคัญอย่างยิ่งเมื่อทำการทำลายเช่นล้างข้อมูลในขณะที่คุณจะทำลายสิ่งที่ไม่ถูกต้องหากcd
ล้มเหลวด้วยเหตุผลใดก็ตาม
การใช้งานทั่วไปที่เรียกว่าสร้างในไดเรกทอรีย่อยซึ่งคุณอาจต้องการตรวจสอบ มีตัวเลือกบรรทัดคำสั่งสำหรับสิ่งนี้เพื่อให้คุณไม่ต้องเรียกcd
ตัวเองดังนั้นกฎของคุณจะมีลักษณะเช่นนี้
all:
$(MAKE) -C some_dir all
ซึ่งจะเปลี่ยนเป็นsome_dir
และดำเนินการMakefile
กับเป้าหมาย "ทั้งหมด" ตามแนวทางปฏิบัติที่ดีที่สุดให้ใช้$(MAKE)
แทนการโทรmake
โดยตรงเนื่องจากมันจะโทรหาอินสแตนซ์ที่ถูกต้อง (เช่นคุณใช้เวอร์ชัน make พิเศษสำหรับสภาพแวดล้อมการสร้างของคุณ) รวมถึงพฤติกรรมที่แตกต่างกันเล็กน้อยเมื่อทำงาน -t
โดยใช้สวิทช์บางอย่างเช่น
สำหรับบันทึกที่ทำให้เสมอสะท้อนคำสั่งจะรัน (ยกเว้นกรณีการปราบปรามอย่างชัดเจน) แม้ว่าจะมีการส่งออกไม่ซึ่งคือสิ่งที่คุณเห็นกำลัง
make
ฉันฉันไม่เคยต้องการเปลี่ยนไดเรกทอรีเช่นนี้ บางทีคุณควรลองวิธีอื่นในการแก้ปัญหาของคุณ?