Usunąć echo wywołania polecenia w makefile?


147

Napisałem program do przydziału, który ma wypisywać swoje wyjście na standardowe wyjście. Specyfikacja przypisania wymaga stworzenia pliku Makefile, który po wywołaniu make run > outputFilepowinien uruchomić program i zapisać dane wyjściowe do pliku, który ma odcisk palca SHA1 identyczny z podanym w specyfikacji.

Mój problem polega na tym, że mój plik makefile:

...
run:
     java myprogram

wypisuje również polecenie, które uruchamia mój program (np. java myprogram) do pliku wyjściowego, tak że mój plik zawiera tę dodatkową linię powodującą nieprawidłowy odcisk palca.

Czy istnieje sposób na wykonanie polecenia bez wywołania polecenia w wierszu poleceń?

Odpowiedzi:


247

Dodaj @na początku polecenia, aby gmake nie drukował wykonywanego polecenia. Lubię to:

run:
     @java myprogram

Jak zasugerował Oli, jest to funkcja Make, a nie Bash.

Z drugiej strony, Bash nigdy nie będzie powtarzał poleceń wykonywanych, chyba że powiesz mu to wprost (np. Z -xopcją).


6
+1. Ale żeby wyjaśnić zamieszanie w PO, być może warto wyjaśnić, że jest to funkcja Make, a nie Bash.
Oliver Charlesworth

1
@OliCharlesworth: ma sens, dodał. Dzięki.

Czy istnieje sposób na wyłączenie wszystkich ech? Albo o wyłączeniu go dla sekcji i ponownym włączeniu później?
Benubird

2
@Benubird to make -srobi, a IMHO i tak jest tutaj znacznie lepszym rozwiązaniem. Niedawno została opublikowana jako osobna odpowiedź na to pytanie.
tripleee

1
to nie działa w przypadku instrukcji if ... then :( jakieś pomysły?
user1623521

74

Jeszcze prostsze, użyj make -s(tryb cichy)!


3
Głos za: To naprawdę powinna być tutaj akceptowana odpowiedź. Rozpryskiwanie pliku Makefile @poleceniami utrudnia debugowanie i dodaje wiele bałaganu.
tripleee

11
Zgadzam się, że to jest droga - ale zauważ, że w pierwotnym opisie problemu nie byłbym tym, który powołuje się na make - mój instruktor tak. W ten sposób nie miałbym żadnej kontroli nad przekazywanymi flagami. Musiałem kontrolować wyjście z pliku makefile. Głosuj za najbardziej praktycznym rozwiązaniem w prawdziwym świecie.
noobler

6
Możesz to kontrolować samodzielnie, używając .SILENT:celu. Zobacz make.mad-scientist.net/managing-recipe-echoing
MadScientist

Właściwie, jeśli masz ostrzeżenia -Wall, nadal je drukuje. Oczywiście, dlaczego miałbyś używać, -sjeśli chcesz również widzieć ostrzeżenia?
User81862311

33

Możesz także użyć .SILENT

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

W takim przypadku make hiwypisze polecenie, ale make runnie wyświetli.


1

Efekt poprzedzenia polecenia @znakiem można rozszerzyć na sekcję, rozszerzając polecenie za pomocą końcowego ukośnika odwrotnego w wierszu. Jeśli .PHONYpożądane jest polecenie wstrzymania wyjścia, można rozpocząć sekcję od:

@printf "..."
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.