ไม่แสดงการเรียกใช้คำสั่งใน makefile หรือไม่


147

ฉันเขียนโปรแกรมสำหรับการมอบหมายซึ่งควรจะพิมพ์เอาต์พุตไปยัง stdout ข้อมูลจำเพาะที่ได้รับมอบหมายต้องมีการสร้าง Makefile ซึ่งเมื่อเรียกใช้ตามที่make run > outputFileควรเรียกใช้โปรแกรมและเขียนผลลัพธ์ไปยังไฟล์ซึ่งมีลายนิ้วมือ SHA1 ซึ่งเหมือนกับลายนิ้วมือที่ได้รับในข้อมูลจำเพาะ

ปัญหาของฉันคือ makefile ของฉัน:

...
run:
     java myprogram

พิมพ์คำสั่งที่รันโปรแกรมของฉัน (เช่น java myprogram) ไปยังไฟล์เอาต์พุตเพื่อให้ไฟล์ของฉันมีบรรทัดพิเศษนี้ทำให้ลายนิ้วมือผิด

มีวิธีการดำเนินการคำสั่งใด ๆ โดยไม่ต้องคำสั่งภาวนาสะท้อนไปยังบรรทัดคำสั่งหรือไม่

คำตอบ:


247

เพิ่ม@ไปยังจุดเริ่มต้นของคำสั่งเพื่อแจ้งให้ gmake ไม่พิมพ์คำสั่งที่กำลังดำเนินการ แบบนี้:

run:
     @java myprogram

ตามที่ Oli แนะนำนี่เป็นคุณสมบัติของ Make และไม่ใช่ของ Bash

ในทางกลับกัน Bash จะไม่มีคำสั่ง echo ที่ถูกดำเนินการจนกว่าคุณจะบอกให้ทำอย่างชัดเจน (เช่นมี-xตัวเลือก)


6
+1 แต่เพียงเพื่อขจัดความสับสนของ OP มันอาจคุ้มค่าที่จะอธิบายว่านี่เป็นคุณสมบัติของ Make ไม่ใช่ของ Bash
Oliver Charlesworth

1
@OliCharlesworth: เข้าท่าเข้ามาเสริมว่า ขอบคุณ

มีวิธีปิด echos ทั้งหมดหรือไม่ หรือปิดมันสำหรับส่วนและกลับมาใหม่ในภายหลัง?
Benubird

2
@ Benubird make -sทำเช่นนั้นและ IMHO เป็นทางออกที่ดีกว่ามากที่นี่ต่อไป มันเพิ่งโพสต์เป็นคำตอบแยกต่างหากสำหรับคำถามนี้
tripleee

1
สิ่งนี้ใช้ไม่ได้กับ if ... ถ้าอย่างนั้น statement :( ความคิดเห็นใด ๆ ?
user1623521

74

ง่ายยิ่งขึ้นใช้make -s(โหมดเงียบ)!


3
Upvote: นี่ควรเป็นคำตอบที่ยอมรับได้จริงที่นี่ การโรย Makefile ของคุณด้วย@คำสั่งทำให้การดีบักและเพิ่มความยุ่งเหยิงได้ยาก
tripleee

11
ฉันยอมรับว่านี่เป็นวิธีที่จะไป - แต่สังเกตเห็นว่าในคำอธิบายปัญหาดั้งเดิมฉันจะไม่เป็นคนที่ทำให้เกิดการสอน - อาจารย์ของฉันจะเป็น ดังนั้นฉันจะไม่สามารถควบคุมค่าสถานะที่ส่งผ่านมาได้ฉันต้องการควบคุมผลลัพธ์จากภายใน makefile โหวตขึ้นสำหรับทางออกที่เป็นประโยชน์มากที่สุดในโลกแห่งความจริงแม้ว่า
noobler

6
คุณสามารถควบคุมสิ่งนี้ได้ด้วยตัวเองโดยใช้.SILENT:เป้าหมาย ดูmake.mad-scientist.net/managing-recipe-echoing
MadScientist

จริง ๆ แล้วถ้าคุณมีคำเตือนเหมือน-Wallมันจะพิมพ์ออกมา แน่นอนว่าทำไมคุณถึงใช้-sถ้าคุณต้องการเห็นคำเตือนด้วย?
User81862311

33

คุณยังสามารถใช้ .SILENT

.SILENT: run
hi:
     echo "Hola!"
run:
     java myprogram

ในกรณีนี้make hiจะออกคำสั่ง แต่make runจะไม่ส่งออก


1

ผลของการนำหน้าคำสั่งด้วย@สามารถขยายไปยังส่วนได้โดยการขยายคำสั่งโดยใช้เครื่องหมายแบ็กสแลชต่อท้ายบนบรรทัด หาก.PHONYต้องการคำสั่งเพื่อยับยั้งเอาต์พุตสามารถเริ่มต้นส่วนด้วย:

@printf "..."
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.