LINUX.ORG.RU

shell trap не срабатывает

 


0

3
#!/bin/sh

set -e

trap 'echo TRAP' INT TERM HUP

sleep 1000



Запускаю, нажимаю Ctrl+C - скрипт прерывается и тишина, никаких сообщений. Система Ubuntu 14.04, /bin/sh - ссылка на /bin/dash. Как сделать правильно, используя dash?

Ответ на: комментарий от former_anonymous

На самом деле исполнение trap в shell - действие отложенное, в отличие от обработки сигнала. sleep у тебя, получив SIGINT, завершается с ненулевым кодом, после чего скрипт при 'set -e' немедленно завершается, а выполняется ли при этом запланированный trap, зависит от реализации, в dash и posh - нет. Например, замени sleep на 'if sleep ; then : ; else exit ${?} ; fi'

ABW ★★★★★
()
Ответ на: комментарий от ABW

а выполняется ли при этом запланированный trap, зависит от реализации

dash утверждает, что он POSIX-compliant. Почему это где-то работает, а где-то нет?

И на закуску: если в список сигналов добавить EXIT, то trap срабатывает, но ДВА раза. Первый раз реагируя на INT, второй раз - на EXIT. Без EXIT trap не срабатывает ни разу. Что это за магия?

former_anonymous ★★★
() автор топика
Ответ на: комментарий от former_anonymous

Это же шелл, один из самых бестолковыхсуровых и беспосщадных ЯП. В общем, жуткое легаси и всё такое.

true_admin ★★★★★
()
Ответ на: комментарий от former_anonymous

Тебе выше объяснили, как работает trap. Представь, что есть некий «стек» отложенных действий. без TRAP на EXIT set -e вызывает этот самый exit сразу после прерывания sleep, если стоит trap на сам exit, то дёргается этот самый «стек», откуда «выталкиваются» все неуспевшие сработать действия.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

без TRAP на EXIT set -e вызывает этот самый exit сразу после прерывания sleep

понятно. Достаточно странная архитектура.

former_anonymous ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.