我正在尝试使用命令替换的结果设置几个环境变量。我想与&
和并行运行命令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
数组中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句