一部のデータを含む配列があります。
array1=( AAA BBB CCC DDD )
特定のAPIを呼び出した結果の配列をデータで埋めたいと思います。だから私は次のようにarray1
使用しようとしていますzenity
。
i=0
prog=0
for c in ${array1[@]}; do
echo $prog #updates the text
echo "# $c" #updates the percentage
data_array[$i]=$(curl -s "https://hub.dummyapis.com/products?noofRecords=4&idStarts=1001&useless=$c" | jq .[$i].id | bc)
(( prog=prog+30 ))
(( i++ ))
done | zenity \
--progress \
--title="Title" \
--text="Text" \
--percentage=0 \
--auto-close \
--auto-kill
問題はdata_array
まだ空であるということだ。
一方、zenity
コマンドからパイプを省略すると埋められます。私が正しく理解したなら、パイプは新しいサブプロセスを生成するのでdata_array
空です。
また、この構文を試しましたが、結果は同じでした。
zenity \
--progress \
--title="Title" \
--text="Text" \
--percentage=0 \
--auto-close \
--auto-kill < <(
for c in ${array1[@]}; do
echo $prog
echo "# $c"
data_array[$i]=$(curl -s "https://hub.dummyapis.com/products?noofRecords=4&idStarts=1001&useless=$c" | jq .[$i].id | bc)
(( prog=prog+30 ))
(( i++ ))
done)
どうですか?
ベストアンサー1
パイプラインのさまざまな部分がサブシェルで実行されます。 (Bashでは、lastpipe
最後の部分がデフォルトシェルで実行されるようにするオプションを有効にできますが、ここでは役に立ちません。)プロセス置換もサブシェルで実行されますが、基本部分が同じ操作を実行することは強制しません。
zenity
プロセス交換を入れて for
メインシェルに保管してください。
for c in ${array1[@]}; do
...
data_array[$i]=...
...
done > >( zenity \
--progress \
--title="Title" \
--text="Text" \
--percentage=0 \
--auto-close \
--auto-kill )