加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何打破源Bash脚本的功能

发布时间:2020-12-15 22:51:39 所属栏目:安全 来源:网络整理
导读:我有一个源代码的 Bash脚本.当这个脚本来源时,它在Bash脚本中运行一个函数.如果匹配某个条件,此函数应终止脚本.如何在不终止脚本所在的shell的情况下完成此操作? 要明确:我希望终止操作由源shell脚本中的函数完成,而不是在源shell脚本的主体中完成.我可以
我有一个源代码的 Bash脚本.当这个脚本来源时,它在Bash脚本中运行一个函数.如果匹配某个条件,此函数应终止脚本.如何在不终止脚本所在的shell的情况下完成此操作?

要明确:我希望终止操作由源shell脚本中的函数完成,而不是在源shell脚本的主体中完成.我可以看到的问题是,返回只是从函数返回到脚本的main,而exit 1终止了调用shell.

以下最小示例说明了此问题:

main(){
    echo "starting test of environment..."
    ensure_environment
    echo "environment safe -- starting other procedures..."
}

ensure_environment(){
    if [ 1 == 1 ]; then
        echo "environment problemm -- terminating..."
        # exit 1 # <-- terminates calling shell
        return   # <-- returns only from function,not from sourced script
    fi
}

main

解决方法

这是一个如何使用您的方法实现目标的方法.我不会为你编写代码,只是描述它是如何完成的.

您的目标是通过有效地获取可能复杂的shell脚本来设置/更改当前bash shell中的环境变量.此脚本的某些组件可能决定应停止执行此源脚本.使这个复杂化的原因是这个决定不一定是顶级的,但可能位于嵌套的函数调用中.返回,然后,没有帮助,退出将终止采购外壳,这是不希望的.

您的此声明使您的任务变得更容易:

additional complexity that I can’t really include in a minimal example
makes it very desirable to centralise the termination procedure in a
function.

这是你如何做到的:

您可以获取另一个脚本“ipcscript.bash”,而不是寻找决定将哪个环境设置为什么(“realscript.bash”)的真实脚本.

ipcscript.bash将设置一些进程间通信.这可能是您使用exec打开的一些额外文件描述符上的管道,它可能是一个临时文件,它可能是其他内容.

然后ipcscript.bash将启动realscript.bash作为子进程.这意味着,realscript.bash首先只会影响bash的子进程实例的环境.将realscript.bash作为子进程启动,您可以使用exit终止任何嵌套级别的执行,而不会终止sourcing shell.

当您编写时,您的退出调用将在一个集中函数中生效,该函数在决定终止执行时从任何级别调用.在退出之前,您的终止功能现在需要以适当的格式将当前环境写入IPC机制.

ipcscript.bash将从IPC机制中读取环境设置,并在源代码shell的过程中重现所有设置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读