我需要创建一个基本上设置一些环境变量的脚本,启动一个子shell,并在退出时运行一些额外的代码,作为一个钩子。它需要同时在 Bash 和 ZSH 上工作,而且我知道也许我应该维护两个不同的脚本。
我需要它的原因是创建某种引导脚本。例如,我创建了一个名为Bootstrap.sh的文件,其中包含两个函数start
和exit
,当我运行脚本时,start
应该调用它并激活一个新的子 shell。当子shell 退出时,exit
, 最终被调用。例如:
# Bootstrap.sh
start() {
export CUSTOM_VAR="hello world"
}
exit() {
echo "byebye"
}
$ bootstrap
$ # 找到“Bootstrap.sh”,加载它,然后调用“start”函数
(myenv) $ echo $CUSTOM_VAR
hello world
(myenv) $ exit
byebye # 这是我的退出钩子
$ # 回到“正常”shell
根据改进 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 中)?