親シェルで子シェルの変数を使用可能にする方法

親シェルで子シェルの変数を使用可能にする方法

Webサービスでいくつかのレポートの時間を測定するための迅速で簡単なスクリプトを作成しました。

BASE_URL='http://example.com/json/webservice/'
FIRST=1
FINAL=10000

for report_code in $(seq 1 $FINAL); do
  (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time

  echo $response  # <------- this is out of scope!  How do I fix that?
  if [[ $response = '404' ]]; then
    echo "Deleting report # ${report_code}!"
    rm ${report_code}
  else
    echo "${report_code} seems to be good!"
  fi
done

time出力をリダイレクトするには、サブシェルでコマンドをラップする必要がありますが、これにより親$responseシェルで値が使用できなくなります。この問題をどのように解決できますか?

ベストアンサー1

エラーが発生しやすいマーシャリングや面倒な通信がなければ、サブシェルから親シェルに変数値を渡す方法はありません。

幸い、ここではサブシェルは必要ありません。リダイレクトには次のものだけが必要です。コマンドのグループ化を使用すると{ … }サブシェルではありません。

{ time -p response=$(curl --write-out '%{http_code}' --silent -O "${BASE_URL}/${report_code}"); } 2> "${report_code}.time"

(忘れないで変数の置換は二重引用符で囲まれています。.)

おすすめ記事