Tôi có một tập lệnh bash sử dụng set -o errexit
để có lỗi khi toàn bộ tập lệnh thoát ra tại điểm bị lỗi.
Tập lệnh chạy một curl
lệnh đôi khi không thể truy xuất tệp dự định - tuy nhiên khi điều này xảy ra, tập lệnh không thoát lỗi.
Tôi đã thêm một for
vòng lặp để
- Tạm dừng vài giây rồi thử lại
curl
lệnh - sử dụng
false
ở dưới cùng của vòng lặp for để xác định trạng thái thoát không bằng 0 mặc định - nếu lệnh curl thành công - vòng lặp bị phá vỡ và trạng thái thoát của lệnh cuối cùng sẽ bằng không.
#! /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 .....
Vấn đề là khi curl
lệnh thất bại, vòng lặp thử lại lệnh năm lần - nếu tất cả các lần thử đều không thành công, vòng lặp for kết thúc và tập lệnh chính sẽ tiếp tục - thay vì kích hoạt lệnh errexit
.
Làm cách nào tôi có thể lấy toàn bộ tập lệnh để thoát nếu curl
câu lệnh này không thành công?
true
trước câu lệnh break rõ ràng và đảm bảo giá trị thoát của vòng lặp không?