set -o errexit
エラーが発生した場合は、スクリプト全体を終了するために使用するbashスクリプトがあります。
スクリプトは、curl
時々予想されるファイルを検索できないコマンドを実行します。ただし、これが発生すると、スクリプトはエラーで終了しません。
for
ループを追加しました
- 数秒間一時停止して
curl
コマンドを再試行してください。 - for ループの一番下に
false
0 以外のデフォルト終了状態を定義するために使用します。カールコマンドが成功すると、ループは中断され、最後のコマンドの終了ステータスはゼロでなければなりません。
#! /bin/bash
set -o errexit
# ...
for (( i=1; i<5; i++ ))
do
echo "attempt number: "$i
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
if [ -f ~/.vim/autoload/pathogen.vim ]
then
echo "file has been retrieved by curl, so breaking now..."
break;
fi
echo "curl'ed file doesn't yet exist, so now will wait 5 seconds and retry"
sleep 5
# exit with non-zero status so main script will errexit
false
done
# rest of script .....
問題は、curl
コマンドが失敗すると、ループがコマンドを5回再試行することです。すべての試行が失敗すると、forループが終了し、デフォルトのスクリプトが再起動されますerrexit
。
この文が失敗した場合にスクリプト全体を終了するにはどうすればよいですかcurl
?
ベストアンサー1
変える:
done
そして:
done || exit 1
for
これにより、ループがゼロ以外の終了コードで終了すると、コードは終了します。
ところで、1
inは必要ありません。ダウンロードが失敗すると、exit 1
通常のexit
コマンドは最後に実行されたコマンドの終了ステータス(コード= 1)で終了します。false
ダウンロードが成功すると、ループの終了コードはecho
コマンドの終了コードです。 echo
通常、成功を示す code=0 で終了します。この場合、||
何もトリガーされず、exit
コマンドは実行されません。
set -o errexit
最後に、この内容は驚きに満ちている可能性があることに注意してください。長所と短所の議論については、以下を参照してください。グレッグのよくある質問 #105。
文書
からman bash
:
~のため((式1;式2;式3));するリスト; 完璧
まず、算術式expr1は、以下の算術評価で説明する規則に従って評価される。次に、算術式 expr2 はゼロと評価されるまで繰り返し評価されます。 expr2がゼロ以外の値に評価されるたびに、listが実行され、算術式expr3が評価されます。式が省略された場合は1と評価されます。 戻り値は、リストで実行された最後のコマンドの終了状態、式が無効な場合はfalseです。[強調追加]