[PYTHON] L'histoire selon laquelle Fabric ne peut pas obtenir le code d'état au milieu du tube dans le script shell

Contexte

Par exemple

$ true | false | true

Ou

$ ls -S1 hoge* | haed -n1

Immédiatement après l'exécution d'un script shell qui inclut le traitement du tube

$ echo $?

Lors de la vérification du code d'état avec une commande telle que, même si une erreur se produit dans le premier processus ou dans le processus intermédiaire, seul le dernier code d'état du tube peut être obtenu.

Lorsque vous obtenez le code d'état de la progression, vous pouvez l'obtenir en vous référant au tableau $ {PIPESTATUS [@]} immédiatement après l'exécution.

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

Pour le tissu

Normalement, dans le cas de Fabric, les valeurs de retour des commandes «run» et «sudo» ont des propriétés telles que «.succeeded» et «.failed», c'est pourquoi on y fait souvent référence.

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

Cependant, comme il n'y a pas de variable correspondant à $ {PIPESTATUS [@]}, le code d'état ne peut pas être obtenu au milieu.

problème

Prenons un exemple comme le script shell au début.

@task
def return_test():
    #Afficher le plus gros fichier contenant la chaîne hoge dans le répertoire courant
    result = run("ls -S1 *hoge* | head -n1")
    print result.succeed
    print result

À ce stade, s'il n'y a pas de fichier / répertoire contenant «hoge» dans le répertoire courant, «.succeeded» ne renvoie que le résultat de «run» (puisque head peut être exécuté, c'est «True»), En tant que contenu, l'affichage d'erreur (sortie d'erreur standard) est renvoyé tel quel.

[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.

Les informations que je voulais à l'origine n'ont pas été retournées, et c'est désagréable, mais dans cet exemple, il peut arriver que le nom du répertoire soit un tel nom, ce qui pose un problème.

Solution (conclusion)

Rendons le thé boueux.

@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

L'histoire selon laquelle Fabric ne peut pas obtenir le code d'état au milieu du tube dans le script shell
Récupérer le code retour d'un script Python depuis bat
[OCI] Script Python pour obtenir l'adresse IP d'une instance de calcul dans Cloud Shell
[Note] Un script shell qui vérifie l'utilisation du processeur d'un processus spécifique dans une boucle while.
Code qui définit les valeurs par défaut en cas d'AttributeError
Un mémo d'un programme qui récupère une date à deux chiffres avec javascript, Ruby, Python ou un script shell.
Traitez le contenu du fichier dans l'ordre avec un script shell
Script Shell (Linux, macOS) qui affiche la date de la semaine dernière
Obtenez le chemin du script en Python
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
Obtenez la valeur de retour d'un script shell externe (ls) avec python3
Obtenez la valeur de la couche intermédiaire de NN
[Python] Récupère le code de caractère du fichier
Obtenir la liste de codes EDINET en Python
Il semble que la version de pyflakes ne soit pas la dernière lorsque flake8 est installé
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Correspondance de l'événement selon lequel le résultat de form.is_valid () est toujours False dans le système Django2
L'expérience de Hackason selon laquelle il est le plus important de comprendre les sentiments de l'organisateur