Bashで環境変数を並列に割り当てる方法

Bashで環境変数を並列に割り当てる方法

コマンド置換の結果を利用して複数の環境変数を設定しようとしています。&と並列にコマンドを実行したいと思いますwait。現在私が持っている様子は次のとおりです。

export foo=`somecommand bar` &
export fizz=`somecommand baz` &
export rick=`somecommand morty` &
wait

しかし&、変数の割り当てを使用しても持続しないようです。したがって、その後、waitこれらの変数はすべて割り当て解除されます。

これらの変数をどのように並列に割り当てることができますか?

更新:許可された回答に基づいて使用される内容は次のとおりです。

declare -a data
declare -a output
declare -a processes

var_names=(
    foo
    fizz
    rick
)

for name in "${var_names[@]}"
do
    processes+=("./get_me_a_value_for $name")
done

index=0
for process in "${processes[@]}"; do
    output+=("$(mktemp)")
    ${process} > ${output[$index]} &
    index=$((index+1))
done
wait

index=0
for out in "${output[@]}"; do
    val="$(<"${out}")"
    rm -f "${out}"

    export ${var_names[index]}="$val"

    index=$((index+1))
done

unset data
unset output
unset processes

答え1

悩みの終わりに、私は醜い解決策を思い出しました。

#!/bin/bash
proc1=$(mktemp)
proc2=$(mktemp)
proc3=$(mktemp)

/path/to/longprocess1 > "$proc1" &
pid1=$!
/path/to/longprocess2 > "$proc2" &
pid2=$!
/path/to/longprocess3 > "$proc3" &
pid3=$!

wait "$pid1" "$pid2" "$pid3"
export var1="<("$proc1")"
export var2="<("$proc2")"
export var3="<("$proc3")"
rm -f "$proc1" "$proc2" "$proc3"

コメントで要求されたように、ランダムに大きなリストのスケーラビリティを向上させる方法は次のとおりです。

#!/bin/bash
declare -a pids
declare -a data
declare -a output
declare -a processes

# Generate the list of processes for demonstrative purposes
processes+=("/path/to/longprocess1")
processes+=("/path/to/longprocess2")
processes+=("/path/to/longprocess3")

index=0
for process in "${processes[@]}"; do
    output+=("$(mktemp")
    $process > ${output[$index]} &
    pids+=("$!")
    index=$((index+1))
done
wait ${pids[@]}
index=0
for process in "${processes[@]}"; do
    data+="$(<"${output[index]}")"
    rm -f "${output[index]}"
    index=$((index+1))
done
export data

結果の出力はdata配列で表されます。

答え2

複数のタスクを同時に安全に並列に実行できない場合は、GNU Parallelのパーサーを使用できます。

parset foo,fizz,rick somecommand ::: bar baz morty
export foo
export fizz
export rick

特定の情報を見る:https://www.gnu.org/software/parallel/parset.html

関連情報