bash函数中的全局变量如果用&调用则不是全局变量后台命令

时间:2013-05-02 18:22:14

标签: bash

这是我想要实现的一个例子。

#!/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中运行,它的所有变量都是本地的?!?!?

1 个答案:

答案 0 :(得分:1)

我假设您的问题是如何从子shell中影响父shell变量,尽管您不太了解它。

无法直接执行此操作,但您可以通过与后台进程通信来管理它。最简单的方法是安排它们在完成后将数据写入文件,然后解释它。如果您信任您的子流程,只需让它们在您的父流程中编写bash代码和eval。

您可能能够检测到他们何时在SIGCHLD上使用陷阱。

另一种方法可能是使用GNU "parallel"工具并在完成时收获输出文件。

另一种方法可能是使用像"parallel-ssh"这样的工具。

如果您提供更多详细信息,可以提供更具体的答案。