【问题标题】:Bash trap on exit from function退出函数时的 Bash 陷阱
【发布时间】:2017-08-24 12:46:03
【问题描述】:

bash 中是否有可能在函数退出时调用某些命令。我的意思是:

function foo
{
    # something like this maybe?
    trap "echo \"exit function foo\"" EXIT

    # do something
}

foo

我想打印出退出函数 foo。

【问题讨论】:

  • 我需要这个用于不同的上下文,因为我的陷阱从 bash_profile 函数泄漏到我的正常 shell 中,我需要在函数终止之前捕获并重置它们。不管谢谢谢谢谢谢你问这个!
  • 不客气 :)

标签: bash function exit


【解决方案1】:

是的,你可以诱捕RETURN

$ function foo() {
>   trap "echo finished" RETURN
>   echo "doing some things"
> }
$ foo

会显示

doing some things
finished

来自man bashtrap 内置函数的描述:

如果 sigspec 为 RETURN,则每次使用 .或源内置完成执行。

【讨论】:

  • 你能不能同时捕获这个函数的返回码?
  • 否;如果您想根据即将到来的函数返回码采取不同的操作,则需要使用ifcase 之类的条件。还要注意,trap 全局设置处理程序,因此在调用foo 之前存在的RETURN 上的任何陷阱都会在调用foo 时被替换(假设foo 的主体是{ ... }命令;foo () ( trap ...; ) 不会影响调用上下文)。
  • 也就是说,除了RETURN 上的陷阱之外,您还可以陷阱ERR 以触发任何非零返回状态。您不能为返回码 1 和返回码 2 设置不同的陷阱。
  • @bercik 不,你不能。即使使用隐式返回,陷阱命令中的$? 也不会包含在函数范围内执行的最后一个命令的成功值。如果您想要跟踪函数执行的开始/结束和结果,还有其他替代陷阱的方法
  • 使用EXIT在脚本没有运行但脚本退出时调用处理程序。
【解决方案2】:

关于使用 Ctrl+c 退出(不声明另一个函数退出):

#!/bin/bash
function do_stuff() {
  function do_stuff_end() {
    # the code for exiting the function here
    echo "<the code for exiting the function here>"
    unset -f do_stuff_end
    trap "$trap_sigint" SIGINT
    return
  }
  trap_sigint="$(trap -p SIGINT)"
  trap "do_stuff_end; return" SIGINT
  # the code for the function here
  echo "<the code for the function here>"
  do_stuff_end
}

注意:之前的代码“只是”工作,但需要考虑除 SIGINT 之外的其他信号的影响来改进

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多