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
經過一番思考,我想出了一個醜陋的解決方法:
#!/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
數組中。