Korzystam ze skryptu bash w terminalu , więc wychodzę z błędu
set -o errexit
zabija mój terminal, co jest niesamowicie denerwujące, ponieważ muszę zamknąć terminal, otworzyć inny i zresetować niektóre zmienne.
Do tej pory za pomocą
command || return
wiersze w skrypcie robią dokładnie to, co chcę
set -o errexit
robić ... Ale chcę, żeby zrobiono to dla całego skryptu; nie tylko jedna linia / polecenie
Mam plik pełen poleceń do konfigurowania witryny i wolałbym nie wykonywać poleceń || powrót
dla każdej linii w pliku
Czy istnieje inna opcja zestawu lub coś, co po prostu „powróci” zamiast wychodzić z terminala?
- Dla jasności chciałbym zabić skrypt i pozostawić terminal w tym samym stanie, co naciśnięcie klawiszy Ctrl + C, aby zabić usługę uruchomioną w terminalu. command || return
robi to. Ale nie chcę przyczepiać się || return
do każdej linii w pliku. Więc szukam czegoś podobnego set -o errexit
, co nie spowoduje zamknięcia terminala
--- Uwaga: Tworzenie głupiego skryptu zawierającego dwie linie (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
I umieszczenie set -o errexit
na górze create.sh,
działa dokładnie tak, jak tego oczekuję. Jednak naprawdę głupie jest tworzenie pliku zawierającego dwie linie, aby wywołać inny skrypt bash, zamiast wywoływać go z terminala. Uhghhh
oto kilka przykładów:
w super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
w 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
w terminalu:
$ bash super.sh
wynik zgodny z oczekiwaniami:
my-mac$
To działa. Co za irytujące rozwiązanie.
I chce , najlepiej, aby wykonać to, co znajduje się w głupiej pliku super.sh z terminala, a nie pliku super.sh: D, bez konieczności wyłączania terminala na mnie. Oto, co dzieje się z tym, co próbuję zrobić:
polecenie terminala:
my-mac$ source $create_path blah
w create.sh nadal mam set -o errexit
Oto wynik na terminalu
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
A następnie terminal jest zamrożony. Ctrl + C nie działa, podobnie jak Ctrl + D
Jeśli zamiast tego set -o errexit
, jeśli po prostu używam command || return
instrukcji wszędzie w pliku create.sh, to dostaję dokładnie to, czego chcę, wykonując wiersze w supser.sh bezpośrednio na terminalu (zamiast wywoływać super.sh z terminalu). Ale to też nie jest praktyczne rozwiązanie.
Uwaga: Podobała mi się odpowiedź @terdona dotycząca po prostu odradzania powłoki potomnej, więc skończyłem po prostu odradzaniem powłoki podrzędnej za pomocą skryptu zamiast terminala, jak pokazał w swojej odpowiedzi za pomocą nawiasów klamrowych ( )
wokół całego skryptu. Jego odpowiedź też działa.
source $file_path argument
Skrypt jest wykonywany w tej samej powłoce, z której go source
command || return