在我的 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
现在,在“Ooook1?”时按ctrl+ C只有在读取完成后,read 才会中断 eval。(它会在“Oook2”之前中断)但是它会立即中断“sleep 4”。
在这两种情况下,它都会做正确的事情——它只会中断 eval 子shell,所以我们快到了——只是那种奇怪的读取行为..