【问题标题】:Exit hook working both on Bash and ZSH退出钩子适用于 Bash 和 ZSH
【发布时间】:2013-08-14 00:23:39
【问题描述】:

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

我需要它的原因是创建某种 bootstrap 脚本。例如,我创建了一个名为 Bootstrap.sh 的文件,其中包含两个函数 startexit,当我运行脚本时,应该调用 start 并激活一个新的子 shell。当子shell 退出时,exit 最终被调用。例如:

# Bootstrap.sh
start() {
    export CUSTOM_VAR="hello world"
}

exit() {
    echo "byebye"
}

$ 引导程序
$ # 找到“Bootstrap.sh”,加载它,然后调用“start”函数
(myenv) $ echo $CUSTOM_VAR
你好世界
(myenv) $ 退出
byebye # 这是我的退出钩子
$ # 回到“正常”的shell

根据改进 Python 的 virtualenv 的建议,我正在使用 this script 测试钩子。在此文件中,我尝试使用陷阱 (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 中)?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于 Unix/Linux 的外壳
  • @LucM,我不明白。这不是技术问题吗?
  • 这仅意味着您的问题不适合这里,因为它与编程无关。恕我直言,您的问题应该在 StackExchange 网络的另一个站点上提出:Unix&Linux
  • 啊,好的,谢谢你的提示=D
  • @LucM:哦不!这是关于编程(外壳,它是),并将问题重铸为“出于陷阱的目的,exec 是否算作退出”,答案应该是什么甚至都不清楚。虽然它可以在其他网站上被问到。

标签: bash shell zsh


【解决方案1】:

根据 ZSH 手册页,ZSH 还支持 trap 内置函数;也就是说,

trap 'any code here' EXIT

也可以在 ZSH 上使用,并且您可以将函数名称作为代码字符串。

如果您需要包装 exec,以下内容应该适用于 bash 和 zsh

function exec {
    echo "Execcing"
    builtin exec "$@"
}

【讨论】:

    【解决方案2】:

    问题是最后的'exec'。这(显然)不算作退出。当然,被替换的进程不会继承 shell 的退出处理程序。

    解决方案:替换

    exec "${@:-$SHELL}"
    

    "${@:-$SHELL}"
    

    PS:我说很明显,因为我从没想过它会不会(我的意思是算作EXIT)。我不得不尝试一下,但按道理,那个 exec 与退出无关。该进程仅在“{@:-$SHELL}”终止时退出。

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 2018-02-21
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多