Sopprime l'eco dell'invocazione dei comandi in makefile?


147

Ho scritto un programma per un compito che dovrebbe stampare il suo output su stdout. Le specifiche di assegnazione richiedono la creazione di un Makefile che quando viene invocato comemake run > outputFile dovrebbe eseguire il programma e scrivere l'output in un file, che ha un'impronta digitale SHA1 identica a quella fornita nella specifica.

Il mio problema è che il mio makefile:

...
run:
     java myprogram

stampa anche il comando che esegue il mio programma (ad es. java myprogram) sul file di output, in modo che il mio file includa questa riga aggiuntiva causando errori nell'impronta digitale.

Esiste un modo per eseguire un comando senza che l'invocazione del comando risuoni nella riga di comando?

Risposte:


247

Aggiungi @all'inizio del comando per dire a gmake di non stampare il comando in esecuzione. Come questo:

run:
     @java myprogram

Come ha suggerito Oli, questa è una caratteristica di Make e non di Bash.

D'altra parte, Bash non farà mai eco ai comandi eseguiti a meno che tu non gli dica di farlo esplicitamente (cioè con l' -xopzione).


6
+1. Ma solo per chiarire la confusione dell'OP, forse vale la pena chiarire che questa è una caratteristica di Make, non di Bash.
Oliver Charlesworth,

1
@OliCharlesworth: ha senso, ha aggiunto quello. Grazie.

C'è un modo per disabilitare tutti gli echi? O di spegnerlo per una sezione e riaccenderlo più tardi?
Benubird,

2
@Benubird lo make -sfa e IMHO è comunque una soluzione molto migliore qui. È stato recentemente pubblicato come risposta separata a questa domanda.
tripla il

1
questo non funziona per un'istruzione if ... then :( qualche idea?
user1623521

74

Ancora più semplice, usa make -s(modalità silenziosa)!


3
Upvote: questa dovrebbe davvero essere la risposta accettata qui. Spruzzare il tuo Makefile con i @comandi rende difficile il debug e aggiunge un sacco di disordine.
tripla il

11
Sono d'accordo che questa sia la strada da percorrere - ma noto, nella descrizione del problema originale, non sarei quello che invoca la marca - sarebbe il mio istruttore. Pertanto, non avrei alcun controllo sui flag passati. Avevo bisogno di controllare l'output dal makefile. Considerare la soluzione più pratica nel mondo reale però.
Noobler,

6
Puoi controllarlo tu stesso, usando l' .SILENT:obiettivo. Vedi make.mad-scientist.net/managing-recipe-echoing
MadScientist

In realtà se hai degli avvertimenti come -Wallse li stesse ancora stampando. Naturalmente perché dovresti usare anche -stu se vuoi vedere gli avvisi?
Utente 81862311

33

Puoi anche usare .SILENT

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

In questo caso, make hiverrà emesso il comando, ma make runnon verrà emesso.


1

L'effetto di precedere il comando con un @può essere esteso a una sezione estendendo il comando usando una barra rovesciata finale sulla linea. Se .PHONYsi desidera un comando per sopprimere l'output, è possibile iniziare la sezione con:

@printf "..."
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.