Bash Tips
bash_tips-stop_recursion.sh
רקורסיה $0 $$, ושני אתגרונים בקצה
רמת קושי: #advanced
בעבר דברנו על כך שכשמעבירים לסקריפט באש פרמטרים אז הם נכנסים לסקריפט כמשתנים בשמות $1 לפרמטר הראשון ו$2 $3 לשני והשלישי בהתאמה וכו', מצליחים לנחש איזה ערך נמצא במשתנה $0?
עכשיו המח הקודח שלנו מיד נכנס לפעולה וחושב אה מגניב אז ככה בעצם אפשר ליצור סקריפט שקורא לעצמו. רקורסיה!!!!1 💪💪💪
הסקריפט נח ל20 שניות ומריץ את עצמו שוב
כמו שאתם מבינים החולשות של רקורסיה נמצאות גם כאן, כל התהליכים נוצרים תחת התהליך המקורי, הסקריפט אף פעם לא מגיע לתהליך סיום ולכן כל הרצה שומרת מחדש את כל הסקריפט בזיכרון.
אתגרונים אתגרונים
ועכשיו לשני אתגרים קטנים שתשתגעו עליהם.
1. איך לגרום לסקריפט החדש שרץ (
2. איך לסגור את הסקריפט הפשוט הבא (הקובץ המצוטט בערוץ) כשאתם מריצים אותו ברקע כך
#challenge
#arguments
#bash_pid
@bash_tips
רמת קושי: #advanced
בעבר דברנו על כך שכשמעבירים לסקריפט באש פרמטרים אז הם נכנסים לסקריפט כמשתנים בשמות $1 לפרמטר הראשון ו$2 $3 לשני והשלישי בהתאמה וכו', מצליחים לנחש איזה ערך נמצא במשתנה $0?
$ cat test.sh
echo "$0"
$ ./test.sh
./test.sh
כן!, הפרמטר הראשון של כל סקריפט הוא השם של הסקריפט עצמו.עכשיו המח הקודח שלנו מיד נכנס לפעולה וחושב אה מגניב אז ככה בעצם אפשר ליצור סקריפט שקורא לעצמו. רקורסיה!!!!1 💪💪💪
$ cat test.sh
echo "$0 | $$"
sleep 20
$0
$ ./test.sh
./test.sh | 101394
./test.sh | 101395
./test.sh | 101396
...
מה היה לנו כאן בעצם?$0
מעביר את שם הסקריפט$$
מציג את מספר התהליך של הסקריפטהסקריפט נח ל20 שניות ומריץ את עצמו שוב
כמו שאתם מבינים החולשות של רקורסיה נמצאות גם כאן, כל התהליכים נוצרים תחת התהליך המקורי, הסקריפט אף פעם לא מגיע לתהליך סיום ולכן כל הרצה שומרת מחדש את כל הסקריפט בזיכרון.
אתגרונים אתגרונים
ועכשיו לשני אתגרים קטנים שתשתגעו עליהם.
1. איך לגרום לסקריפט החדש שרץ (
$0
) להחליף את מספר התהליך שלו מבלי להיות תת תהליך של התהליך המקורי ובכך לגרום לסקריפט המקורי להגיע לנקודת סיום ולשחרר את הזיכרון.2. איך לסגור את הסקריפט הפשוט הבא (הקובץ המצוטט בערוץ) כשאתם מריצים אותו ברקע כך
$ ./bash_tips-stop_recursion.sh &
תוכן הקובץ$ batcat bash_tips-stop_recursion.sh
───────┬────────────
│ File: test.sh
───────┼────────────
1 │ #!/bin/bash
2 │
3 │ echo "$0 | $$"
4 │ sleep 1
5 │ $0
מוזמנים לשתף בתגובות מה דגתם#challenge
#arguments
#bash_pid
@bash_tips