[LINUX] Une histoire qui ne s'est pas terminée par la sortie lors du tournage avec l'entrée de tuyau

J'ai écrit un programme comme celui-ci en bash

fruits.txt


apple
banana
orange
#!/bin/bash

cat fruits.txt | while read LINE do
    echo ${LINE}
    if [ $? -ne 0 ] ; then
        echo "Erreur:${LINE}"
        exit 1;
    fi
done

echo "Réussite!"
done

Commentaire

C'est un programme qui récupère le contenu de fruit.txt, le transmet à l'instruction while avec un tube et le sort en standard.

Essayez de courir

Par exemple, si l'écho banane échoue, la sortie attendue est:

apple
Erreur:banana

Cependant, la sortie réelle est la suivante. Le script ne s'est pas terminé après l'erreur et le traitement suivant se poursuit.

apple
Erreur:banana
orange
Réussite!

Cause

Lors du passage à une instruction while avec un tube, la boucle while est un processus enfant du script d'origine Il sera exécuté. Par conséquent, même si vous quittez 1, seul le processus enfant sera arrêté. Le processus principal se poursuivra.

Solution 1_ Sélectionnez la valeur de retour du processus enfant

Le processus parent récupère la valeur de retour 1 du processus enfant et provoque l'arrêt anormal du processus parent.

cat fruits.txt | while read LINE do
    echo ${LINE}
    if [ $? -ne 0 ] ; then
        echo "Erreur:${LINE}"
        exit 1;
    fi
done

if [ $? -ne 0 ] ; then
    exit 1;
fi

Solution 2 Utilisez l'instruction _for

Spécifier le résultat de cat dans la liste d'instructions for résoudra le problème. Si vous faites cela, vous n'avez pas besoin de définir une variable pour mettre le résultat de cat séparément, donc c'est intelligent.

for FRUIT in `cat fruits.txt`; do
    echo ${FRUIT} 
done

Recommended Posts

Une histoire qui ne s'est pas terminée par la sortie lors du tournage avec l'entrée de tuyau
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Une histoire qui a échoué lors de la tentative de suppression du suffixe d'une chaîne avec rstrip
Il y a un modèle que le programme ne s'est pas arrêté lors de l'utilisation du thread Python
L'histoire selon laquelle sendmail qui peut être exécuté dans le terminal ne fonctionnait pas avec cron
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
L'histoire selon laquelle yapf n'a pas fonctionné avec vscode
Une histoire que je ne savais pas charger de mixin lors de la création d'une façade avec l'application django [Débutant apprend python avec un livre de référence]
Une histoire qui a disparu quand j'ai spécifié un chemin commençant par tilda (~) en python open
Utilisez une macro qui s'exécute lors de l'enregistrement de python avec vscode
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python