Выход после ловушек

Возьмите этот script

#!/bin/sh

fd ()
{
  echo Hello world
  exit
}

trap fd EXIT INT

for g in {1..5}
do
  echo foo
  sleep 1
done

Я бы хотел, чтобы fd срабатывал один раз, либо из Control-C, либо если script завершается нормально. Однако, если вы нажмете Control-C, он будет работать дважды. Как я могу это исправить?

Ответ 1

Сделайте каскадные ловушки. exit 127 запускает ловушку EXIT и устанавливает код выхода на 127, поэтому вы можете сказать

#!/bin/sh

fd () {
  echo Hello world
  # No explicit exit here!
}

trap fd EXIT
trap 'exit 127' INT

Я помню, как я узнал об этом из сценариев других людей после того, как в течение нескольких лет боролся с различными обходными решениями вашей проблемы. После этого я заметил, что некоторые учебники объясняют эту технику. Но он не документирован четко, например. Bash справочная страница IMHO. (Или это было не тогда, когда мне это нужно. Возможно, некоторые вещи не меняются через 15 лет...: -)

Ответ 2

как насчет переопределения ловушки по умолчанию?

#!/bin/sh

fd () {
   echo Hello world
   trap - EXIT
   exit 127
}

trap fd INT EXIT