繁体   English   中英

出口挂钩可在Bash和ZSH上使用

[英]Exit hook working both on Bash and ZSH

我需要创建一个脚本,该脚本基本上设置一些env变量,启动一个子外壳,并在退出时运行一些附加代码作为一个钩子。 它需要同时在Bash和ZSH上运行,而且我知道也许我应该维护两个不同的脚本。

我需要它的原因是创建某种引导脚本。 例如,我创建了一个名为Bootstrap.sh的文件,其中包含两个函数startexit ,并且在运行脚本时,应该调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM