Бывает, что tail
умирает из-за CTRL+C, но он также отправляется (SINGINT) родителю, bash
. Так как по умолчанию bash умирает при получении такого сигнала, вы должны заменить поведение bash
по умолчанию, когда его получаете.
Используйте встроенную команду trap от bash(1)
чтобы изменить это.
Следующий скрипт tailf-ctrl.sh
является демо-версией и показывает ответ:
#!/bin/bash
function finish {
echo "CTRL-C pressed!"
}
F=testfile
echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT
echo "Hello after" > after
cat after
Обратите внимание, что:
- SIGINT - это сигнал, связанный с CTRL+C
- первая ловушка устанавливает пользовательское действие, связанное с сигналом SIGINT
- поведение по умолчанию для второй ловушки сброса сигнала SIGINT
Вывод скрипта:
$ bash tailf-ctrl.sh
hello
^CCTRL-C pressed!
Hello after
это показывает, что второй файл написан так, что конец скрипта достигается, когда tail
умирает из-за CTRL-C
.
если вы закомментируете первую команду trap, вы увидите, что ваша проблема появляется: bash немедленно завершается, и вывод должен быть:
$ bash tailf-ctrl.sh
hello
^C
$