Tôi có một tập lệnh bash tạo báo cáo về tiến trình của một số công việc chạy dài trên máy. Về cơ bản, tập lệnh cha mẹ này lặp lại thông qua một danh sách các tập lệnh con (gọi tất cả chúng bằng source
). Các tập lệnh con được dự kiến sẽ đặt một vài biến cụ thể, tập lệnh cha sẽ sử dụng.
Hôm nay, tôi phát hiện ra một lỗi trong đó, một biến được đặt bởi tập lệnh con đầu tiên vô tình được sử dụng bởi tập lệnh con thứ hai, gây ra đầu ra không chính xác. Có cách nào sạch để ngăn chặn các loại lỗi này xảy ra không?
Về cơ bản, khi tôi source
là một tập lệnh con, có một vài biến cụ thể mà tôi muốn tiếp tục quay lại tập lệnh cha. Tập lệnh cha của tôi đặt lại các biến cụ thể này trước source
mỗi tập lệnh con mới, vì vậy không có vấn đề gì với chúng. Tuy nhiên, một số tập lệnh con có thể có các biến tùy ý bổ sung mà nó sử dụng cục bộ không nên tồn tại trở lại tập lệnh mẹ.
Rõ ràng là tôi có thể tự hủy bỏ từng phần này ở phần cuối của tập lệnh con, nhưng chúng có vẻ dễ bị lỗi nếu tôi quên. Có cách nào phù hợp hơn để tìm nguồn cung cấp một tập lệnh và chỉ có một số biến nhất định tồn tại trong tập lệnh được gọi source
không?
chỉnh sửa: Để rõ ràng, đây là một phiên bản ngu ngốc của tập lệnh gốc của tôi:
echo "<html><body><h1>My jobs</h1>"
FILES=~/confs/*.sh
for f in $FILES; do
# reset variables
name="Unnamed job"
secsSinceActive="Unknown"
statusText="Unknown"
# run the script that checks on the job
source "$f"
# print bit of report
echo "<h3>$name</h3>"
echo "<p>Last active: $secsSinceActive seconds ago</p>"
echo "<p>Status: $statusText</p>"
echo "</body></html>"
Và đây là một trong những kịch bản con có thể trông như thế nào:
name="My awesome job"
nowTime=`expr $(date +%s) `
lastActiveTime=`expr $(date +%s -r ~/blah.log)`
secsSinceActive=`expr $nowTime - $lastActiveTime`
currentRaw=$(cat ~/blah.log | grep "Progress" | tail -n 1)
if [ -z "$currentRaw" ]; then
statusText="Not running"
else
statusText="In progress"
fi
Các biến $ name, $ secsSinceActive và $ statusText cần phải tồn tại trở lại tập lệnh cha, nhưng tất cả các biến khác sẽ biến mất khi tập lệnh con kết thúc.
source
và kiểm tra các bộ phận cho một subshell để chúng thực sự không ảnh hưởng đến cha mẹ vĩnh viễn?