BASH - использование ловушки ctrl + c

Я пытаюсь выполнить команды внутри script, используя чтение, и когда пользователь использует Ctrl + C, я хочу остановить выполнение команды, но не выйти из script. Что-то вроде этого:

#!/bin/bash

input=$1
while [ "$input" != finish ]
do
    read -t 10 input
    trap 'continue' 2
    bash -c "$input"
done
unset input

Когда пользователь использует Ctrl + C, я хочу продолжить чтение ввода и выполнение других команд. Проблема в том, что когда я использую команду вроде:

while (true) do echo "Hello!"; done;

Он не работает после того, как я набираю Ctrl + C один раз, но работает, как только я набираю его несколько раз.

Ответы

Ответ 1

Вам нужно запустить команду в другой группе процессов, и самый простой способ сделать это - использовать управление заданиями:

#!/bin/bash 

# Enable job control
set -m

while :
do
    read -t 10 -p "input> " input
    [[ $input == finish ]] && break

    # set SIGINT to default action
    trap - SIGINT

    # Run the command in background
    bash -c "$input" &

    # Set our signal mask to ignore SIGINT
    trap "" SIGINT

    # Move the command back-into foreground
    fg %-

done 

Ответ 2

Попробуйте использовать следующий код:

#!/bin/bash
# type "finish" to exit

# function called by trap
other_commands() {
    printf "\rSIGINT caught      "
    sleep 1
    printf "\rType a command >>> "
}

trap 'other_commands' SIGINT

input="[email protected]"

while true; do
    printf "\rType a command >>> "
    read input
    [[ $input == finish ]] && break
    bash -c "$input"
done