다음 코드가 있습니다
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
백그라운드 명령은 서브셸에서 실행됩니다. 하위 쉘 명령은 상위 쉘의 환경(또는 내부 변수)에 영향을 주지 않습니다.