В моем сценарии 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, так что мы почти на месте - просто странное поведение чтения ..