Правильный способ использовать ловушку для выхода из shell-скрипта в ZSH? - PullRequest
1 голос
/ 25 января 2020

У меня проблемы с получением функции прерывания в скрипте Zshell для работы без выхода из оболочки. У меня есть простой таймер обратного отсчета, который я хочу иметь возможность прерывать, используя ^ C, и когда я хочу, чтобы ловушка изменила состояние курсора в терминале.

Мой синтаксис:

#! / Bin / zsh

trap 'tput cnorm; exit' INT TERM

Я также пробовал:

trap 'tput cnorm; kill -9 $$' INT TERM

Оба прерывания выйти из оболочки полностью. Как мне только выйти из скрипта и вернуться в командную строку?

Любое руководство будет оценено больше всего!

1 Ответ

0 голосов
/ 27 января 2020

Обработка сигналов с ловушкой

TRAPINT() {
    echo "TRAPINT() called: ^C was pressed"
}

TRAPQUIT() {
    echo "TRAPQUIT() called: ^\\ was pressed"
}

TRAPTERM() {
    echo "TRAPTERM() called: a 'kill' command was aimed at this program's process ID"
}

TRAPEXIT() {
    echo "TRAPEXIT() called: happens at the end of the script no matter what"
}

for i in {1..9}; do
    echo ${i}
    sleep 1
done

Для всех этих TRAP[NAL]() функций, если последняя команда return 0 (или если вообще нет оператора возврата, выполнение кода будет продолжено там, где программа остановилась, как если бы сигнал был принят, перехвачен и обработан. Если состояние возврата этой функции не равно нулю, то состояние возврата прерывания сохраняется, и выполнение команды, которое ранее имело место, будет Вы можете сделать return $((128+$1)), чтобы вернуть тот же статус, как если бы сигнал не был перехвачен

Относительно того, почему ваша оболочка убивается, это потому, что вызов kill -9 $$ отправит сигнал 9 на Идентификатор процесса, связанный с вашей оболочкой. Сигнал № 9 или SIGKILL - это единственный сигнал, который не может быть обработан с помощью ловушек. Это своего рода «убийство последней инстанции», если программа действительно должна быть немедленно остановлена ​​без очистки допускается.

...