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"
(忘れないで変数の置換は二重引用符で囲まれています。.)