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