В моем скрипте 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
Любая идея, какУдастся ли это как-то неплохо?
Изменения применяются на основе ответов:
#! /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 subshell, так что мы почти на месте - просто странное поведение чтения ..