GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich den Exit-Status eines Shell-Befehls, der in GNU Makefile verwendet wird?

Im Makefile-:

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

Jede Zeile in der Makefile-Aktion ruft eine neue Shell auf - der Fehler muss in der Aktionszeile überprüft werden, in der der Befehl fehlgeschlagen ist.

Wenn mycommand fehlschlägt, verzweigt die Logik zur echo-Anweisung und wird dann beendet.


Wenn Sie nur nach make wollen abzubrechen, wenn das Tool mit einem Status ungleich Null beendet wird, make wird dies bereits standardmäßig tun.

Beispiel Makefile :

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

.Das passiert mit meinem make :

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

Stellen Sie sicher, dass teilweise oder vollständig erstellte Ziele entfernt werden, falls Sie scheitern. Zum Beispiel diese

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

ist falsch:beim ersten Versuch genb fehlschlägt, wird wahrscheinlich ein falscher b hinterlassen , was beim zweiten Versuch make ist wird davon ausgehen, dass es richtig ist. Sie müssen also so etwas tun wie

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

Hier sind ein paar andere Ansätze:

shell &.SHELLSTATUS

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

Ausgabe:

$ make some_recipe

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

Es hat den Vorbehalt, dass der shell Die Befehlsausgabe wird nicht gestreamt, daher erhalten Sie am Ende nur einen Speicherauszug nach stdout.

$?

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

Oder etwas einfacher zu lesen:

.ONESHELL:

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

Ausgabe:

$ make some_recipe

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

Es ist im Wesentlichen eine Reihe von Befehlen, die in derselben Shell ausgeführt werden.


Linux
  1. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  2. Wie werden Ssh-Remote-Befehlszeilenargumente analysiert?

  3. So löschen Sie die MySQL-Datenbank über den Shell-Befehl

  4. Wie kann man beenden, wenn ein Befehl fehlgeschlagen ist?

  5. Wie erhalte ich die übergeordnete PID eines bestimmten Prozesses in GNU/Linux von der Befehlszeile aus?

So führen Sie einen Shell-Befehl mit Python aus

So leiten Sie die Shell-Befehlsausgabe um

So speichern Sie einen Linux-Befehl als Variable im Shell-Skript

So verwenden Sie den Declare-Befehl in der Linux Bash Shell

Wie führe ich einen Befehl in einem Shell-Skript aus?

Wie liest man Befehlszeilenargumente in Shell-Skripten?