如何在 bash 中将局部变量传递给陷阱处理程序

如何在 bash 中将局部变量传递给陷阱处理程序

bash 函数中声明的局部变量似乎对被调用函数可见,但对陷阱处理程序不可见:

#!/bin/bash

function exit_handler() {
  echo "Exit handler: ${device_name}"
}

function other() {
  echo "Other: ${device_name}"
}

function do_something() {
  local device_name="abc"
  trap exit_handler EXIT
  other
}

do_something

输出:

$ bash test.sh 
Other: abc
Error handler: 

将局部变量的值传递给陷阱处理程序的最佳方法是什么?变量是立即扩展还是在函数末尾扩展(如果后者对于局部变量不可能)对我来说并不重要。

我尝试过的:

  1. 通过删除将变量变成全局变量local。这可行,但我对此解决方案不满意,因为我不想污染全局名称空间。

  2. 直接将变量传递给处理程序:

    function exit_handler() {
      local device_name="${1}"
      echo "Error handler: ${device_name}"
    }
    
    function do_something() {
      local device_name="abc"
      trap exit_handler "${device_name}" EXIT
    }
    

    这不起作用(invalid signal specification),我假设该值被解释为信号名称。有没有办法将命令与信号名称分开?

  3. 将 trap 命令放入单引号中(这是由shellcheck):

    function exit_handler() {
      local device_name="${1}"
      echo "Exit handler: ${device_name}"
    }
    
    function do_something() {
      local device_name="abc"
      trap 'exit_handler "${device_name}"' EXIT
    }
    

    但这仍然在退出处理程序中给我一个空输出。所以我认为局部变量可能活得不够长。

答案1

解决方案 3. 非常接近,您必须在函数上下文中评估变量do_something

这是您更新的示例:

#!/bin/bash

function exit_handler() {
  local device_name="${1}"
  echo "Exit handler: ${device_name}"
}

function other() {
  echo "Other: ${device_name}"
}

function do_something() {
  local device_name="abc"
  trap "exit_handler '${device_name}'" EXIT
  other
}

do_something

相关内容