bash cleanup с ловушкой RETURN и обработчиком сброса немедленно - PullRequest
0 голосов
/ 16 октября 2018

Есть ли способ отключить ловушку в обработчике ловушек?

Я хотел бы упростить некоторый код с помощью ловушки RETURN.my_func вернет значение my_command.Tmpfile будет очищен при возврате my_func.Этот метод позволил бы мне не назначать временную переменную для хранения $?из my_func, пока я выполняю очистку.

Однако я не могу сбросить обработчик ловушек в обработчике, и очистка теперь вызывается после каждого возврата функции.

В конечном итоге, что я действительно хочу сделатьis cleanup после того, как my_command вызван, но все еще имеет его в качестве последней команды, поэтому возвращаемое значение неявно.Будем благодарны за любые предложенные альтернативы.

cleanup() { # generic cleanup w/ reset
   "$@"
   trap - RETURN
}

my_func() {
   local -r tmpfile="/tmp/tmpfile"
   trap "cleanup rm ${tmpfile}" RETURN
   my_command -f ${tmpfile}
}

caller() {
   if my_func ; then
      do_success_ops
   fi
}

1 Ответ

0 голосов
/ 16 октября 2018

Я всегда использую этот шаблон:

trap 'rm -rf "$workspace"' EXIT
workspace="$(mktemp --directory)" # Or -d
# Use $workspace

Это имеет несколько приятных особенностей:

  1. Ловушка настроена до создания каталога, поэтомунет условия гонки.
  2. Создание каталога означает, что мне больше не нужны mktemp вызовы в скрипте, потому что я могу просто поместить все в этот каталог.
  3. Создание каталогаа не файл дает лучшую базовую линию безопасности, потому что обычно каждый может видеть то, что находится непосредственно в /tmp, но новый каталог будет принадлежать вам и будет создан "u + rwx, минус ограничения umask" (из * 1015)*).

Если вы хотите очистить раньше Я бы порекомендовал сделать это явно.Ваше решение имеет два ненужных уровня косвенности: ловушка и передача аргументов для запуска.

...