Придушити відлуння виклику команд у makefile?


147

Я написав програму для завдання, яка повинна надрукувати вихід на stdout. Специфікація присвоєння вимагає створення Makefile, який при виклику як make run > outputFileслід запускає програму і записує висновок у файл, у якого відбиток SHA1, ідентичний тому, який заданий у специфікації.

Моя проблема полягає в тому, що мій makefile:

...
run:
     java myprogram

також друкує команду, яка запускає мою програму (наприклад, java myprogram) у вихідний файл, так що мій файл містить цю додаткову рядок, що спричиняє неправильність відбитка пальця.

Чи є спосіб виконати команду без виклику команди, що лунає в командному рядку?

Відповіді:


247

Додайте @до початку команди, щоб сказати gmake не друкувати виконувану команду. Подобається це:

run:
     @java myprogram

Як запропонував Олі, це особливість Маке, а не Баша.

З іншого боку, Bash ніколи не повторюватиме виконання команд, якщо ви не скажете це зробити це явно (тобто з -xопцією).


6
+1. Але просто для усунення плутанини ОП, можливо, варто уточнити, що це особливість Маке, а не Баша.
Олівер Чарльворт

1
@OliCharlesworth: має сенс, додав це. Дякую.

Чи є спосіб відключити всі відгомони? Або вимкнути його для розділу та знову пізніше?
Benubird

2
@Benubird make -sце робить, і IMHO - це набагато краще рішення тут. Нещодавно він був опублікований як окрема відповідь на це питання.
трійка

1
це не працює для if ... тоді заява :( будь-які ідеї?
user1623521

74

Ще простіше, користуйтеся make -s(безшумний режим)!


3
Висновок: Тут справді має бути прийнята відповідь. Посипання Makefile @командами ускладнює налагодження і додає багато безладу.
трійка

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 "..."
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.