【问题标题】:Changing parent's trap handler in child bash process在子 bash 进程中更改父级的陷阱处理程序
【发布时间】:2013-07-25 19:57:46
【问题描述】:

我有一个 bash 函数,它被 bash 脚本作为子进程(虽然是反引号)调用。有没有办法让这个函数(在子进程中运行)修改 parent 的 陷阱处理程序?此函数创建一个临时文件,我希望在父级退出时对其进行清理。举个例子

function get_roe_dir() {
    tmp_dir=`mktemp -d`
    if [ $? -eq 0 ]; then
        # some processing on $tmp_dir
        echo "$tmp_dir"
        # Add "rm -rf $tmp_dir" to parent's EXIT trap
    fi
}

然后,在调用脚本中,我有类似的内容:

roe_dir=`get_roe_dir`
# Some processing using files in $roe_dir.

一旦此脚本退出,我希望 $roe_dir 被删除(使用 EXIT 陷阱)。有什么干净的方法可以实现这一目标吗?

我无法将 EXIT 陷阱添加到 get_roe_dir() 函数,因为它在子 shell 中执行以捕获输出。因此,一旦get_roe_dir() 返回,子shell 就会退出并调用EXIT 陷阱,删除它创建的临时目录。

【问题讨论】:

  • 不,无法修改父环境中的任何内容。
  • 不太明白你想要什么。为什么没有在get_roe_dir 中设置陷阱处理程序?发布更精确的问题(两个脚本的片段 - 父/子)。

标签: bash signals child-process bash-trap


【解决方案1】:

可能不太明白,但接下来的作品:

set_trap() {
    trap "rm -rf $roe_dir" 0
}

get_roe_dir() {
    dir=$(mktemp -d /tmp/roe.XXXXXX) && echo $dir && return 0
    return 1
}

roe_dir=$(get_roe_dir) && set_trap
ls -la "$roe_dir"
echo going to exit - check ls -l $roe_dir should not exists

【讨论】:

  • 我将尝试澄清上述问题,但我希望get_roe_dir 设置陷阱。您的示例有效,但它依赖于函数的调用者也调用set_trap(),这是我希望避免的。谢谢!
  • 你想要的都是不可能的。孩子不能修改父母。
猜你喜欢
  • 2018-04-11
  • 2017-02-15
  • 2023-03-13
  • 2018-08-09
  • 2019-05-20
  • 2013-04-13
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多