[PYTHON] Die Geschichte, dass Fabric den Statuscode in der Mitte der Pipe im Shell-Skript nicht erhalten kann

Hintergrund

Zum Beispiel

$ true | false | true

Oder

$ ls -S1 hoge* | haed -n1

Unmittelbar nach dem Ausführen eines Shell-Skripts, das Pipe-Verarbeitung wie enthält

$ echo $?

Wenn Sie den Statuscode mit einem Befehl überprüfen, z. B. selbst wenn im ersten oder Zwischenprozess ein Fehler auftritt, kann nur der letzte Statuscode der Pipe abgerufen werden.

Wenn Sie den Statuscode des Fortschritts erhalten, können Sie ihn abrufen, indem Sie unmittelbar nach der Ausführung auf das Array "$ {PIPESTATUS [@]}" verweisen.

$ true | false | true
$ echo ${PIPESTATUS[@]}
0 1 0

Für Stoff

Normalerweise haben im Fall von Fabric die Rückgabewerte der Befehle "run" und "sudo" Eigenschaften wie ".succeeded" und ".failed", daher wird häufig darauf Bezug genommen.

result = run("false", warn_only=True)
print result.succeeded

Da es jedoch keine Variable gibt, die "$ {PIPESTATUS [@]}" entspricht, kann der Statuscode nicht in der Mitte abgerufen werden.

Problem

Betrachten Sie ein Beispiel wie das Shell-Skript am Anfang.

@task
def return_test():
    #Zeigen Sie die größte Datei mit dem String Hoge im aktuellen Verzeichnis an
    result = run("ls -S1 *hoge* | head -n1")
    print result.succeed
    print result

Wenn zu diesem Zeitpunkt im aktuellen Verzeichnis keine Datei / kein Verzeichnis mit "hoge" vorhanden ist, gibt ".succeeded" nur das Ergebnis von "run" zurück (da der Kopf ausgeführt werden kann, ist dies "True"). Als Inhalt wird die Fehleranzeige (Standardfehlerausgabe) unverändert zurückgegeben.

[192.168.0.1] Executing task 'return_test'
[192.168.0.1] run: ls -S1 *hoge* | head -n1
[192.168.0.1] out: ls: cannot access *hoge*: No such file or directory
[192.168.0.1] out:

True
ls: cannot access *hoge*: No such file or directory

Done.
Disconnecting from 192.168.0.1... done.

Die Informationen, die ich ursprünglich wollte, wurden nicht zurückgegeben und sind unangenehm. In diesem Beispiel kann es jedoch vorkommen, dass der Verzeichnisname ein solcher Name ist.

Lösung (Schlussfolgerung)

Lassen Sie uns den Tee schlammig machen.

@task
def return_test():
    result = run("ls -S1 *hoge* 2> /dev/null | head -n1")
    print result
[192.168.0.1] Executing task 'return_test'
[192.168.0.1] run: ls -S1 *hoge* 2> /dev/null | head -n1


Done.
Disconnecting from 192.168.0.1... done.

Recommended Posts

Die Geschichte, dass Fabric den Statuscode in der Mitte der Pipe im Shell-Skript nicht erhalten kann
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
[OCI] Python-Skript zum Abrufen der IP-Adresse einer Recheninstanz in Cloud Shell
[Hinweis] Ein Shell-Skript, das die CPU-Auslastung eines bestimmten Prozesses in einer while-Schleife überprüft.
Code, der bei AttributeError Standardwerte festlegt
Ein Memo eines Programms, das ein zweistelliges Datum mit Javascript, Ruby, Python oder einem Shell-Skript abruft.
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Shell-Skript (Linux, macOS), das das Datum der letzten Woche ausgibt
Holen Sie sich den Skriptpfad in Python
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
Ruft den Rückgabewert eines externen Shell-Skripts (ls) mit python3 ab
Ermitteln Sie den Wert der mittleren Schicht von NN
[Python] Ruft den Zeichencode der Datei ab
Ruft die EDINET-Codeliste in Python ab
Es scheint, dass die Version von Pyflakes nicht die neueste ist, wenn flake8 installiert ist
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Entsprechung des Ereignisses, dass das Ergebnis von form.is_valid () im Django2-System immer falsch ist
Hackasons Erfahrung, dass es am wichtigsten ist, die Gefühle des Veranstalters zu verstehen