我有两个shell脚本。其中一个我有:
export FOO="yes"
sh another.sh &
# ops ...
export FOO=0
在another.sh
我有:
while [[ $FOO -eq "yes" ]]
do
# something ...
done
问题是,当第一个脚本完成设置FOO=0
时,FOO
中another.sh
的值继续为"yes"
。我想知道如何获取更新的FOO
,以便我可以弄清楚第一个脚本(调用者)何时完成。
答案 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)