Loại bỏ tiếng vang của lệnh gọi trong makefile?


147

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ó ra thiết bị xuất chuẩn. Thông số kỹ thuật gán yêu cầu tạo Makefile mà khi được gọi make run > outputFilesẽ chạy chương trình và ghi đầu ra vào một tệp có dấu vân tay SHA1 giống hệt với dấu vân tay được cung cấp trong thông số kỹ thuật.

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

...
run:
     java myprogram

cũng in lệnh chạy chương trình của tôi (ví dụ java myprogram) sang tệp đầu ra, để tệp của tôi bao gồm dòng bổ sung này khiến dấu vân tay bị sai.

Có cách nào để thực thi một lệnh mà không có lệnh gọi vang vọng đến dòng lệnh không?

Câu trả lời:


247

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

run:
     @java myprogram

Như Oli đề xuất, đây là một tính năng của Make chứ không phải 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 bảo nó làm như vậy một cách rõ ràng (tức là với -xtùy chọn).


6
+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.
Oliver Charlesworth

1
@OliCharlesworth: có ý nghĩa, thêm vào đó. Cảm ơn.

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

2
@Benubird make -slàm điều đó, và IMHO là một giải pháp tốt hơn nhiều ở đây. Nó gần đây đã được đăng dưới dạng một câu trả lời riêng cho câu hỏi này.
tripleee 17/2/2016

1
điều này không hoạt động nếu ... sau đó tuyên bố :( có ý tưởng nào không?
user1623521

74

Thậm chí đơn giản hơn, sử dụng make -s(chế độ im lặng)!


3
Upvote: Đây thực sự nên là câu trả lời được chấp nhận ở đây. Rắc Makefile của bạn bằng @các lệnh làm cho nó khó gỡ lỗi và thêm rất nhiều lộn xộn.
tripleee

11
Tôi đồng ý rằng đây là cách để đi - nhưng chú ý, trong phần mô tả vấn đề ban đầu, tôi sẽ không phải là người thực hiện - người hướng dẫn của tôi sẽ là. Vì vậy, tôi sẽ không kiểm soát được các cờ được truyền vào. Tôi cần kiểm soát đầu ra từ bên trong tệp thực hiện. Upvote cho hầu hết các giải pháp thực tế trong thế giới thực.
noobler 17/2/2016

6
Bạn có thể tự kiểm soát điều này, sử dụng .SILENT:mục tiêu. Xem make.mad-scientist.net/managing-recipe-echaging
MadSellectist

Trên thực tế nếu bạn có cảnh báo như -Wallnó vẫn in chúng. Tất nhiên tại sao bạn sẽ sử dụng -snếu bạn muốn xem cảnh báo quá?
Người dùng81862311

33

Bạn cũng có thể dùng .SILENT

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

Trong trường hợp này, make hisẽ xuất lệnh, nhưng make runsẽ không xuất ra.


1

Hiệu ứng của lệnh trước với một @có thể được mở rộng đến một phần bằng cách mở rộng lệnh bằng cách sử dụng dấu gạch chéo ngược trên dòng. Nếu một .PHONYlệnh được mong muốn để chặn đầu ra, người ta có thể bắt đầu phần bằng:

@printf "..."
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.