Обробка пасток та неявні підзаголовки в скриптах оболонки


12

Скажімо, у вас є сценарій оболонки, який запускає якийсь код очищення через EXITпастку, як-от так:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

trap mytrap exit

echo I am at the end of the script.

Як очікується, це буде роздруковано, It's a trap!коли сценарій закінчується:

$ sh myscript
I am at the end of the script.
It's a trap!

Ви модифікуєте скрипт, щоб додати функцію, яка генерує деякий вихід, який в кінцевому підсумку переходить в іншу команду, наприклад:

#!/bin/bash

mytrap () {
  echo "It's a trap!" >&2
}

myfunc () {
  echo "I've got a bad feeling about this..."
}

trap mytrap exit

myfunc | cat > /dev/null

echo I am at the end of the script.

Через "pipe" код у myfuncзапускається в нижній частині корпусу ... і, здається, не буде успадковано trapповедінку батьків, і якщо ви виконайте якісь дії, які повинні бути очищені вашим треп-кодом, який виграв " t трапляється.

Тож ви спробуйте це:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
}

І воно все ще не спрацьовує mytrapпри запуску нижньої оболонки. Виявляється, вам потрібно явне exit, як ось це:

myfunc () {
  trap mytrap EXIT
  echo "I've got a bad feeling about this..."
  exit
}

З вищезазначеним кодом, mytrapспрацьовує належним чином після виходу з нижньої частини:

$ sh myscript 
It's a trap!
I am at the end of the script.
It's a trap!

Це очікувана поведінка? Мене тут здивувало кілька речей:

  • trap налаштування не успадковувались підзаголовками
  • Неявний вихід з підшару не здається, що викликає EXIT пастку

Відповіді:


8

Баш trapвбудований дозволяє ключове слово RETURN. Отже, зміни:

trap mytrap EXIT

до:

trap mytrap RETURN

Дивіться обговорення trapв оболонці

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