GNU/Linux >> Znalost Linux >  >> Linux

Jak získat stav ukončení příkazu shellu používaného v GNU Makefile?

V makefile-:

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

Každý řádek v akci makefile vyvolá nový shell - chyba musí být zkontrolována v akčním řádku, kde příkaz selhal.

Pokud příkaz mycommand selže, logika se rozvětví na příkaz echo a skončí.


Pokud vše, co chcete, je pro make bude přerušeno, pokud nástroj skončí s nenulovým stavem, make již to udělá ve výchozím nastavení.

Příklad Makefile :

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

.To je to, co se stane s mým make :

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

Ujistěte se, že částečně nebo zcela vytvořené cíle jsou odstraněny v případě, že selžete. Například toto

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

je nesprávné:pokud na první pokus, genb selže, pravděpodobně zanechá nesprávné b , což na druhý pokus make bude předpokládat, že je správné. Takže musíte udělat něco jako

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

Zde je několik dalších přístupů:

shell &.SHELLSTATUS

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

Výstup:

$ make some_recipe

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

Má to výhradu, že shell výstup příkazu není streamován, takže po dokončení skončíte s výpisem do stdout.

$?

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

Nebo o něco jednodušší čtení:

.ONESHELL:

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

Výstup:

$ make some_recipe

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

Je to v podstatě jeden řetězec příkazů, prováděný ve stejném shellu.


Linux
  1. Bash Shell Exit Status Tutorial s praktickými příklady

  2. Jak používat aliasy shellu v Linuxu

  3. Jak odstranit databázi mysql pomocí příkazu shell

  1. Jak ukončit, pokud příkaz selhal?

  2. Jak získat stav ukončení smyčky v bash

  3. Získejte první řádek výstupu příkazu shellu

  1. Jak přiřadit výstup příkazu proměnné shellu?

  2. Jak se analyzují argumenty vzdáleného příkazového řádku Ssh?

  3. Jak zajistím, aby se obrazovka GNU nespustila v mém domovském adresáři v OS X?