/bin/sh
อาจจะเป็นbash
ในระบบของคุณ แต่เมื่อเรียกว่าเป็นsh
, bash
จะทำงานในโหมด POSIX (เช่นถ้าPOSIXLY_CORRECT
ถูกกำหนดหรือมันเริ่มต้นด้วย--posix
)
ในโหมดนี้การทดแทนกระบวนการไม่มีอยู่
Solutions:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
ทางเลือก:
all:
bash -c "diff <(command1) <(command2)"
หรือเพียงแค่กำหนดตัวแปร Makefile SHELL
เป็น/bin/bash
:
SHELL=/bin/bash
ถ้าคุณต้องการพกพาไปด้วยวิธีแรก หากคุณตกลงกับการพึ่งพาbash
ให้เลือกที่สอง หากคุณไม่จำเป็นต้องสนใจเกี่ยวกับmake
การใช้งานที่ไม่ใช่ของ GNU ให้ใช้ส่วนที่สาม
การตั้งค่าเกี่ยวกับSHELL
: มาตรฐาน POSIX กล่าวว่า executables ใน Makefiles ควรจะเรียกด้วยsystem()
ฟังก์ชั่นห้องสมุด C make
โดย ฟังก์ชั่นนี้ไม่รับประกันว่าจะใช้SHELL
ตัวแปรสภาพแวดล้อม (อันที่จริงแล้วการทำเช่นนั้นถูกทำให้หมดกำลังใจโดยมาตรฐาน) มาตรฐานยังไปกับความยาวบางส่วนที่จะบอกว่าการตั้งค่าตัวแปร Makefile SHELL
ไม่ควรส่งผลกระทบต่อตัวแปรสภาพแวดล้อม SHELL
ในการใช้งานส่วนใหญ่ของmake
ที่ฉันรู้ แต่ตัวแปร Makefile SHELL
จะถูกใช้ในการดำเนินการคำสั่ง
คำแนะนำในRationale สำหรับmake
ยูทิลิตี้คือการใช้bash -c
:
MAKESHELL
คุณลักษณะประวัติและคุณลักษณะที่เกี่ยวข้องที่จัดเตรียมโดยmake
การนำไปใช้งานอื่นถูกละเว้น ในการใช้งานบางอย่างมันถูกใช้เพื่อให้ผู้ใช้แทนที่เชลล์ที่จะใช้ในการเรียกใช้make
คำสั่ง นี่คือความสับสน; สำหรับพกพาmake
เชลล์ควรเลือกโดยผู้เขียน makefile เพิ่มเติมตัวเขียน makefile ไม่สามารถต้องการเชลล์สำรองที่จะใช้และยังคงพิจารณา makefile portable ในขณะที่มันเป็นไปได้ที่จะสร้างมาตรฐานกลไกสำหรับการระบุเชลล์สำรองการใช้งานที่มีอยู่ไม่เห็นด้วยกับกลไกดังกล่าวและผู้เขียน makefile สามารถเรียกเชลล์สำรองแล้วโดยระบุชื่อเชลล์ในกฎสำหรับเป้าหมาย; ตัวอย่างเช่น:
python -c "foo"
bash
ใน Makefile หรือวิธีแก้ไขปัญหาอื่น ๆ ของ diff โดยไม่ต้องใช้ไฟล์ชั่วคราวหรือไม่?