这是我想要实现的一个例子。
#!/bin/bash
func2() {
myarray=("e" "f")
}
func1() {
myarray=("c" "d")
for i in [1..10]
do
func2 &
done
}
myarray=("a" "b")
func1
echo "${myarray[@]}"
最后的回声应该是
e f
但最终还是
c d
因为&当我调用func2时。如果我拿出&它按预期运行。这是一个更复杂的脚本的概念证明,我用它来同时对多个服务器进行ssh调用。我需要&的多线程功能,但由于它似乎在子shell中运行,它的所有变量都是本地的?!?!?
答案 0 :(得分:1)
我假设您的问题是如何从子shell中影响父shell变量,尽管您不太了解它。
无法直接执行此操作,但您可以通过与后台进程通信来管理它。最简单的方法是安排它们在完成后将数据写入文件,然后解释它。如果您信任您的子流程,只需让它们在您的父流程中编写bash代码和eval。
您可能能够检测到他们何时在SIGCHLD上使用陷阱。
另一种方法可能是使用GNU "parallel"工具并在完成时收获输出文件。
另一种方法可能是使用像"parallel-ssh"这样的工具。
如果您提供更多详细信息,可以提供更具体的答案。