GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener el estado de salida de un comando de shell utilizado en GNU Makefile?

En el archivo MAKE-:

mycommand || (echo "mycommand failed $$?"; exit 1)

Cada línea en la acción del archivo MAKE invoca un nuevo shell:el error debe verificarse en la línea de acción donde falló el comando.

Si mycommand falla, la lógica se bifurca a la declaración de eco y luego sale.


Si todo lo que quieres es por el make para cancelarse si la herramienta sale con un estado distinto de cero, make ya lo hará por defecto.

Ejemplo Makefile :

a: b
    @echo making [email protected]
b:
    @echo making [email protected]
    @false
    @echo already failed

.Esto es lo que pasa con mi make :

$ make
making b
make: *** [Makefile:6: b] Error 1

Asegúrese de eliminar parcial o totalmente los objetivos creados en caso de que falle. Por ejemplo, esto

a: b
    @gena $+ > [email protected]
b:
    @genb > [email protected]

es incorrecto:si en el primer intento, genb falla, probablemente dejará un b incorrecto , que, en el segundo intento, make asumirá que es correcto. Entonces necesitas hacer algo como

a: b
    @gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
    @genb > [email protected]

Aquí hay un par de otros enfoques:

shell &.SHELLSTATUS

some_recipe:
    @echo $(shell echo 'doing stuff'; exit 123)
    @echo 'command exited with $(.SHELLSTATUS)'
    @exit $(.SHELLSTATUS)

Salida:

$ make some_recipe

doing stuff
command exited with 123      
make: *** [Makefile:4: some_recipe] Error 123

Tiene la advertencia de que el shell la salida del comando no se transmite, por lo que acaba con un volcado a la salida estándar cuando finaliza.

$?

some_recipe:
    @echo 'doing stuff'; sh -c 'exit 123';\
    EXIT_CODE=$$?;\
    echo "command exited with $$EXIT_CODE";\
    exit $$EXIT_CODE

O, un poco más fácil de leer:

.ONESHELL:

some_recipe:
    @echo 'doing stuff'; sh -c 'exit 123'
    @EXIT_CODE=$$?
    @echo "command exited with $$EXIT_CODE"
    @exit $$EXIT_CODE

Salida:

$ make some_recipe

doing stuff                  
command exited with 123      
make: *** [Makefile:2: some_recipe] Error 123

Es esencialmente una cadena de comandos, ejecutados en el mismo shell.


Linux
  1. Cómo eliminar la base de datos mysql a través del comando de shell

  2. ¿Cómo salir si falla un comando?

  3. Cómo obtener el estado de salida de un bucle en bash

  4. Obtenga la primera línea de la salida de un comando de shell

  5. ¿Cómo obtener el PID principal de un proceso determinado en GNU/Linux desde la línea de comandos?

Cómo ejecutar un comando de Shell con Python

Cómo redirigir la salida del comando de shell

Cómo almacenar un comando de Linux como una variable en el script de Shell

Cómo usar el comando Declare en Linux Bash Shell

¿Cómo ejecutar un comando en un script de Shell?

¿Cómo leer argumentos de línea de comando en scripts de Shell?