0

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

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

4

1 回答 1

1

我假设您的问题是如何从子外壳影响父外壳变量,尽管您并没有完全问它。

没有办法直接做到这一点,但您可以通过与后台进程通信来管理它。最简单的方法是安排他们在完成后将数据写入文件,然后对其进行解释。如果您信任您的子进程,只需让他们编写 bash 代码并在您的父进程中对其进行评估。

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

另一种方法可能是使用GNU“并行”工具并在完成时获取输出文件。

另一种方法可能是使用“parallel-ssh”之类的工具。

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

于 2013-05-02T18:48:38.057 回答