加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux – 在bash中设置全局变量

发布时间:2020-12-31 01:42:31 所属栏目:Linux 来源:网络整理
导读:我有功能,我希望它有时会挂起.所以我设置了一个全局变量然后读取它,如果它在几秒钟之后没有出现我放弃了.下面不是完整的代码,但是它不起作用,因为我没有将$START作为值5 START=0ineer(){ sleep 5 START=5 echo "done $START" == I am seeing here it retur

我有功能,我希望它有时会挂起.所以我设置了一个全局变量然后读取它,如果它在几秒钟之后没有出现我放弃了.下面不是完整的代码,但是它不起作用,因为我没有将$START作为值5

START=0
ineer()
{
    sleep 5
    START=5
    echo "done $START"   ==> I am seeing here it return 5
    return $START
}
echo "Starting"
ineer &

while true
do
    if [ $START -eq 0 ]
    then
        echo "Not null $START"  ==> But $START here is always 0
    else
        echo "else $START"
        break;
    fi
    sleep 1;
done

解决方法

你在后台运行内部函数调用,这意味着START将在当前shell启动的子shell中分配.在该子shell中,START值为5.

但是在当前的shell中,它回显了START值,它仍然是0.因为START的更新只会在子shell中.

每次在后台启动shell时,它就像fork一个新进程,它将复制所有当前shell环境,包括变量值,并且新进程将完全与当前shell隔离.

由于子shell已作为新进程分叉,因此无法直接更新父shell的START值.一些替代方式包括当运行内部函数的子shell退出时传递的信号.

常见错误:

出口

export只能用于使变量名可用于从当前shell派生的任何子shell.然而,一旦子壳已分叉.子shell将具有变量和值的新副本,对shell中导出变量的任何更改都不会影响子shell.

请参阅以下代码了解详情.

#!/bin/bash
export START=0
ineer()
{
    sleep 3
    export START=5
    echo "done $START"  # ==> I am seeing here it return 5
    sleep 1
    echo "new value $START"
    return $START
}
echo "Starting"
ineer &

while true
do
    if [ $START -eq 0 ]
    then
        echo "Not null $START" #  ==> But $START here is always 0
        export START=10
        echo "update value to $START"
        sleep 3
    else
        echo "else $START"
        break;
    fi
    sleep 1;
done

(编辑:云计算网_泰州站长网)

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

    热点阅读