評価変数=バックグラウンドコマンド

評価変数=バックグラウンドコマンド

次のコードがあります

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

バックグラウンドコマンドはサブシェルで実行されます。サブシェルコマンドは、親シェルの環境(または内部変数)には影響しません。

関連情報