[英]Exit hook working both on Bash and ZSH
我需要创建一个脚本,该脚本基本上设置一些env变量,启动一个子外壳,并在退出时运行一些附加代码作为一个钩子。 它需要同时在Bash和ZSH上运行,而且我知道也许我应该维护两个不同的脚本。
我需要它的原因是创建某种引导脚本。 例如,我创建了一个名为Bootstrap.sh的文件,其中包含两个函数start
和exit
,并且在运行脚本时,应该调用start
并激活一个新的子shell。 子外壳程序退出时,将最终调用exit
。 例如:
# Bootstrap.sh
start() {
export CUSTOM_VAR="hello world"
}
exit() {
echo "byebye"
}
$引导程序
$#找到“ Bootstrap.sh”,加载它,然后调用“ start”函数
(myenv)$ echo $ CUSTOM_VAR
你好,世界
(myenv)$出口
byebye#这是我的出口钩
$#回到“普通”外壳
我正在基于改进Python的virtualenv的建议使用此脚本测试钩子。 在此文件中,我尝试使用陷阱(a)和TRAPEXIT(b),但没有一个起作用:
# (a), the "bash way", I think
my_hook() {
echo "exit hook called"
}
trap my_hook EXIT
exec "${@:-$SHELL}"
# (b), as explained in ZSH documentation
# http://zsh.sourceforge.net/Doc/Release/Functions.html
TRAPEXIT() {
echo "exit hook called"
}
exec "${@:-$SHELL}"
那么,我该如何做(如果可能,在ZSH和Bash中)?
根据ZSH手册页,ZSH还支持内置trap
。 那是,
trap 'any code here' EXIT
在ZSH上也可以使用,并且ofc您可以将函数名称作为代码字符串。
如果您需要包装exec,则以下内容应同时适用于bash和zsh
function exec {
echo "Execcing"
builtin exec "$@"
}
问题是最后的“执行”。 这(显然)不算作退出。 当然,替换过程不会继承shell的退出处理程序。
解决方案:更换
exec "${@:-$SHELL}"
通过
"${@:-$SHELL}"
PS:我说的很明显 ,因为我从不怀疑它是否会(我的意思是算作退出)。 我不得不尝试一下,但这是有道理的,该执行程序与退出无关。 该过程仅在'{@:-$ SHELL}'终止时退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.