Скажімо, у вас є сценарій оболонки, який запускає якийсь код очищення через 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пастку