Bash

如何在bash中並行分配環境變數

  • October 17, 2020

我正在嘗試使用命令替換的結果設置幾個環境變數。我想與&和並行執行命令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

經過一番思考,我想出了一個醜陋的解決方法:

#!/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數組中。

引用自:https://unix.stackexchange.com/questions/356221