GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere lo stato di uscita di un comando shell utilizzato in GNU Makefile?

Nel makefile-:

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

Ogni riga nell'azione makefile richiama una nuova shell:l'errore deve essere verificato nella riga dell'azione in cui il comando non è riuscito.

Se mycommand fallisce, la logica passa all'istruzione echo quindi esce.


Se tutto quello che vuoi è per il make essere interrotto se lo strumento esce con uno stato diverso da zero, make lo farà già per impostazione predefinita.

Esempio Makefile :

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

.Questo è quello che succede con il mio make :

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

Assicurati che gli obiettivi parzialmente o interamente creati vengano rimossi in caso di fallimento. Ad esempio, questo

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

non è corretto:se al primo tentativo, genb fallisce, probabilmente lascerà un b errato , che, al secondo tentativo, make presumerà che sia corretto. Quindi devi fare qualcosa come

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

Ecco un paio di altri approcci:

shell &.SHELLSTATUS

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

Uscita:

$ make some_recipe

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

Ha l'avvertenza che shell l'output del comando non viene trasmesso in streaming, quindi ti ritroverai con un dump su stdout quando finisce.

$?

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

Oppure, un po' più facile da leggere:

.ONESHELL:

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

Uscita:

$ make some_recipe

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

È essenzialmente una stringa di comandi, eseguita nella stessa shell.


Linux
  1. Come assegnare l'output di un comando a una variabile di shell?

  2. Come vengono analizzati gli argomenti della riga di comando remota Ssh?

  3. Come usare gli alias di shell in Linux

  4. Come ottenere lo stato di uscita un ciclo in bash

  5. Come ottenere il codice di uscita del processo generato nello script di shell atteso?

Come eseguire un comando Shell con Python

Come reindirizzare l'output del comando della shell

Come memorizzare un comando Linux come variabile nello script della shell

Come utilizzare il comando Declare in Linux Bash Shell

Come eseguire un comando in uno script della shell?

Come leggere gli argomenti della riga di comando negli script della shell?