En la sección limpia de mi Makefile
, estoy tratando de verificar si el archivo existe antes de eliminarlo permanentemente. Uso este código pero recibo errores.
¿Qué tiene de malo?
if [ -a myApp ]
then
rm myApp
fi
Me sale este mensaje de error
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
podría ser una alternativa. O precediendo el comando con un guión (-rm myApp
) para hacer que ignore el error de rm (sin embargo, imprimirá un mensaje feo).Respuestas:
La segunda respuesta principal menciona
ifeq
, sin embargo, no menciona que estos deben estar en el mismo nivel que el nombre del objetivo, por ejemplo, para descargar un archivo solo si actualmente no existe, se podría usar el siguiente código:fuente
Es extraño ver a tanta gente usando scripts de shell para esto. Estaba buscando una manera de usar la sintaxis nativa del archivo MAKE, porque estoy escribiendo esto fuera de cualquier objetivo. Puede usar la
wildcard
función para verificar si el archivo existe:Actualizar:
Encontré una forma que realmente funciona para mí:
fuente
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
realmente hace. Ver enlace .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
El problema es cuando divide su comando en varias líneas. Entonces, puedes usar el
\
al final de las líneas para continuar como se indica arriba o puede obtener todo en una línea con el&&
operador en bash.Luego puede usar un
test
comando para probar si el archivo existe, por ejemplo:o no:
El
test
es equivalente al[
comando.y funcionaría como en tu ejemplo original.
Ver:
help [
ohelp test
para más sintaxis.fuente
-s
es un caso especialexists and has a size greater than zero
. La pregunta tal como está escrita es independiente del tamaño, por lo que la existencia debe verificarse utilizandotest -e
un archivo o-d
un directorio. Los archivos vacíos pueden ser especialmente útiles como (por falta de un término mejor) indicadores / centinelas, que pueden ser bastante relevantes paramake
.-f
por defecto, ya que es más común de usar.test
a Windows?|| true
al final para que el comando devuelva verdadero cuando el archivo no existe.test -f myApp || CMD
, observe el||
, así que si-f
falla, no existe (||
), ejecute el comando. ¿Tiene sentido?Puede necesitar una barra invertida al final de la línea para continuar (aunque tal vez eso dependa de la versión de make):
fuente
make
una nueva línea sería un nuevo comando bash. La principal advertencia de esto, aparte de la molestia de tener muchos\
al final de las líneas, es que cada comando debe terminarse con;
lo que de otro modo estaría implícito en bash.O simplemente póngalo en una línea, como
make
le gusta:fuente
Falta un punto y coma
Sin embargo, supongo que está comprobando la existencia antes de la eliminación para evitar un mensaje de error. Si es así, puede usar
rm -f myApp
qué "fuerza" eliminar, es decir, no genera errores si el archivo no existe.fuente
resultados de ejecución:
fuente
echo -n yes
cambia el éxito detest
la cadenayes
sin NL. Elifeq
entonces se puede comparar con el disco codificadoyes
. Todo porqueifeq
quiere una cadena para comparar, no un estado de éxito de un comando de shell.Solución de una línea:
Solución de una línea con acción de error:
Ejemplo usado en mis
make clean
directivas:¡Y
make clean
siempre funciona sin ningún mensaje de error!fuente
-rm myfile
el guión inicial indica que ignore cualquier error.@[ -f 'myfile' ] && rm myfile
"Si README.md no existe, no haga nada (y salga con éxito). De lo contrario, agregue texto al final".
Si usa en
&&
lugar de||
generar un error cuando el archivo no existe:fuente
Estaba intentando:
Y el caso positivo funcionó, pero mi shell de ubuntu bash llama a esto VERDADERO y se rompe en la copia:
Después de recibir este error, busco en Google cómo verificar si existe un archivo en make, y esta es la respuesta ...
fuente
Esta solución publicada anteriormente funciona mejor. Pero asegúrese de no encadenar la asignación PATH_TO_FILE Por ejemplo,
Debe ser
fuente
Las respuestas como la de @ mark-wilkins usando \ para continuar líneas y; para terminarlos en el shell o como los de @kenorb, cambiar esto a una línea son buenos y solucionará este problema.
Hay una respuesta más simple al problema original (como señaló @ alexey-polonsky). Use el indicador -f para rm para que no desencadene un error
Esto es más simple, más rápido y más confiable. Solo tenga cuidado de no terminar con una barra oblicua y una variable vacía
rm -f / $ (myAppPath)#NUNCA HAGA ESTOpuede terminar eliminando su sistema.
fuente
rm
en absoluto; Por cierto, estoy bastante seguro de querm -f /$(myAppPath)
tampoco hará ningún daño, porque/
es un directorio y-r
falta.rm -f
, por ejemplo, puede quererrm
una variable.