1

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

export FOO="yes"
sh another.sh &

# ops ...

export FOO=0

another.sh我有:

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

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

4

3 回答 3

2

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

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

于 2013-10-08T15:34:31.850 回答
1

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

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

另一个.sh:

sh first.sh &
CHILDPID=$!

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

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

于 2013-10-08T16:46:45.273 回答
0

管道 `while-read' 循环启动子shell 尝试使用其他循环机制来代替类似的东西:

while read fileName do ......... done <(ls -1tr $SOURCE_DIR)

于 2013-10-08T19:29:32.363 回答