2013-10-08 312 views
1

我有两个shell脚本。在其中的一个,我有:环境变量不更新

export FOO="yes" 
sh another.sh & 

# ops ... 

export FOO=0 

another.sh我:

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

的事情是,当第一个脚本完成后,设置FOO=0FOOanother.sh值继续导"yes"。我想知道如何获得更新的FOO,这样我就可以知道第一个脚本(调用者)何时完成。

+2

一般而言,您*不能*将环境变量从一个正在运行的shell导出到另一个运行的shell。建议:对于两个独立的shell脚本,请使用命名管道:http://www.linuxjournal.com/content/using-named-pipes-fifos-bash。在这种特殊情况下,你可以通过用'来代替父变量。 another.sh&'(“。”而不是“sh”)。 – paulsm4

+1

变量值在脚本启动时设置,然后不能从外部更改。你需要一些其他的共享数据的外部方法,比如某个文件。 –

回答

2

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

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

+0

我之前想过这样做,但不喜欢创建文件的想法。但最终我用这个方法来实现我的目标。 –

1

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

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

another.sh:

sh first.sh & 
CHILDPID=$! 

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

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

+0

+1,但我不想改变父母/子女的关系。 –

0

管道输送`而读”循环开始壳层 尝试使用,而不是 东西像其他循环机制:

同时读取文件名 做 ......... 做< <(LS -1tr $ SOURCE_DIR)