תיקון ליל הסדר
חלק מכם, שמנויים לקבלת פוסטים חדשים דרך המייל, שמו לב וודאי לבאג שהיה במערכת בליל הסדר האחרון. בימים רגילים המערכת מקפידה לא לשלוח אימייל בחגים, אבל הפעם ליל הסדר יצא במוצאי שבת וזה בלבל את המערכת. וכמו תמיד תקלות במערכת הדיוור הן הזדמנות לקרוא שוב את הסקריפט ולהוסיף עוד תיקון.
1. מה נשבר
הסקריפט ששולח מיילים משתמש בסקריפט קצר שבודק אם אנחנו בחג ואם כן מדלג על השליחה. הקטע שרלוונטי לסיפור שלנו הוא:
for erev_holiday in "${no_emails_erev[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${erev_holiday}" >& /dev/null && [$(date +"_H") > 19]
then
exit 1
fi
done
הבלוק הזה אמור לרוץ על רשימה של ערבי חג, ואם הוא מזהה שאנחנו עכשיו בערב חג והשעה אחרי שבע בערב אז הוא מגיע ל exit, יוצא מהסקריפט וככה לא שולח את המייל. בליל הסדר זה לא עבד.
2. הסביר ותיקון באדיבות AI
בהמשך לטרנד ה AI שתוקף אותנו נתתי לחבר המלאכותי לזהות את הבעיה. זה היה הפרומפט:
תפקיד הסקריפט הבא הוא למנוע שליחת מייל בחגים, אבל הוא נכשל ובליל הסדר האחרון המייל נשלח. מה הבעיה בסקריפט
ynon@li447-87:~/tmp$ cat ~/bin/holiday_protect.sh
evenings_ok=(
"Pesach I$"
"Pesach VII"
"Shavuot I$"
"Tish'a B'Av"
"Rosh Hashana II"
"Yom Kippur"
"Sukkot I"
"Shmini Atzeret"
)
no_emails=(
"Rosh Hashana"
)
no_emails_erev=(
"Erev Pesach"
"Erev Shavuot"
"Erev Rosh Hashana"
"Erev Sukkot"
"Erev Yom Kippur"
)
for send_in_evening in "${evenings_ok[@]}"
do
# echo "^[0-9/]+ ${send_in_evening}"
if hebcal $(date +"%m %d %Y") | egrep -v "CH''M" | egrep "^[0-9/]+ ${send_in_evening}" >& /dev/null
then
if (( $(date +%"_H") < 20 ))
then
exit 1
fi
fi
done
for holiday in "${no_emails[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${holiday}" >& /dev/null
then
exit 1
fi
done
for erev_holiday in "${no_emails_erev[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${erev_holiday}" >& /dev/null && [$(date +"_H") > 19]
then
exit 1
fi
done
לקח לו שניה וחצי למצוא את הבעיה. התשובה שלו "שים לב שחסרה כאן % לפני _H.
יותר מזה — גם ההשוואה לא טובה.
ב־bash, בתוך סוגריים מרובעים, השוואות מספריות צריכות להיות עם -gt
ולא >
.
ה >
משמש להשוואה ללקסיקוגרפיה של מחרוזות בתוך סוגריים מרובעים, ולא להשוואה מספרית.
הצורה הנכונה היא:
[ $(date +"%H") -gt 19 ]
הסקריפט המתוקן הוא:
evenings_ok=(
"Pesach I$"
"Pesach VII"
"Shavuot I$"
"Tish'a B'Av"
"Rosh Hashana II"
"Yom Kippur"
"Sukkot I"
"Shmini Atzeret"
)
no_emails=(
"Rosh Hashana"
)
no_emails_erev=(
"Erev Pesach"
"Erev Shavuot"
"Erev Rosh Hashana"
"Erev Sukkot"
"Erev Yom Kippur"
)
for send_in_evening in "${evenings_ok[@]}"
do
# echo "^[0-9/]+ ${send_in_evening}"
if hebcal $(date +"%m %d %Y") | egrep -v "CH''M" | egrep "^[0-9/]+ ${send_in_evening}" >& /dev/null
then
if (( $(date +%"_H") < 20 ))
then
exit 1
fi
fi
done
for holiday in "${no_emails[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${holiday}" >& /dev/null
then
exit 1
fi
done
for erev_holiday in "${no_emails_erev[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${erev_holiday}" >& /dev/null && [ $(date +"%H") -gt 19 ]
then
exit 1
fi
done
נשאר לקוות שהוא לא יפשל שוב, ובכל מקרה נמשיך לעקוב.