根据这个问题我敢不允许评论:变量扩展的Bash陷阱?
Is it necessary to specify traps other than EXIT?
恕我直言,这是一个不完整的答案,因为它不包括通常的情况是:
TEMPDIR_OR_FILE=$(mktemp [ some switches and params and an XXX pattern])
# ...so we want trap to do rm -rf ${TEMPDIR_OR_FILE}
给出的例子是:
# reset
trap 'excode=$?; cmd; trap - EXIT; echo $excode' EXIT HUP INT QUIT PIPE TERM
# ignore
trap 'excode=$?; trap "" EXIT; cmd; echo $excode' EXIT HUP INT QUIT PIPE TERM
这里的问题是,单引号阻止你exp anding ${TEMPDIR_OR_FILE}
我认为这是一个复杂因素是变量扩大的时间。我需要${TEMPDIR_OR_FILE}
立即展开,但其他项目可能需要等待陷阱执行。我如何完成这项工作?
由于旁边所有大写名称用于具有对操作系统或系统有意义的变量,而具有至少一个小写字符的名称保留给应用程序使用,并且保证不会修改POSIX指定工具的行为。请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html第四段。 –
这就是说,**为什么要在陷阱被定义时扩展TEMPDIR_OR_FILE,而不是执行它时?稍后在执行时执行此操作(通过将定义放在外部单引号内)可以让您更改正在使用的临时文件。 –
根据我的经验,这不是一个问题。这些变量通常会设置一次,甚至可能只读,然后用于程序的其余部分。延期扩展不会改变任何内容。为什么你需要更快地解析它?我大概可以制定一个kludge,但不愿意增加维护头痛。 –