Comete error al ejecutar receta con operador condicional

Comete error al ejecutar receta con operador condicional

Mi Makefile es muy simple:

all:
      [ -f MyFile ] && echo "MyFile exists"

Por supuesto, la línea de recetas comienza con la pestaña. Si el archivo MyFile realmente existe, todo está bien. Pero si este archivo no está en el directorio actual obtengo:

Makefile:2: la receta para el objetivo 'todos' falló: *** [todos] Error 1

Puedo deshacerme de este error usando la declaración if en su lugar:

all:
      if [ -f MyFile ]; then echo "MyFile exists"; fi

Ambas declaraciones funcionan bien en sh y bash fuera de make. No me queda claro cuál es el motivo del error de creación cuando se utiliza el operador condicional. ¿Una idea de lo que está pasando?

Respuesta1

[ -f MyFile ] && echo "MyFile exists"

sale con un código de estado distinto de cero si MyFileno existe, mientras que

if [ -f MyFile ]; then echo "MyFile exists"; fi

sale con un código de estado exitoso (cero) a menos que MyFileexistay echofalla con un error de escritura.

Make se basa en códigos de estado para determinar si los comandos fallaron y detiene la ejecución de forma predeterminada cuando falla algún comando. Puede deshabilitar esto para líneas de comando individuales anteponiendoles el prefijo -, o en general ejecutando make -io especificando el .IGNOREobjetivo especial. De este modo

-[ -f MyFile ] && echo "MyFile exists"

Ambos permitirían que Make continúe, pero aún así haría que imprimiera un mensaje si MyFileno existe:

make: [Makefile:14: test] Error 1 (ignorado)

El || truepatrónTambién funcionaría en este caso específico, pero ignoraría los errores en echo. if condition; then command; fino hará que Make se detenga si conditiones falso, pero tendrá commanden cuenta los errores de ', mientras que condition && command || trueignorará todos los errores.

información relacionada