<Trước | Nội dung | Tiếp theo>
Lập trình phòng thủ
Điều quan trọng là phải xác minh các giả định khi lập trình. Điều này có nghĩa là đánh giá cẩn thận trạng thái thoát của các chương trình và lệnh được sử dụng bởi một tập lệnh. Đây là một bài kiểm tra, dựa trên một câu chuyện có thật. Một quản trị viên hệ thống không may đã viết một tập lệnh để thực hiện nhiệm vụ bảo trì trên một máy chủ quan trọng. Tập lệnh chứa hai dòng mã sau:
cd $ dir_name rm *
cd $ dir_name rm *
Về bản chất, không có gì sai với hai dòng này, miễn là thư mục có tên trong biến, tên_thư mục, tồn tại. Nhưng điều gì sẽ xảy ra nếu nó không xảy ra? Trong trường hợp đó, cd lệnh không thành công và tập lệnh tiếp tục đến dòng tiếp theo và xóa các tệp trong thư mục làm việc hiện tại. Không phải là kết quả mong muốn ở tất cả! Người quản trị không may đã phá hủy một phần quan trọng của máy chủ vì quyết định thiết kế này.
Hãy xem xét một số cách thiết kế này có thể được cải thiện. Đầu tiên, có thể là khôn ngoan nếu thực hiện rm phụ thuộc vào sự thành công của cd:
cd $ dir_name && rm *
cd $ dir_name && rm *
Theo cách này, nếu cd lệnh không thành công, rm lệnh không được thực hiện. Điều này tốt hơn, nhưng vẫn để ngỏ khả năng rằng biến, tên_thư mục, chưa được đặt hoặc trống, điều này sẽ dẫn đến việc các tệp trong thư mục chính của người dùng bị xóa. Điều này cũng có thể tránh được bằng cách kiểm tra xem tên_thư mục thực sự chứa tên của một cơ sở hiện có:
[[-d $ dir_name]] && cd $ dir_name && rm *
[[-d $ dir_name]] && cd $ dir_name && rm *
Thông thường, tốt nhất là bao gồm logic để kết thúc tập lệnh và báo cáo lỗi khi một tình huống như ở trên xảy ra:
# Xóa tệp trong thư mục $ dir_name nếu [[! -d "$ dir_name"]]; sau đó
echo "Không có thư mục như vậy: '$ dir_name'"> & 2 thoát 1
fi
nếu như ! cd $ dir_name; sau đó
echo "Không thể cd thành '$ dir_name'"> & 2 thoát 1
fi
nếu như ! rm *; sau đó
echo "Xóa tệp không thành công. Kiểm tra kết quả"> & 2 thoát 1
fi
# Xóa tệp trong thư mục $ dir_name nếu [[! -d "$ dir_name"]]; sau đó
echo "Không có thư mục như vậy: '$ dir_name'"> & 2 thoát 1
fi
nếu như ! cd $ dir_name; sau đó
echo "Không thể cd thành '$ dir_name'"> & 2 thoát 1
fi
nếu như ! rm *; sau đó
echo "Xóa tệp không thành công. Kiểm tra kết quả"> & 2 thoát 1
fi
Ở đây, chúng tôi kiểm tra cả tên, để biết rằng đó là tên của một thư mục hiện có và suc-
Lỗi lôgic
cess của cd chỉ huy. Nếu không thành công, một thông báo lỗi mô tả sẽ được gửi đến công ty chuẩn và tập lệnh kết thúc với trạng thái thoát là một thông báo lỗi.
<Trước | Nội dung | Tiếp theo>