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 myApppodrí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
wildcardfunció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
testcomando para probar si el archivo existe, por ejemplo:o no:
El
testes equivalente al[comando.y funcionaría como en tu ejemplo original.
Ver:
help [ohelp testpara más sintaxis.fuente
-ses 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 -eun archivo o-dun 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.-fpor defecto, ya que es más común de usar.testa Windows?|| trueal final para que el comando devuelva verdadero cuando el archivo no existe.test -f myApp || CMD, observe el||, así que si-ffalla, 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
makeuna 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
makele 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 myAppqué "fuerza" eliminar, es decir, no genera errores si el archivo no existe.fuente
resultados de ejecución:
fuente
echo -n yescambia el éxito detestla cadenayessin NL. Elifeqentonces se puede comparar con el disco codificadoyes. Todo porqueifeqquiere 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 cleandirectivas:¡Y
make cleansiempre funciona sin ningún mensaje de error!fuente
-rm myfileel 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
rmen absoluto; Por cierto, estoy bastante seguro de querm -f /$(myAppPath)tampoco hará ningún daño, porque/es un directorio y-rfalta.rm -f, por ejemplo, puede quererrmuna variable.