如果我在退出之前使用trap
了http://linuxcommand.org/wss0160.php#trap上所述的捕获ctrl-c(或类似文件)和清理功能,那么我将更改返回的退出代码。
现在,这在现实世界中可能不会有所作为(例如,因为退出代码不是可移植的,而且如进程终止时默认退出代码中所讨论的那样,退出代码并不总是明确的?),但我仍然想知道是否存在真的没有办法防止这种情况,而是返回被中断脚本的默认错误代码吗?
示例(在bash中,但我的问题不应被视为bash特定):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
输出:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(已删除以使其更符合POSIX。)
(再次编辑以使其成为bash脚本,但是我的问题不是特定于Shell的。)
编辑为使用便携式“ INT”陷阱,而不支持非便携式“ SIGINT”。
编辑以删除无用的花括号并添加潜在的解决方案。
更新:
我现在通过简单地退出一些硬编码的错误代码并捕获EXIT来解决了这个问题。在某些系统上,这可能会出现问题,因为错误代码可能有所不同,或者没有EXIT陷阱,但就我而言,这样就可以了。
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
从当前的协同处理中读取输入。
read
要从当前的协同进程中读取内容,并且trap cmd SIGINT
不会按标准要求使用起作用trap cmd INT
。