평가 변수 = 백그라운드 명령

평가 변수 = 백그라운드 명령

다음 코드가 있습니다

for name in a b c d; do
    for i in {01..12}; do
        eval test_${name}_{i}=`some command`
    done
done

백그라운드에서 할당을 수행하려고 하는데 다음과 같은 쉘 스크립트에서는 작동하지 않습니다.

for name in a b c d; do
    for i in {01..12}; do
        eval test_${name}_{i}=`some command` & 
    done
done
wait
echo $test_a_01

나는 null 값을 얻었다

답변1

그런 값을 얻을 수는 없습니다. 백그라운드 프로세스는 다른 프로세스 내에서 실행되어야 합니다. 그렇지 않으면 기본 셸에서 독립될 수 없습니다. 따라서 값을 다시 기본 셸에 "저장"할 수 없습니다.

대신 출력을 파일(또는 여러 파일)에 저장할 수 있습니다.

for name in a b c d; do
    for i in {1..12}; do
        printf "test_${name}_${i}=%s\n" "$(some command "$name" "$i")" >> output & 
    done
done
wait

쉘 변수에 나타나도록 하려면 파일에서 다시 읽을 수 있습니다. 여기에서는 Bash에서 연관 배열을 사용합니다.

declare -A outputs
while IFS== read -r key value; do
    outputs["$key"]="$value"
done < output
echo ${outputs[test_b_7]}

답변2

백그라운드 명령은 서브셸에서 실행됩니다. 하위 쉘 명령은 상위 쉘의 환경(또는 내부 변수)에 영향을 주지 않습니다.

관련 정보