2017-09-02 5 views
1

Je souhaite exécuter une commande conditionnelle dans un makefile gnu, en fonction de la valeur de retour d'une autre commande.Retour d'un pipeline shell

Pour être précis, quelque chose comme ceci:

lsmod | grep -q pfc && sudo rmmod pfc 

Si la liste actuelle des modules en sortie par lsmod contient pfc, retirez-le. Cela fonctionne, avec le petit problème que si la commande grep échoue (le module n'est pas présent) tout le pipeline retourne non nul, ce qui provoque l'échec de la commande, mais en fait c'est un succès.

Je pourrais juste ajouter un ; true à la fin pour toujours le forcer au succès, mais ceci n'attrapera pas les échecs dans la commande rmmod!

Je voudrais quelque chose que la plupart du temps portatif à travers sh implémentations, mais techniquement je suppose que j'utilise dash puisque c'est là où sh points sur Ubuntu.

+0

Parce que ce pipeline _unconditionally_ retourne vrai. En particulier, si 'rmmod' échoue, nous voulons retourner false, mais ce qui précède retourne vrai. – BeeOnRope

+0

Ceci est seulement un problème si vous utilisez 'set -e', ce qui est une mauvaise idée précisément parce qu'il suppose que tous les statuts de sortie non-zéro indiquent une erreur. – chepner

+0

@chepner - Je n'utilise pas 'set -e', mais l'application appelante (' gmake') traite les retours non-nuls comme des erreurs, ce qui est logique. – BeeOnRope

Répondre

4

Vous pouvez tout simplement gérer l'échec attendu par le nettoyage de la valeur de sortie avec une commande NOP comme echo -n:

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

Si la sortie doit manquer la commande NOP est exécutée et la ligne entière revient avec $?=0.

Modifier:
Les plus simples de les NOP qui ont été suggérées ressemblerait à ceci:

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

resp

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

Il y a des nops plus simples, comme 'true' ou': '. – nobody

+1

[Et pour un shell conforme à la norme, vous n'avez pas besoin du tout nop du tout] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_07) –

+0

@ dave_thompson_085 bash n'accepte pas une branche else vide – yacc