Na seção limpa do meu Makefile
, estou tentando verificar se o arquivo existe antes de excluir permanentemente. Eu uso esse código, mas recebo erros.
O que há de errado com isso?
if [ -a myApp ]
then
rm myApp
fi
Recebo esta mensagem de erro
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
pode ser uma alternativa. Ou precedendo o comando com um dash (-rm myApp
) para fazer make ignorar o erro da rm (no entanto, imprimirá uma mensagem feia).Respostas:
A segunda resposta principal menciona
ifeq
, no entanto, não menciona que eles devem estar no mesmo nível do nome do destino, por exemplo, para baixar um arquivo apenas se ele não existir atualmente, o seguinte código pode ser usado:fonte
É estranho ver tantas pessoas usando scripts de shell para isso. Eu estava procurando uma maneira de usar a sintaxe nativa do makefile, porque estou escrevendo isso fora de qualquer destino. Você pode usar a
wildcard
função para verificar se o arquivo existe:Atualizar:
Eu encontrei uma maneira que realmente está funcionando para mim:
fonte
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
realmente faz. Veja o link .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
O problema é quando você divide seu comando em várias linhas. Portanto, você pode usar o
\
no final das linhas para continuação como acima ou pode obter tudo em uma linha com o&&
operador no bash.Então você pode usar um
test
comando para testar se o arquivo existe, por exemplo:ou não:
o
test
é equivalente ao[
comando.e funcionaria como no seu exemplo original.
Veja:
help [
ouhelp test
para mais sintaxe.fonte
-s
é um caso especialexists and has a size greater than zero
. A pergunta, como está escrita, é independente do tamanho, portanto a existência deve ser verificada usandotest -e
-se um arquivo ou-d
um diretório. Arquivos vazios podem ser especialmente úteis como (por falta de um termo melhor) indicadores / sentinelas, o que pode ser bastante relevante paramake
.-f
por padrão, pois é mais comum de usar.test
Windows?|| true
no final, para que o comando retorne verdadeiro quando o arquivo não existir.test -f myApp || CMD
, observe o||
, então se-f
falhar - não existe (||
), execute o comando. Isso faz sentido?Pode ser necessária uma barra invertida no final da linha para continuação (embora talvez isso dependa da versão do make):
fonte
make
uma nova linha seria um novo comando bash. A principal ressalva disso, além do incômodo de ter muitos\
no final das linhas, é que todo comando deve ser encerrado com o;
que de outra forma estaria implícito no bash.Ou apenas coloque-o em uma linha, como
make
quiser:fonte
Faltando um ponto e vírgula
No entanto, suponho que você esteja verificando a existência antes da exclusão para evitar uma mensagem de erro. Nesse caso, você pode simplesmente usar
rm -f myApp
quais "forças" serão excluídas, ou seja, não haverá erro se o arquivo não existir.fonte
resultados de execução:
fonte
echo -n yes
o sucesso detest
na stringyes
sem NL. Oifeq
pode então compará-lo com o codificadoyes
. Tudo porqueifeq
deseja comparar uma string, não um status de sucesso de um comando shell.Solução de uma linha:
Solução de uma linha com ação de erro:
Exemplo usado nas minhas
make clean
diretivas:E
make clean
sempre funciona sem nenhuma mensagem de erro!fonte
-rm myfile
a indicação do traço principal leva a ignorar qualquer erro.@[ -f 'myfile' ] && rm myfile
"Se o README.md não existir, não faça nada (e saia com sucesso). Caso contrário, adicione o texto no final."
Se você usar em
&&
vez de||
, gera um erro quando o arquivo não existe:fonte
Eu estava tentando:
E o caso positivo funcionou, mas meu ubuntu bash shell chama isso de VERDADEIRO e quebra na cópia:
Depois de obter esse erro, pesquiso no Google como verificar se existe um arquivo no make, e esta é a resposta ...
fonte
Esta solução postada acima funciona melhor. Mas certifique-se de não especificar a atribuição PATH_TO_FILE. Por exemplo,
Deve ser
fonte
Respostas como a de @ mark-wilkins usando \ para continuar linhas e; finalizá-los no shell ou como os do @kenorb alterá-los para uma linha são bons e resolverão esse problema.
há uma resposta mais simples para o problema original (como @ alexey-polonsky apontou). Use o sinalizador -f para rm para que ele não acione um erro
isso é mais simples, mais rápido e mais confiável. Apenas tome cuidado para não acabar com uma barra e uma variável vazia
rm -f / $ (myAppPath)#Nunca faça issovocê pode acabar excluindo seu sistema.
fonte
rm
; BTW, eu tenho certeza que issorm -f /$(myAppPath)
também não causará danos, porque/
é um diretório e-r
está faltando.rm -f
, por exemplo, eles podem quererrm
uma variável.