Rückgabecode des Terminalbefehls "schlecht" (nicht 0) erzwingen?

8

Ich habe ein in Python geschriebenes Framework und möchte zu Testzwecken grundsätzlich einen Unterprozess (auch bekannt als Shell-Aufruf) ausführen ... der einfach mit einem RC! = 0 zurückkommen sollte. Ich habe versucht, eine nicht vorhandene ausführbare Datei aufzurufen. oder um "exit 1" auszuführen; Diese werden jedoch aus irgendeinem Grund in einen FileNotFoundError übersetzt.

Was könnte ich also noch tun, um einen Rückkehrcode auszulösen? = 0 (auf "zuverlässige" Weise; dh der Befehl sollte zu einem späteren Zeitpunkt nicht plötzlich 0 zurückgeben).

Ich dachte nach einer Binärdatei namens exit zu suchen, aber gut:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat begrüßt Monica C.
quelle
1
exit 1ist der zukunftssichere Weg. Der FileNotFoundError muss durch etwas anderes verursacht werden.
Jos
Wenn ich "welchen Ausgang" mache ... wird nichts gefunden. Ich gehe also davon aus, dass "exit" eine Bash-Funktion ist. wahrscheinlich nicht verfügbar, wenn ich einen Unterprozessaufruf mache?!
GhostCat begrüßt Monica C.
Technisches Nitpicking: Ein Rückkehrcode ungleich Null ist nicht als Hinweis auf eine schlechte Situation gedacht , wie Ihre Frage zu implizieren scheint. Dass "0" "nichts Falsches" bedeutet, ist nur eine Frage der Konvention. Tatsächlich haben Sie 8 Informationsbits, die Sie an den aufrufenden Prozess zurückgeben können.
Jos
@ Jos Ich verstehe das. Der Punkt ist jedoch, dass ein RC! = 0 zu einer bestimmten Ausnahme von subprocess.check_call () führt. Ich möchte diese Bedingung durchsetzen, um sicherzustellen, dass sie ordnungsgemäß behandelt wird (um sicherzustellen, dass jede RC! = 0-Situation in realen Tests so behandelt wird, wie sie sein sollte).
GhostCat begrüßt Monica C.
2
Wie wäre es /bin/false?
Steeldriver

Antworten:

17

Wenn Sie nach einem Systembefehl suchen , der immer einen Exit-Code ungleich Null zurückgibt, /bin/falsesollte er für Sie funktionieren. Von man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
Steeldriver
quelle
Nein, tut es nicht. Zumindest unter Ubuntu 16.04.4, wenn bash ausgeführt wird, gibt die folgende Befehlszeile 1 statt 5 aus:/bin/false 5; echo $?
fviktor
@fviktor es wird mit einem Status ungleich Null beendet - wie die Inhaltsangabe sagt, werden Befehlszeilenargumente (wie z. B. 5) ignoriert
steeldriver
Du hast recht. Nur keine Möglichkeit, den tatsächlichen Exit-Code ungleich Null zu steuern.
Fviktor
7

Sie können mit dem Befehl einen neuen Rückkehrcode erstellen bash -c "exit RETURNCODE"und "RETURNCODE" durch eine beliebige Nummer ersetzen. Beachten Sie, dass es von (RETURNCODE mod 256) auf eine 8-Bit-Ganzzahl ohne Vorzeichen (0 ... 255) gekürzt wird.

Sie können den Rückkehrcode des letzten Shell-Befehls im Terminal (!) Mit der Ausführung überprüfen echo $?. Das "$?" Variable enthält den neuesten Rückkehrcode und "echo" druckt ihn in die Standardausgabe.

Byte Commander
quelle
+1. Beachten Sie, dass Sie, wenn Sie dies in einem Shell-Skript schreiben, einfach exit RETURNCODE(ohne den bash -cTeil) tun können
Matt Browne
0

Nach einigen weiteren Tests stellte ich fest, dass mein Problem nicht auf der "Linux" -Seite lag.

Python hat einen Modul-Shlex; Dies sollte verwendet werden, um Befehlszeichenfolgen zu "teilen". Wenn ich meinen Unterprozessaufruf geändert habe, um die Ausgabe des shlex.split()Aufrufs von "bash exit 1" zu verwenden, bekomme ich das, was ich brauche.

GhostCat begrüßt Monica C.
quelle