我需要知道是否可以使用ESC
或ENTER
等键来中断bash脚本?通过发送SIGINT /CTRL + C
我能够做到,但由于某些原因(在最后一行检查说明)我无法使用CTRL +C
。所以我需要一些自定义方式来引起中断。
换句话说:在以下脚本中,按下cleanup
时会调用CTRL + C
函数。现在需要修改此行为,以便在按下cleanup
或ENTER
等某些键时调用ESC
函数。
cleanup() {
#do cleanup and exit
echo "Cleaning up..."
exit;
}
echo "Please enter your input:"
read input
while true
do
echo "This is some other info MERGED with user input in loop + $input"
sleep 2;
echo "[Press CTRL C to exit...]"
trap 'cleanup' SIGINT
done
原因:此脚本是从另一个具有自己的陷阱处理的C ++程序调用的。因此,此脚本的陷阱处理与父程序冲突,最终终端挂起。在我的组织中,程序的代码被冻结,所以我不能改变它的行为。我只需调整这个子脚本。
答案 0 :(得分:1)
以下作品^ M表示ENTER和^ [表示ESC但可能
stty intr ^M
stty intr ^[
但之后无法使用ENTER 恢复默认
stty intr ^C
评论之后,因为shell是交互式的,要求继续而不是使用陷阱,也可以在特殊的EXIT陷阱中完成清理。
How do I prompt for Yes/No/Cancel input in a Linux shell script?
或使用select
的另一种解决方案echo "Do you want to continue?"
PS3="Your choice: "
select number in Y N;
do
case $REPLY in
"N")
echo "Exiting."
exit
;;
"Y")
break
;;
esac
done
# continue
答案 1 :(得分:0)
这是一个脏技巧,它正在我的工作中做得很好。 read
和case
语句选项是关键。在这里,我将超时read
命令,以便在按下esc
或enter
时继续为true。
cleanup() {
#do cleanup and exit
echo "Cleaning up..."
exit;
}
exitFunction()
{
echo "Exit function has been called..."
exit 0;
}
mainFunction()
{
while true
do
echo "This is some other info MERGED with user input in loop"
IFS=''
read -s -N 1 -t 2 -p "Press ESC TO EXIT or ENTER for cleanup" input
case $input in
$'\x0a' ) cleanup; break;;
$'\e' ) exitFunction;break;;
* ) main;break;;
esac
done
}
mainFunction