Forcer «mauvais» (pas 0) le code retour de la commande du terminal?

8

J'ai un framework écrit en python, et à des fins de test, je veux essentiellement faire un sous-processus (alias appel shell) ... qui devrait simplement revenir avec un RC! = 0. J'ai essayé d'invoquer un exécutable inexistant; ou pour exécuter "exit 1"; mais ceux-ci sont traduits pour une raison quelconque en une FileNotFoundError.

Alors, que puis-je faire d'autre pour déclencher un code retour! = 0 (de manière "fiable", ce qui signifie que la commande ne devrait pas retourner soudainement 0 à un moment ultérieur).

J'ai pensé "rechercher" un binaire appelé exit, mais bon:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
la source
1
exit 1est la voie à suivre pour l'avenir. L'erreur FileNotFoundError doit être causée par autre chose.
Jos
Quand je fais "quelle sortie" ... rien n'est trouvé. Je suppose donc que "exit" est une fonction bash; probablement pas disponible lorsque je fais un appel de sous-processus?!
GhostCat
Astuce technique: un code retour différent de zéro n'est pas destiné à indiquer une mauvaise situation, comme votre question semble impliquer. Que "0" signifie "rien de mal" est juste une question de convention. En fait, vous avez 8 bits d'informations à transmettre au processus d'appel.
Jos
@Jos, je comprends cela. Mais le fait est qu'un RC! = 0 mène à une exception spécifique de subprocess.check_call (). Je veux appliquer cette condition pour m'assurer qu'elle est correctement gérée (pour m'assurer que toute situation RC! = 0 dans les tests réels est gérée comme il se doit).
GhostCat
2
Et alors /bin/false?
steeldriver

Réponses:

18

Si vous recherchez une commande système qui renvoie toujours un code de sortie différent de zéro, il /bin/falsesemble que cela devrait fonctionner pour vous. De man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
tournevis
la source
Non. Au moins sur Ubuntu 16.04.4 exécutant bash, la ligne de commande suivante donne 1 au lieu de 5:/bin/false 5; echo $?
fviktor
@fviktor il se termine avec un état non nul - comme le dit le synopsis, les arguments de ligne de commande (comme 5) sont ignorés
steeldriver
Tu as raison. Juste aucun moyen de contrôler le code de sortie réel non nul.
fviktor
7

Vous pouvez créer un nouveau code retour avec la commande bash -c "exit RETURNCODE", en remplaçant "RETURNCODE" par n'importe quel nombre. Notez qu'il sera réduit à un entier non signé 8 bits (0 ... 255) par (RETURNCODE mod 256)

Vous pouvez vérifier le code retour de la dernière commande shell à l'intérieur du terminal (!) Avec l'exécution echo $?. Le "$?" La variable contient le code retour le plus récent et "echo" l'imprime sur la sortie standard.

Byte Commander
la source
+1. Notez que si vous écrivez ceci dans un script shell, vous pouvez simplement le faire exit RETURNCODE(sans la bash -cpartie)
Matt Browne
0

Après quelques tests supplémentaires, j'ai trouvé que mon problème n'était pas du côté "Linux".

Python a un module shlex; qui devrait être utilisé pour "diviser" les chaînes de commandes. Lorsque j'ai changé mon appel de sous-processus pour utiliser la sortie d' shlex.split()invocation de "bash exit 1", cela me donne ce dont j'ai besoin.

GhostCat
la source