我有功能,我希望它有时会挂起.所以我设置了一个全局变量然后读取它,如果它在几秒钟之后没有出现我放弃了.下面不是完整的代码,但是它不起作用,因为我没有将$ 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)
您inner在后台运行函数调用,这意味着START将在当前 shell 启动的子 shell 中分配。在该子shell中,该START值将为5。
但是在您当前的 shell 中,它echo的START值仍然是0. 由于更新START只会在子shell中。
每次你在后台启动一个shell,就像fork一个新进程,它会复制所有当前shell环境,包括变量值,新进程将与你当前的shell完全隔离。
由于子shell 已经被派生为一个新进程,因此无法直接更新父shell 的START值。一些替代方法包括在运行inner函数的子shell退出时传递信号。
exportexport只能用于使变量名称可用于从当前 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)