Suprimir eco de chamada de comando no makefile?


147

Eu escrevi um programa para uma tarefa que deveria imprimir sua saída em stdout. A especificação de atribuição requer a criação de um Makefile que, quando invocado, make run > outputFiledeve executar o programa e gravar a saída em um arquivo, com uma impressão digital SHA1 idêntica à fornecida na especificação.

Meu problema é que meu makefile:

...
run:
     java myprogram

também imprime o comando que executa o meu programa (por exemplo, java myprogram) no arquivo de saída, para que meu arquivo inclua essa linha extra, causando a impressão digital incorreta.

Existe alguma maneira de executar um comando sem a chamada de comando ecoar na linha de comando?

Respostas:


247

Adicione @ao início do comando para informar ao gmake para não imprimir o comando que está sendo executado. Como isso:

run:
     @java myprogram

Como Oli sugeriu, esse é um recurso do Make e não do Bash.

Por outro lado, o Bash nunca fará eco dos comandos que estão sendo executados, a menos que você o faça explicitamente (por exemplo, com a -xopção).


6
+1. Mas apenas para esclarecer a confusão do OP, talvez valha a pena esclarecer que esse é um recurso do Make, não do Bash.
26768 Oliver Oliverworth

1
@ OliCharlesworth: faz sentido, acrescentou isso. Obrigado.

Existe uma maneira de desativar todos os ecos? Ou desativá-lo para uma seção e voltar mais tarde?
Benubird

2
@Benubird make -sfaz isso, e IMHO é uma solução muito melhor aqui de qualquer maneira. Foi postado recentemente como uma resposta separada para esta pergunta.
Tripleee

1
Isso não funciona para um se ... então declaração :( alguma idéia?
user1623521

74

Ainda mais simples, use make -s(modo silencioso)!


3
Voto a favor: Essa deve realmente ser a resposta aceita aqui. A pulverização de seu Makefile com @comandos dificulta a depuração e adiciona muita confusão.
Tripleee

11
Concordo que este é o caminho a percorrer - mas observe que, na descrição original do problema, não seria eu quem invocaria o meu instrutor. Portanto, eu não teria controle sobre os sinalizadores transmitidos. Eu precisava controlar a saída de dentro do makefile. Upvote para a solução mais prática no mundo real.
noobler

6
Você pode controlar isso sozinho, usando o .SILENT:alvo. Veja make.mad-scientist.net/managing-recipe-echoing
MadScientist

Na verdade, se você tiver avisos como -Wallele ainda os imprime. Claro, por que você usaria -sse também deseja ver avisos?
User81862311

33

Você também pode usar .SILENT

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

Nesse caso, make hio comando make runresultará , mas não será gerado.


1

O efeito de preceder o comando com um @pode ser estendido para uma seção estendendo o comando usando uma barra invertida à direita na linha. Se um .PHONYcomando é desejado para suprimir a saída, pode-se iniciar a seção com:

@printf "..."
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.