bash配列を埋めるために使用されたforループの結果をzenity --progressにパイプすると、なぜbash配列がまだ空になるのですか?

bash配列を埋めるために使用されたforループの結果をzenity --progressにパイプすると、なぜbash配列がまだ空になるのですか?

一部のデータを含む配列があります。

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 )

おすすめ記事