Bash:有 CTRL-C 时如何中断此脚本?

标签 bash interrupt copy-paste

我写了一个小的 Bash 脚本来查找所有包含参数中传递的字符串的 Mercurial 变更集(从提示开始):

#!/bin/bash

CNT=$(hg tip | awk '{ print $2 }' | head -c 3)
while [ $CNT -gt 0 ]
do
    echo rev $CNT
    hg log -v -r$CNT | grep $1       
    let CNT=CNT-1
done

如果我通过按 ctrl-c 来中断它,则当前执行的命令通常是“hg log”,并且正是该命令被中断,但随后我的脚本继续执行。

当时我正在考虑检查“hg log”的返回状态,但是因为我正在将它传送到 grep 中,所以我不太确定如何去做......

当它被中断时,我应该如何退出这个脚本? (顺便说一句,我不知道该脚本是否适合我想做的事情,但它完成了工作,而且我对“中断”问题很感兴趣)

最佳答案

放置在脚本的开头:trap 'echo interrupted;退出' INT

编辑:如以下评论所述,由于管道的原因,可能不适用于 OP 的程序。 $PIPESTATUS 解决方案有效,但将脚本设置为在管道中的任何程序以错误状态退出时退出可能更简单:set -e -o pipefail

关于Bash:有 CTRL-C 时如何中断此脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2551614/

相关文章:

bash - 在bash脚本中获取最后执行的命令名称

git - 设置路径变量

linux - 添加一个用户并为许多服务器linux给他相同的密码

memory - 如何实现/设置数据断点?

c - 内核模块 : request_irq() returns -22, 中的中断处理无效参数

android - Gradle 在编译时将文件从资源复制到 Assets

mysql - 如何在使用 shell 脚本将 csv 插入 mysql 时删除第一行

c - 用 C 语言完成的 IDT 不起作用

emacs - emacs 中不止一个kill-ring

linux - 复制文件的特定字段并将其粘贴到另一个现有文件的另一个特定字段 - lunx 命令