2017-09-02 1 views
1

Ich möchte einen Befehl in einem Gnu-Makefile basierend auf dem Rückgabewert eines anderen Befehls bedingt ausführen.True aus einer Shell-Pipeline zurückgeben

Um genau zu sein, so etwas wie diese:

lsmod | grep -q pfc && sudo rmmod pfc 

Wenn die aktuelle Liste der Module als Ausgabe von lsmodpfc enthält, es entfernen. Dies funktioniert mit dem kleinen Problem, dass, wenn der grep Befehl fehlschlägt (Modul nicht vorhanden), die gesamte Pipeline nicht Null zurückgibt, was dazu führt, dass der Befehl als fehlgeschlagen interpretiert wird, aber tatsächlich ist dies ein Erfolg.

Ich könnte nur eine ; true am Ende hinzufügen, um es immer zum Erfolg zu zwingen, aber dies wird keine Fehler im rmmod Befehl fangen!

Ich möchte etwas, das meist portabel über sh Implementierungen, aber technisch denke ich, ich verwende dash seit dem ist, wo sh Punkte auf Ubuntu ist.

+0

Da die Pipeline _unconditionally_ true zurückgibt. Insbesondere wenn 'rmmod' fehlschlägt, wollen wir false zurückgeben, aber das obige Ergebnis ist wahr. – BeeOnRope

+0

Dies ist nur ein Problem, wenn Sie 'set -e' verwenden, was eine schlechte Idee ist, gerade weil angenommen wird, dass alle Nicht-Null-Exit-Zustände einen Fehler anzeigen. – chepner

+0

@chepner - Ich benutze 'set -e' nicht, aber die aufrufende Anwendung (' gmake') behandelt Nicht-Null-Returns als Fehler, was sinnvoll ist. – BeeOnRope

Antwort

4

Sie könnten nur den erwarteten Ausfall behandeln, indem Sie den Exit-Wertes mit einem NOP-Befehl wie echo -n Reinigung:

if lsmod | grep -q pfc; then sudo rmmod pfc; else echo -n; fi 

Sollte der Ausgang fehlen der nop-Befehl ausgeführt wird und die ganze Linie kehrt mit $?=0.

bearbeiten:
Die einfacheren NOP, die aussehen würde, vorgeschlagen:

if lsmod | grep -q pfc; then sudo rmmod pfc; else true; fi 

bzw.

if lsmod | grep -q pfc; then sudo rmmod pfc; else :; fi 
+3

Es gibt einfachere Nops, wie 'true' oder': '. – nobody

+1

[Und für eine standardkonforme Shell brauchen Sie überhaupt keinen NOP] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_07) –

+0

@ dave_thompson_085 bash akzeptiert nicht ein leerer Else-Zweig – yacc

Verwandte Themen