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

관련 정보