Ich verwende ein Bash-Skript im Terminal und beende es bei einem Fehler mit
set -o errexit
bricht mein Terminal ab, was EXTREM ÄRGERLICH ist, weil ich das Terminal schließen, ein anderes öffnen und einige Variablen zurücksetzen muss.
Bisher mit
command || return
lines macht im script genau das, was ich will
set -o errexit
zu tun ... Aber ich möchte, dass es für das gesamte Drehbuch getan wird; nicht nur eine Zeile / Befehl
Ich habe eine Datei mit Befehlen zum Einrichten einer Site, und ich möchte lieber keinen Befehl || ausführen Rückkehr
für jede einzelne Zeile in der Datei
Gibt es eine andere festgelegte Option oder etwas anderes, das einfach "zurückkehrt", anstatt das Terminal zu verlassen?
- Aus Gründen der Übersichtlichkeit möchte ich das Skript beenden und das Terminal in dem Zustand belassen, in dem das Drücken von Strg + C zum Beenden eines im Terminal ausgeführten Dienstes ausgeführt wird. command || return
tut das. Aber ich möchte nicht auf || return
jede Zeile in der Datei eingehen. Ich suche also nach etwas ähnlichem set -o errexit
, das nicht dazu führt, dass das Terminal heruntergefahren wird
--- Hinweis: Erstellen Sie ein dummes Skript mit zwei Zeilen (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Und set -o errexit
an der Spitze von create.sh platzieren,
funktioniert genau so wie ich es erwarte. Es ist jedoch wirklich dumm, eine Datei mit zwei Zeilen darin zu erstellen, nur um ein anderes Bash-Skript aufzurufen, anstatt es nur vom Terminal aus aufzurufen. Ugghhh
Hier sind einige Beispiele:
in super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
in create.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
im terminal:
$ bash super.sh
Ausgabe wie erwartet:
my-mac$
Das funktioniert. Was für eine nervige Lösung.
Ich möchte im Idealfall ausführen, was in der dummen Datei super.sh vom Terminal ist, nicht in der Datei super.sh: D, ohne dass das Terminal mich herunterfährt. Das passiert mit dem, was ich versuche:
Terminalbefehl:
my-mac$ source $create_path blah
in create.sh habe ich noch set -o errexit
Hier ist die Ausgabe auf dem Terminal
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
Und dann ist das Terminal eingefroren. Strg + C funktioniert nicht, ebenso wenig wie Strg + D
Wenn set -o errexit
ich stattdessen nur command || return
Anweisungen überall in der Datei create.sh verwende, erhalte ich genau das, was ich will, während ich die Zeilen in supser.sh direkt auf dem Terminal ausführe (anstatt super.sh vom Terminal aus aufzurufen). Aber das ist auch keine praktische Lösung.
Hinweis: Ich mochte die Antwort von @terdon, dass ich nur eine untergeordnete Shell erzeugt habe, und habe am Ende nur eine untergeordnete Shell über das Skript anstelle des Terminals erzeugt, wie er in seiner Antwort mit geschweiften Klammern ( )
um das gesamte Skript herum gezeigt hat funktioniert auch.
source $file_path argument
Das Skript wird in derselben Shell ausgeführt, von der ich es aufgerufen habe (was source
mir gesagt wurde ... und es verhält sich so). command || return
Anweisungen befinden sich in der Datei, die ich im Terminal ausführe