当 shell 脚本被打断时如何执行命令?

12

当脚本执行中途被打断,例如使用CTRL+C时,我希望能够执行像rm -rf /etc/XXX.pid这样的命令。请问有人可以告诉我应该怎么做吗?

2个回答

24

虽然这可能会让很多人感到震惊,但是您可以使用 bash 内置的 trap 来捕获信号 :-)

至少那些可以被捕获的信号,但是 CTRL-C 通常与 INT 信号绑定。您可以捕获这些信号并执行任意代码。

以下脚本将要求您输入一些文本,然后将其回显给您。如果偶然生成一个 INT 信号,它只会对您发出咆哮声并退出:

#!/bin/bash

exitfn () {
    trap SIGINT              # Restore signal handling for SIGINT
    echo; echo 'Aarghh!!'    # Growl at user,
    exit                     #   then exit script.
}

trap "exitfn" INT            # Set up SIGINT trap to call function.

read -p "What? "             # Ask user for input.
echo "You said: $REPLY"

trap SIGINT                  # Restore signal handling to previous before exit.

以下是测试运行记录(包括完整输入的一行、在输入任何内容之前按下CTRL-C的一行以及在按下CTRL-C之前部分输入的一行):

pax> ./testprog.sh 
What? hello there
You said: hello there

pax> ./testprog.sh 
What? ^C
Aarghh!!

pax> ./qq.sh
What? incomplete line being entere... ^C
Aarghh!!

如何使函数在脚本结束时调用,而不仅仅是通过 ^c 终止? - undefined
1
@MUYBelgium,这应该作为一个问题来提问,而不是作为一个评论提出。但是你可以在EXIT上设置陷阱,以在shell退出时执行代码。 - undefined
在脚本结束之前,是否有必要手动恢复trap SIGINT?如果我在某个地方忘记了它会发生什么? - undefined
@Estecka:虽然清理自己的垃圾是个好习惯,但我相信陷阱属于当前的shell进程(运行脚本的shell),所以当shell退出时会自动消失。这意味着,如果你使用source命令而不是在单独的进程中运行脚本,可能会出现问题。 - undefined

3

trap 用于在脚本中捕获信号,包括按下 Ctrl-C 时产生的 SIGINT 信号。


+1 这样更好了,我本来想建议使用逻辑运算符来链接脚本。 - salezica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接