在bash中设置全局变量

esw*_*aat 6 linux bash shell

我有功能,我希望它有时会挂起.所以我设置了一个全局变量然后读取它,如果它在几秒钟之后没有出现我放弃了.下面不是完整的代码,但是它不起作用,因为我没有将$ 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
Run Code Online (Sandbox Code Playgroud)

Kun*_*ing 6

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

但是在您当前的 shell 中,它echo的START值仍然是0. 由于更新START只会在子shell中。

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

由于子shell 已经被派生为一个新进程,因此无法直接更新父shell 的START值。一些替代方法包括在运行inner函数的子shell退出时传递信号。

常见错误:

export

export只能用于使变量名称可用于从当前 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
Run Code Online (Sandbox Code Playgroud)