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:
将局部变量的值传递给陷阱处理程序的最佳方法是什么?变量是立即扩展还是在函数末尾扩展(如果后者对于局部变量不可能)对我来说并不重要。
我尝试过的:
通过删除将变量变成全局变量
local
。这可行,但我对此解决方案不满意,因为我不想污染全局名称空间。直接将变量传递给处理程序:
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
),我假设该值被解释为信号名称。有没有办法将命令与信号名称分开?将 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