环境变量不会更新

时间:2013-10-08 15:27:33

标签: linux bash shell

我有两个shell脚本。其中一个我有:

export FOO="yes"
sh another.sh &

# ops ...

export FOO=0

another.sh我有:

while [[ $FOO -eq "yes" ]]
do
# something ...
done

问题是,当第一个脚本完成设置FOO=0时,FOOanother.sh的值继续为"yes"。我想知道如何获取更新的FOO,以便我可以弄清楚第一个脚本(调用者)何时完成。

3 个答案:

答案 0 :(得分:2)

子进程接收其父级环境的副本,而不是对原始环境的引用。如果父项在子项仍在运行时更改,则子项仍在其内存空间中具有原始值。

作为一种变通方法,您可以让父级在退出之前在已知位置创建一个空文件,并让子级查找要创建的文件。它不是很健壮,但它是一种简单的进程间通信形式,可能就足够了。

答案 1 :(得分:1)

这是不可能的:父级环境的更改不会传递给子进程。

您是否考虑过改变父母与子女的关系?如果孩子正在等待父母完成,为什么不从子脚本中调用父脚本?假设您的第一个脚本被称为“first.sh”,类似于

another.sh:

sh first.sh &
CHILDPID=$!

while ! (ps -p $CHILDPID | grep $CHILDPID)
do
[...]
done

使用作业控制(在bash中使用set -m)可能是另一种解决方案。

答案 2 :(得分:0)

Piped`while-read'循环开始子shell 尝试使用其他循环机制 类似的东西:

同时读取fileName 做 ......... 完成< <(ls -1tr $ SOURCE_DIR)