תיקון ליל הסדר

14/04/2025

חלק מכם, שמנויים לקבלת פוסטים חדשים דרך המייל, שמו לב וודאי לבאג שהיה במערכת בליל הסדר האחרון. בימים רגילים המערכת מקפידה לא לשלוח אימייל בחגים, אבל הפעם ליל הסדר יצא במוצאי שבת וזה בלבל את המערכת. וכמו תמיד תקלות במערכת הדיוור הן הזדמנות לקרוא שוב את הסקריפט ולהוסיף עוד תיקון.

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

נשאר לקוות שהוא לא יפשל שוב, ובכל מקרה נמשיך לעקוב.