2012-04-01 12 views
61

Tôi đã viết một chương trình cho một nhiệm vụ được cho là để in đầu ra của nó để stdout. Đặc tả gán yêu cầu tạo một Makefile khi được gọi là make run > outputFile nên chạy chương trình và ghi đầu ra vào một tệp có một dấu vân tay SHA1 giống với dấu vân tay được đưa ra trong thông số.Ngăn chặn tiếng vọng của lệnh gọi trong makefile?

Vấn đề của tôi là makefile của tôi:

... 
run: 
    java myprogram 

cũng in các lệnh chạy chương trình của tôi (ví dụ java myprogram) đến tập tin đầu ra, do đó tập tin của tôi bao gồm dòng phụ này gây ra dấu vân tay là sai .

Có cách nào để thực hiện lệnh mà không có lệnh gọi lặp lại dòng lệnh không?

Trả lời

110

Thêm @ vào đầu lệnh để báo cho gmake không in lệnh đang được thực hiện. Như thế này:

run: 
    @java myprogram 

Như Oli đã đề xuất, đây là tính năng Tạo và không của Bash.

Mặt khác, Bash sẽ không bao giờ lặp lại các lệnh đang được thực thi trừ khi bạn yêu cầu nó thực hiện một cách rõ ràng (tức là với tùy chọn -x).

+3

+1. Nhưng chỉ để làm sáng tỏ sự nhầm lẫn của OP, có lẽ đáng làm rõ rằng đây là một tính năng của Make, không phải của Bash. –

+0

@OliCharlesworth: có ý nghĩa, bổ sung điều đó. Cảm ơn. –

+0

Có cách nào để vô hiệu hóa tất cả các tín hiệu không? Hoặc tắt nó đi cho một phần, và quay lại sau? – Benubird

0

Tác dụng của lệnh trước bằng @ có thể được mở rộng thành "phần" bằng cách mở rộng lệnh bằng dấu gạch chéo ngược trên dòng. Nếu lệnh giả mạo muốn loại bỏ đầu ra, người dùng có thể bắt đầu phần với @printf "" \

+1

Bạn có thể cho chúng tôi một ví dụ về mã không? – Dennis

25

Đơn giản hơn: make -s (chế độ im lặng)!

+0

Upvote: Đây thực sự là câu trả lời được chấp nhận ở đây. – tripleee

+4

Tôi đồng ý đây là con đường để đi - nhưng lưu ý, trong mô tả vấn đề ban đầu, tôi sẽ không phải là người gọi thực hiện - người hướng dẫn của tôi sẽ là như vậy. không kiểm soát được các lá cờ được truyền vào. Tôi cần kiểm soát đầu ra từ bên trong makefile .Lưu ý cho hầu hết các giải pháp thực tế trong thế giới thực. – noobler