#!/bin/sh --
for set_trap_sig in HUP INT QUIT ALRM TERM; do
trap -- '
trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done
sleep 15 || exit "$?"
这是我向脚本发送 SIGINT 时发生的情况
user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution
这个问题似乎是 dash 特有的。在 ash、bash 和 ksh93 上,我没有收到此错误。这特别奇怪,因为我的脚本甚至不包含反引号字符。
如果我删除第 5 行尾随的双引号,$?
错误就会消失。
我是在做一些愚蠢的事情还是冲刺被削弱了?是的,我知道我写的剧本就像一个偏执的精神分裂症患者。
编辑:我们已经确定这是一个非常严重的错误,它甚至会影响现代版本的 Ubuntu 和 Debian。有谁知道解决方法?
这是一个简化的测试用例:
修改引用代码的长度或内容可能会“修复”错误或产生不同且有趣的损坏,随机字节突然出现。
这是由 dash 0.5.9 之后修复的 use-after-free 错误引起的,但它仍然存在于 Debian 9.8 stable(stretch)、Ubuntu 18.04(bionic)和 Ubuntu 18.10(cosmic)的 dash 0.5.8 中.
这是修复它的提交:
一种解决方法是将陷阱处理程序放在一个函数中——以便在取消设置陷阱后不会运行任何命令尝试在释放它之后使用操作字符串: