Führt ein Shell-Skript Befehle sequenziell aus?

Führt ein Shell-Skript Befehle sequenziell aus?

Ich habe ein Python-Skript, das etwas instabil ist und ab und zu einen SSL-Fehler ausgibt. Die Ausnahme wird von einer Funktion ausgelöst, die tief in einer Bibliothek vergraben ist, sodass es im Wesentlichen keine Lösung dafür gibt.

Ich habe eine Hack-Lösung implementiert, indem ich ein Shell-Skript mit einer While-Schleife erstellt habe, die viele Male ausgeführt wird, und das Python-Skript innerhalb dieser Schleife ausgeführt habe.

Jetzt hoffe ich, dass beim Starten einer Iteration der Schleife und Ausführen des Skripts die Schleife im Shell-Skript an Ort und Stelle bleibt, bis das Python-Skript fehlschlägt und die nächste Iteration der Schleife das Skript erneut ausführt und so weiter.

Ist es effizient, es auf diese Weise zu tun? Gibt es eine bessere Möglichkeit, es zu tun? Und vor allem: Ist es richtig?

Antwort1

In:

cmd1
cmd2

oder

cmd1; cmd2

Sie werden sequenziell ausgeführt.

In

cmd1 && cmd2

Oder

cmd1 || cmd2

Sie werden nacheinander ausgeführt, aber ob cmd2sie überhaupt ausgeführt werden, hängt davon ab, ob cmd1sie erfolgreich sind (für &&) oder fehlschlagen (für ||).

In

cmd1 | cmd2

oder

cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh

oder

cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)

Sie werden gleichzeitig ausgeführt. Im ersten Fall warten einige Shells nur auf , cmd2bevor sie mit dem Rest des Skripts fortfahren, während andere auf beides warten. Im zweiten Fall warten Shells nur auf cmd2( cmd1wird als asynchron ausgeführt (oder im Hintergrund, wenn sie in einer interaktiven Shell ausgeführt werden)) und im dritten auf cmd1( cmd2asynchron).

In:

< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"

Befehle werden nacheinander ausgeführt, die Reihenfolge hängt jedoch von der Shell ab. In jedem Fall cmd4wird zuletzt ausgeführt.

In:

cmd1 =(cmd2) # zsh

Sie werden sequenziell ( cmd2zuerst) ausgeführt.

Beachten Sie, dass in all diesen Fällen jeder dieser Befehle andere Prozesse starten könnte. Die Shell hätte keine Kenntnis davon und kann daher unmöglich auf sie warten.

Antwort2

Ja, das ist richtig. Bedenken Sie Folgendes:

#!/bin/bash

while true; do
    sleep 1
    echo "Slept 1"
    echo "Exit status $?, ok."
    sleep 1
    echo "Slept 1, now executing faulty command 'ps q'"
    ps q
    echo "Exit status $?, not ok. Loop continues forever..."
done

...sieht bei der Ausführung folgendermaßen aus:

./loop.sh 
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-u]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]
Exit status 1, not ok. Loop continues forever...
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-u]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]
Exit status 1, not ok. Loop continues forever...
^C

Solange die Schleife immer aktiv ist, truespielt es keine Rolle, welche Exit-Codes die Programme innerhalb der Schleife haben. Sie werden in der Reihenfolge ausgeführt, in der sie geschrieben wurden.

Ist es auf diese Weise effizient? Gibt es eine bessere Möglichkeit, dies zu tun?

Deram bestenDer beste Weg, dies zu tun, besteht darin, den Fehler in Ihrem Python-Programm zu beheben!

Antwort3

Um Ihre Titelfrage zu beantworten: Ja, Befehle in einem Shell-Skript werden synchron nacheinander ausgeführt, sodass die Shell blockiert ist, während Ihr Python-Skript ausgeführt wird.

Es wäre sicherlich besser, die Fehlerquelle zu beheben, aber wenn das keine Option ist, ist ein Shell-Skript, das versucht, das Python-Skript auszuführen, bis es einen Statuscode von Null ( while true;do ./script.py; if [[ "$?" = 0]];break;done) zurückgibt, ein sinnvoller Ansatz.

verwandte Informationen