Bash, CTRL + C в eval, не прерывая основной сценарий

В моем сценарии bash я запускаю внешнюю команду, которая хранится в переменная $ cmd . (Это может быть что угодно, даже какой-нибудь простой bash oneliner.)

Если ctrl + C нажат во время выполнения скрипта, я хочу, чтобы он убил запущенный в данный момент $ cmd , но он все равно должен продолжить выполнение основного сценария. Однако я хотел бы сохранить возможность убить основной скрипт с помощью ctrl + C , когда основной скрипт запущен.

#!/bin/bash
cmd='read -p "Ooook?" something; echo $something; sleep 4 ' 
while true; do
    echo "running cmd.."
    eval "$cmd"     # ctrl-C now should terminate the eval and print "done cmd"
    echo "done cmd"
    sleep 5         # ctrl-C now should terminate the main script
done

Есть идеи, как это сделать с помощью bash?

Изменения внесены на основе ответов:

#! /bin/bash

cmd='read -p "Ooook1?" something; read -p "Oook2?" ; echo $something; sleep 4 ' 
while true; do
    echo "running cmd.."
    trap "echo Interrupted" INT
    eval "($cmd)"     # ctrl-C now should terminate the eval and print "done cmd"
    trap - INT
    echo "done cmd"
    sleep 5         # ctrl-C now should terminate the main script
done

Теперь, нажав ctrl + C , пока "Ooook1?" read сломает eval только после того, как это чтение будет выполнено. (он прервется непосредственно перед "Oook2") Однако он немедленно прервет "сон 4".

В обоих случаях он поступит правильно - он просто прервет подоболочку eval, так что мы почти на месте - просто странное поведение чтения ..

5
задан Alfe 9 March 2017 в 09:53
поделиться