Bash:子进程访问变量

the*_*ega 4 parallel-processing bash scope

我想写一个Bash-Script,它通过ssh登录到几台机器,首先显示它们的主机名并执行一个命令(在每台机器上都是相同的命令).命令的主机名和输出应一起显示.我想要一个并行版本,所以ssh-commands应该在后台和并行运行.

我构建了下面附带的bashscripted.问题是:由于runonip-function在子shell中执行,因此无法访问DATA-array来存储结果.以某种方式可能通过"通过引用传递"函数给子shell访问数组吗?

码:

 #!/bin/bash
set -u

if [ $# -eq 0 ]; then
   echo "Need Arguments: Command to run"
   exit 1
fi 

DATA=""
PIDS=""

#Function to run in Background for each ip
function runonip {
    ip="$1"
    no="$2"
    cmds="$3"
    DATA[$no]=$( {
        echo "Connecting to $ip"
        ssh $ip cat /etc/hostname
        ssh $ip $cmds
    } 2>&1 )
}

ips=$(get ips somewhere)

i=0
for ip in $ips; do
    #Initialize Variables
    i=$(($i+1))
    DATA[$i]="n/a"

    #For the RunOnIp Function to background
    runonip $ip $i $@ &

    #Save PID for later waiting
    PIDS[$i]="$!"
done

#Wait for all SubProcesses
for job in ${PIDS[@]}; do
    wait $job
done

#Everybody finished, so output the information from DATA
for x in `seq 1 $i`; do
    echo ${DATA[$x]}
done;
Run Code Online (Sandbox Code Playgroud)

Pet*_*ake 5

不,它真的不是.子shell在完全独立的操作系统进程中运行,两个进程共享内存的唯一方法是让代码通过系统调用显式设置.Bash不这样做.

您需要做的是找到两个进程进行通信的其他方法.以PID命名的临时文件将是一种方式:

#For the RunOnIp Function to background
runonip $ip $i $@ >data-tmp&
mv data-tmp data-$!
Run Code Online (Sandbox Code Playgroud)

然后cat文件:

#Everybody finished, so output the information from the temp files
for x in ${PIDS[@]}; do
    cat data-$x
    rm data-$x
done;
Run Code Online (Sandbox Code Playgroud)