Piszę skrypt, który należy wykonać source
, ponieważ jego zadaniem jest modyfikacja środowiska. Podczas skryptu chcę go używać set -e
, aby każdy błąd zatrzymał skrypt. Skrypt wygląda następująco:
#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Problem polega na tym, że set -e
naturalnie obowiązuje po zakończeniu skryptu. Jak mogę się upewnić, że zmieniona set
opcja jest prawidłowo przywracana do wartości poprzedniej po zatrzymaniu skryptu (w jakikolwiek sposób - poprzez pomyślne ukończenie lub błąd)?
bash
script
bash-scripting
Petr Pudlák
źródło
źródło
-x
/xtrace
) jest rozwiązany w Pomiń śledzenie wykonania komendy echo?Odpowiedzi:
Dokładnie tak samo, jak go aktywujesz: wywoływanie buitin
set
:Z
bash(1)
manpage, wSHELL BUILTIN COMMANDS
sekcji, polecenie `set ':źródło
set -o
znaną bieżącą konfigurację. Podczas ustawiania / wyłączania któregokolwiek z nich w skryptach należy być wyraźnym.Polecenie
set +o
wyświetla bieżące ustawienia jako polecenia przywracające ten sam stan, npMożesz łatwo przywrócić wszystkie opcje później, jeśli zapiszesz te dane wyjściowe w zmiennej powłoki:
Bash zawiera również szereg niestandardowych (nie POSIX) opcji, które są regulowane za pomocą
shopt
polecenia. Poleceniashopt -p
można użyć do zapisania tych opcji w podobny sposób.Jeśli chcesz zapisać i przywrócić tylko jedną opcję, możesz użyć zmiennej środowiskowej $ -, która wyświetla bieżący zestaw opcji jako litery, np.
Możesz użyć czegoś takiego do zapisania i przywrócenia określonej opcji:
źródło
Użyj pułapki POWRÓT
RETURN
pułapki działają również w przypadku skryptów z zewnątrz.main_script.sh
a_script_to_be_sourced.sh
Test
źródło
Przywrócenie poprzednio aktywowanych ustawień można szybko wykonać jako:
Na odwrót (przywrócenie do stanu wyłączonego) AFAIK nie ma takiego skrótu, a odpowiedź Seppo obejmuje wszystkie przypadki.
źródło
-bash: set: -i: invalid option
ponieważ-i
flaga zauważa interaktywną powłokę.