bash脚本中的Ctrl-C


22

如何在bash脚本中实现ctrl+ c处理,以使脚本以及该脚本当前运行的命令被中断?

(想象一下,有一个脚本执行一些长时间运行的命令。用户按下ctrl+ c并中断该命令,但脚本继续执行。)我需要它的行为使其被杀死。


1
如果您的操作系统启用了作业控制,则另一个选择是停止该脚本(通常使用crtl-z)。您可以使用继续在后台执行该任务,使用bg杀死该任务或在前台继续进行该任务fg。请参阅bash联机帮助页JOB CONTROL
ott-- 2011年

Answers:


25

为此,您可以创建一个子例程,在收到SIGINT时要调用该子例程,并且需要运行trap 'subroutinename' INT

例:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
请注意,EXIT在脚本退出时,无论脚本如何停止,您都可以随时执行某些操作。(KILL除外,当然。)
Blrfl

万分谢意!但是,当“睡眠”被杀死时,shell仍然可以在陷阱例程运行时设法执行下一条命令:在这种情况下为“ echo” ...还是我错了?
kolypto 2011年

那应该不可能,不。它不会并行执行任务。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.