Як запустити команду перед виходом сценарію Bash?


119

Якщо сценарій Bash має set -e, і команда в скрипті повертає помилку, то як я можу зробити чистку перед тим, як скрипт завершиться?

Наприклад:

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

Як я можу забезпечити /tmp/fooвидалення, навіть якщо одна з команд ... do stuff ...не працює?

Відповіді:


193

Ось приклад використання пастки:

#!/bin/bash -e

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

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Вихід:

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

Зауважте, що незважаючи на те, що лінія asdffdsa не вдалася, очищення все-таки виконується.


11

На сторінці bash(про вбудовані):

trap [-lp] [[arg] sigspec ...]
Команда arg повинна зчитуватися та виконуватися, коли оболонка отримує сигнал (и) sigspec.

Отже, як зазначено у відповіді Anon. , зателефонуйте на trapпочатку сценарію, щоб налаштувати обробник, який ви хочете, на ERR.


Запустіть, help trapщоб побачити допомогу на вбудованому.
Флейм

8

З посилання на set:

Вийдіть негайно, якщо проста команда (див. Розділ 3.2.1 Прості команди) закінчується з ненульовим статусом, якщо тільки команда, яка не працює, є частиною циклу до або поки, частиною оператора if, частиною && або || | список, або якщо стан повернення команди інвертується за допомогою !. Папка ERR, якщо вона встановлена, виконується до виходу оболонки.

(Наголос мій).


Можливо, варто додати "-E" при використанні "-e", дивіться vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Макс

3

shверсія devguydavid в відповідь .

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

посилання: shellscript.sh


POSIXзмушує мене посміхатися. :) Чудовий навчальний сайт, з яким ви також пов’язані.
Cometsong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.