HintergrundBeenden ein Bash-Skript, wenn ein Fehler auftritt, darin oder einer des Hintergrundjobs schafft es
Ich bin auf einem Bash-Skript arbeite den Prozess des Aufbaus eines halbes Dutzend Projekte zu automatisieren, die in dem leben dasselbe Verzeichnis. Jedes Projekt hat zwei Skripte ausführen, um ihn zu bauen:
npm install
npm run build
Die erste Zeile wird alle Abhängigkeiten von npm holen. Da dieser Schritt am längsten dauert und die Projekte ihre Abhängigkeiten gleichzeitig abrufen können, verwende ich einen Hintergrundjob, um alles parallel abzurufen. (zB: npm install &
)
Die zweite Zeile verwendet diese Abhängigkeiten, um das Projekt zu erstellen. Da dies nach Abschluss aller Schritte von Schritt 1 geschehen muss, führe ich den Befehl wait
dazwischen aus. Siehe Codefragment unten.
Die Frage
Ich möchte so schnell mein Skript Ausgang haben, wie ein Fehler in einem der Hintergrundjobs auftritt, oder der npm run build
Schritt, der später geschieht.
Ich benutze set -e
, aber dies gilt nicht für die Hintergrund-Jobs, und damit, wenn ein Projekt fehlschlägt, seine Abhängigkeiten zu installieren, läuft alles andere weiter.
Hier ist ein vereinfachtes Beispiel, wie mein Skript jetzt aussieht.
build.sh
set -e
DIR=$PWD
for dir in ./projects/**/
do
echo -e "\033[4;32mInstalling $dir\033[0m"
cd $dir
npm install & # takes a while, so do this in parallel
cd $DIR
done
wait # continue once the background jobs are completed
for dir in ./projects/**/
do
cd $dir
echo -e "\033[4;32mBuilding $dir\033[0m"
npm run build # Some projects use other projects, so build them in series
cd $DIR
echo -e "\n"
done
Noch einmal, ich will nicht in das Skript etwas zu tun, um fortzufahren, wenn ein Fehler an irgendeiner Stelle auftritt, gilt dies sowohl für die Eltern und Hintergrundjobs. Ist das möglich?
BTW, 'echo -e' ist schlechte Form: die POSIX-Spezifikation für' echo' erfordert 'echo -e', um '-e' auf seiner Ausgabe zu drucken, so dass Sie buchstäblich Code schreiben, der nur den Weg funktioniert Sie beabsichtigen eine * nicht * -konforme Shell. Verwenden Sie 'printf '% b \ n'" Zeichenfolge mit Escape-Sequenzen "', um Inhalt auf eine vollständig tragbare Weise zu drucken. –
Die POSIX-Spezifikation für "echo" finden Sie unter http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html. Beachten Sie dabei den Abschnitt APPLICATION USAGE. –
Auch, re: Best Practices für die Farbe, siehe BashFAQ # 37: http://mywiki.wooledge.org/BashFAQ/037 –