Jak uruchomić polecenie przed zakończeniem działania skryptu Bash?


119

Jeśli skrypt Bash ma set -e, a polecenie w skrypcie zwraca błąd, jak mogę przeprowadzić pewne porządki przed zamknięciem skryptu?

Na przykład:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

Jak mogę się upewnić, że /tmp/foozostanie ono usunięte, nawet jeśli jedno z poleceń programu ... do stuff ...nie powiedzie się?

Odpowiedzi:


193

Oto przykład użycia pułapki:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Wynik:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

Zauważ, że mimo że linia asdffdsa nie powiodła się, czyszczenie nadal było wykonywane.


11

Ze strony bashpodręcznika (dotyczy wbudowanych):

trap [-lp] [[arg] sigspec ...]
Polecenie arg ma zostać odczytane i wykonane, gdy powłoka otrzyma sygnał (-y) sigspec.

Tak więc, jak wskazano w odpowiedzi Anon. , Zadzwoń na trappoczątku skryptu, aby ustawić żądaną procedurę obsługi na ERR.


Uruchom, help trapaby zobaczyć pomoc dotyczącą wbudowanego.
Flimm

8

Od odniesienia do set:

-mi

Zakończ natychmiast, jeśli proste polecenie (patrz sekcja 3.2.1 Proste polecenia) kończy działanie ze stanem niezerowym, chyba że polecenie, które się nie powiedzie, jest częścią pętli till lub while, częścią instrukcji if, częścią a && lub || list lub jeśli status powrotu polecenia jest odwracany za pomocą!. Pułapka na ERR, jeśli jest ustawiona, jest wykonywana przed zakończeniem działania powłoki.

(Podkreślenie moje).


Może warto dodać „-E” podczas używania „-e”, zobacz vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough

3

shwersja devguydavid za odpowiedź .

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

ref: shellscript.sh


POSIXsprawia że się uśmiecham. :) Świetna witryna do nauczania, do której również masz link.
Cometsong
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.