Answers:
按Ctrl+时C,SIGINT
信号将传递到整个前台处理组。在这里,它被发送到find
进程和调用shell进程。find
通过立即退出做出反应,而外壳通过调用陷阱做出反应。
如果陷阱中的代码返回(即未调用exit
),则在被信号中断的命令之后执行命令。在此,find
命令到达脚本末尾后,脚本无论如何都会立即退出。但是您可以通过添加另一个命令来看到输入0和1之间的区别:
find /
echo "find returned $?"
你可以做你想做的; 但是我的答案的这一部分更多地是关于发现shell编程而不是解决实际问题。
如果您要避免杀死病毒find
,您需要在后台启动它:find / &
。然后使用wait
内置函数等待其正常退出。信号将中断wait
内置信号,您可以循环运行该信号,直到收到要传播的信号为止。然后kill
用来杀死工作。
hell () {
echo "Do you want to quit? Press 1 for yes and 0 for no"
read n
if [ "$n" = 1 ]; then
# Kill the job if it's running, then exit
if [ -n "$job_pid" ]; then kill $job_pid; fi
exit 1
fi
}
job_pid=
trap "hell" SIGINT
# Start a demo job in the background
for i in 1 2 3 4 5; do date; sleep 1; done &
job_pid=$!
# Call wait in a loop; wait will return 0 if the job exits, and 128+$signum if interrupted by a signal.
while ! wait; do
echo "resuming wait"
done
job_pid=
echo last exit code: $?
Shell中此方法有局限性:
job_pid=
$jobpid
wait
SIGCHLD
wait $job_pid
表格。但是,那么您就无法将“ wait
被信号打断”与“该工作被信号杀死”(也无法区分“ 该工作以返回状态≥128自行终止”),但这是shell中的普遍事实编程)。要克服这些限制,请使用像Perl或Python这样的高级语言。