[LINUX] Eine Geschichte, die beim Drehen mit Rohreingabe nicht mit dem Verlassen endete

Ich habe ein solches Programm in bash geschrieben

fruits.txt


apple
banana
orange
#!/bin/bash

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

echo "Erfolgreiche Fertigstellung!"
done

Kommentar

Es ist ein Programm, das den Inhalt vonruit.txt katzt, ihn mit einer Pipe an die while-Anweisung übergibt und standardmäßig ausgibt.

Versuche zu rennen

Wenn beispielsweise das Bananenecho fehlschlägt, lautet die erwartete Ausgabe:

apple
Error:banana

Die tatsächliche Ausgabe ist jedoch wie folgt. Das Skript wurde nach dem Fehler nicht beendet und die nachfolgende Verarbeitung wird fortgesetzt.

apple
Error:banana
orange
Erfolgreiche Fertigstellung!

Ursache

Bei der Übergabe an eine while-Anweisung mit einer Pipe ist die while-Schleife ein untergeordneter Prozess des ursprünglichen Skripts Es wird ausgeführt. Selbst wenn Sie 1 beenden, wird daher nur der untergeordnete Prozess beendet. Der Hauptprozess wird fortgesetzt.

Lösung 1_Nehmen Sie den Rückgabewert des untergeordneten Prozesses auf

Der übergeordnete Prozess nimmt den Rückgabewert 1 des untergeordneten Prozesses auf und bewirkt, dass der übergeordnete Prozess abnormal beendet wird.

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

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

Lösung 2 Verwenden Sie die Anweisung _for

Wenn Sie das Ergebnis von cat in der Liste der for-Anweisungen angeben, wird das Problem behoben. Wenn Sie dies tun, müssen Sie keine Variable definieren, um das Ergebnis von cat separat zu platzieren.

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

Recommended Posts

Eine Geschichte, die beim Drehen mit Rohreingabe nicht mit dem Verlassen endete
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Beim Schreiben in eine CSV-Datei mit Python habe ich einen kleinen Fehler gemacht und den Liefertermin nicht eingehalten
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Eine Geschichte, die fehlgeschlagen ist, als versucht wurde, das Suffix mit rstrip aus einem String zu entfernen
Es gibt ein Muster, das das Programm bei Verwendung von Python-Threading nicht gestoppt hat
Die Geschichte, dass sendmail, die im Terminal ausgeführt werden kann, mit cron nicht funktioniert hat
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Erstellen Sie einen Chatbot, der die kostenlose Eingabe mit Word2Vec unterstützt
Die Geschichte, dass yapf nicht mit vscode funktioniert hat
Eine Geschichte, die ich nicht wusste, wie man Mixin lädt, wenn ich mit der Django-App eine Front mache [Anfänger lernt Python mit einem Nachschlagewerk]
Eine Geschichte, die verschwunden ist, als ich einen Pfad angegeben habe, der mit tilda (~) in Python Open beginnt
Verwenden Sie ein Makro, das beim Speichern von Python mit vscode ausgeführt wird
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden