Make: como continuar após um comando falhar?

143

O comando $ make allfornece erros como rm: cannot remove '.lambda': No such file or directorypara que pare. Quero que ele ignore os erros rm-não-encontrados. Como posso fazer força?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex
hhh
fonte

Respostas:

264

Experimente a -ibandeira (ou --ignore-errors). A documentação parece sugerir uma maneira mais robusta de conseguir isso, a propósito:

Para ignorar erros em uma linha de comando, escreva um -no início do texto da linha (após a guia inicial). O -é descartado antes que o comando seja passado para o shell para execução.

Por exemplo,

clean:
  -rm -f *.o

Isso faz rmcom que continue mesmo se não for possível remover um arquivo.

Todos os exemplos estão com rm, mas são aplicáveis ​​a qualquer outro comando do qual você precisa ignorar erros de (ie mkdir).

Eli Bendersky
fonte
30
Não faça isso! Você não deve ignorar erros. Basta adicionar o sinalizador -f à rm e ele não mais falhará ao tentar excluir arquivos que não existem. No entanto, ele ainda retornará e erro se realmente não excluir um arquivo. Esse é o comportamento que você deseja, falha quando há um problema!
Kristof Provost
15
@Kristof Provost concordou. rm -fé melhor para o problema específico que o usuário está enfrentando, mas ainda é bom saber sobre a solução geral, mesmo que algumas vezes não seja segura.
Brian_o 4/09/15
1
Isso é realmente útil, Eli. Obrigado.
Dr Beco
1
Make também fornece $(RM), que você pode usar em vez de rm -f.
Reitermarkus 18/02/19
32

make -k(ou --keep-goingno gnumake) fará o que você está pedindo, eu acho.

Você realmente deve encontrar a linha del ou rm que está falhando e adicionar uma -fpara impedir que esse erro aconteça com outras pessoas.

TED
fonte
1
Eu não queria dizer nada, mas estava me perguntando qual era o pensamento deles. Se houver algum motivo para que eu não entenda por que essa bandeira não seria apropriada, seria uma boa ideia apresentar.
TED
3
Você não deve ignorar erros. A solução proposta por Brian, Oded e NebuSoft está correta. Esta e a resposta aceita estão erradas.
Kristof Provost
1
@KristofProvost - Ah. Justo, eu acho. Geralmente, também acredito que as respostas que chegam à raiz do problema são superiores às respostas (como esta) que respondem meramente à pergunta. Não tenho certeza se eu votaria contra alguém por isso, mas traços diferentes ...
TED
5
Boa resposta. Ele contém um sinalizador direto e de nível superior que nenhuma outra resposta contém, mas ainda recomenda o comportamento correto. Os erros não devem ser ignorados, mas é bom conhecer as opções.
brian_o
1
Algo útil a se fazer é ignorar os erros do compilador ... o que permite makecriar o maior número possível de unidades de compilação enquanto você corrige o que o compilador tiver usado. Dessa forma, quando você conserta o que foi quebrado, não precisa esperar que todo o resto seja construído também.
Inetknght
20

Mude limpo para

rm -f .lambda .lambda_t .activity .activity_t_lambda

Ou seja, não solicite a remoção; não reclame se o arquivo não existir.

Brian Carlton
fonte
16

Retorne com sucesso, bloqueando rmo código de retorno atrás de um canal com o truecomando, que sempre retorna 0(sucesso)

rm file | true
Bryce Guinta
fonte
11

Para fazer com que o make realmente ignore erros em uma única linha, você pode simplesmente sufixá-lo ; true, definindo o valor de retorno como 0. Por exemplo:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

Isso redirecionará a saída stderr para null e seguirá o comando com true (que sempre retorna 0, fazendo com que o comando acredite que o comando foi bem-sucedido independentemente do que realmente aconteceu), permitindo que o fluxo do programa continue.

Tumulto
fonte
1
Isso funciona para mim onde o hífen não (estou dado um makefile para executar um teste que precisa de falhar, e irá analisar os logs mais tarde)
Sean Houlihane
2

Mude o seu cleanpara rmnão reclamar:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
Oded
fonte
1

Coloque uma -fopção em seu rmcomando.

rm -f .lambda .lambda_t .activity .activity_t_lambda
NebuSoft
fonte