העברת מידע בין תהליכים ()>
רמת קושי: #advanced
הטיפ הבא מניח ידע בהפניות וערוצים
שימוש ב pipe
צורת העבודה עם באש מורכבת מאוסף של כלים קטנים שמשרשרים אותם ביחד כדי לקבל תוצאה מרשימה שיותר, לשם כך הכלי העיקרי שלנו הוא שימוש ב pipe (
שימוש ב Process Substitution
קיימת אפשרות נוספת להעביר פלט של פקודה אחת לפקודה אחרת והוא על ידי שימוש בהחלפת הקונטקסט לתהליך.
היכולת הזאת מאפשרת לנו לבצע
העברת פלט של פקודות לפקודות אחרות שעובדות רק עם קבצים
ועוד יכולת קריטית נוספת שנראה בטיפ הבא
#pipe
#redirection
#named_pipe
#process_substitution
@bash_tips
רמת קושי: #advanced
הטיפ הבא מניח ידע בהפניות וערוצים
שימוש ב pipe
צורת העבודה עם באש מורכבת מאוסף של כלים קטנים שמשרשרים אותם ביחד כדי לקבל תוצאה מרשימה שיותר, לשם כך הכלי העיקרי שלנו הוא שימוש ב pipe (
|
)$ echo "(5 + 5) * 1000" | bc
10000
מה שבעצם מתרחש כאן הוא היכולת של באש להעביר פלט של פקודה אחת לפקודה אחרת. אם נרצה להסביר את הפעולה הזאת בשפה היותר טכנית, באש מפנה את ה stdout של הפקודה הראשונה ל stdin של הפקודה שמגיע לאחר הpipe.שימוש ב Process Substitution
קיימת אפשרות נוספת להעביר פלט של פקודה אחת לפקודה אחרת והוא על ידי שימוש בהחלפת הקונטקסט לתהליך.
$ more <(ls /bin)
מה בעצם קורה מתחת למכסה המנוע? התהליך הראשון רץ בסביבה משלו ואת התוכן הוא מעביר לnamed pipe, שזה שקול בערך לכתיבה לקובץ, ולאחר מכן הנתיב "לקובץ" המדובר עובר לפקודה הבאה.$ less <(ls /bin)
/proc/self/fd/11 is not a regular file (use -f to see it)
$ cat <(ls /bin)
[
2to3-2.7
411toppm
7z
...
$ less < <(ls /bin)
<less open with the relevant content>
כפי שניתן לראות ישנן פקודות שיודעות לקרוא תוכן ישירות מ named pipe וישנן כאלה שלא, בכדי "להמיר" את התוכן לפקודות שאינן תומכות בקריאה ישירות מ named pipe ניתן להפנות את הפלט אל ה stdin של הפקודה בעזרת >
(כפי שקורה בדוגמה האחרונה).היכולת הזאת מאפשרת לנו לבצע
העברת פלט של פקודות לפקודות אחרות שעובדות רק עם קבצים
ועוד יכולת קריטית נוספת שנראה בטיפ הבא
#pipe
#redirection
#named_pipe
#process_substitution
@bash_tips
לעבד stderr בלי לאבד את קוד היציאה
רמת קושי: #advanced
הטיפ הבא מניח ידע בהפניות וערוצים
לאחר שראינו שניתן להעביר פלט של פקודות מאחת לשניה כדי לעבד אותן, כדאי שנכיר בעובדה שניתן לעבד אך ורק פלט שמועבר על ידי ה stdout ואילו פלט של stderr יוצג כמות שהוא
בכדי לפתור את הבעיה הזאת אנו יכולים לחבר בין הערוצים ולהפנות את ה stderr אל stdout בצורה הבאה.
אם כך הכל מדהים, היכן הבעיה?
הבעיה עם צורת העבודה הזאת היא שאנו מאבדים את קוד היציאה של התוכנית.
הפתרון Process Substitution
בכדי לפתור את הבעיה הזאת נוכל להשתמש בקונספט שראינו בטיפ הקודם רק בצורה ההפוכה.
$
הטיפ הבא שימושי מאוד כשעובדים עם כלים המאפשרים הרצת פקודות ad hoc כמו דוקר, ורוצים לעבד את המידע מבלי לפגוע בפלט הגולמי
#exit_code
#redirection
#process_substitution
@bash_tips
רמת קושי: #advanced
הטיפ הבא מניח ידע בהפניות וערוצים
לאחר שראינו שניתן להעביר פלט של פקודות מאחת לשניה כדי לעבד אותן, כדאי שנכיר בעובדה שניתן לעבד אך ורק פלט שמועבר על ידי ה stdout ואילו פלט של stderr יוצג כמות שהוא
$ ls /not_exist_path | grep -Po "cannot access"
ls: cannot access '/not_exist_path': No such file or directory
הסיבה לכך היא שpipe מעביר אך ורק את ה stdout ולא את ה stderr.בכדי לפתור את הבעיה הזאת אנו יכולים לחבר בין הערוצים ולהפנות את ה stderr אל stdout בצורה הבאה.
$ ls /not_exist_path 2>&1 | grep -Po "cannot access"
cannot access
אם כך הכל מדהים, היכן הבעיה?
הבעיה עם צורת העבודה הזאת היא שאנו מאבדים את קוד היציאה של התוכנית.
$ ls /not_exist_path 2>&1 | grep -Po "cannot access"
cannot access
$ echo $?
0
ברגע שהפקודה הראשונה נכשלת היא לא יוצאת משרשור הפקודות שהעברנו לה אלא מעבירה את הפלט לפקודה הבאה שהיא בתורה מבצעת את התפקיד שלה נהדר ולכן הסטטוס שיחזור יהיה 0 כפי שמחזירה הפקודה האחרונה ואנו נאבד את קוד השגיאה של הפקודה הראשונה.הפתרון Process Substitution
בכדי לפתור את הבעיה הזאת נוכל להשתמש בקונספט שראינו בטיפ הקודם רק בצורה ההפוכה.
$
ls /not_exist_path &> >(grep -Po "cannot access")
cannot access
$ echo $?
2
מה שבעצם קורה כאן הוא שאנו מאחדים את שני הערוצים לערוץ אחד אבל מבצעים את פעולת ההמשך שלנו בקונטקסט אחר, בסאב שאלל ולכן קוד היציאה של הפקודה הראשונית נשאר אותו הדבר.הטיפ הבא שימושי מאוד כשעובדים עם כלים המאפשרים הרצת פקודות ad hoc כמו דוקר, ורוצים לעבד את המידע מבלי לפגוע בפלט הגולמי
#exit_code
#redirection
#process_substitution
@bash_tips
לקבל
פקודה חביבה ממש שמגיעה כחלק bash builtin היא
הפקודה מאפשרת לתחום ריצה של פקודות אחרות לזמן מוגדר, כך שאם פקודה מסויימת לא מפסיקה לרוץ, פקודת timeout תוודא שהיא לא תשתיק את שאר הסקריפט לעד
בדוגמה הראשונה timeout הוא 3 שניות ולכן הפקודה מפסיקה לרוץ לאחר 3 שניות ומחזירה סטטוס קוד 124
בדוגמה השניה פקודת sleep מסיימת לפני תום הtimeout ולכן היא יוצאת עם סטטוס קוד 0
הפקודה מבחינת ערכים עובדת בצורה דומה מאוד ל sleep כך שטיים האוט יכול גם להיות 10m
משהו נוסף, כדאי מאוד לעבור על ה help הקצר של הפקודה
#timeout
#sleep
#exit_code
@bash_tips
timeout
רמת קושי: #beginnersפקודה חביבה ממש שמגיעה כחלק bash builtin היא
timeout
.הפקודה מאפשרת לתחום ריצה של פקודות אחרות לזמן מוגדר, כך שאם פקודה מסויימת לא מפסיקה לרוץ, פקודת timeout תוודא שהיא לא תשתיק את שאר הסקריפט לעד
$ timeout 3 sleep 5
$ echo $?
124
$ timeout 5 sleep 3
$ echo $?
0
בדוגמה הראשונה timeout הוא 3 שניות ולכן הפקודה מפסיקה לרוץ לאחר 3 שניות ומחזירה סטטוס קוד 124
בדוגמה השניה פקודת sleep מסיימת לפני תום הtimeout ולכן היא יוצאת עם סטטוס קוד 0
הפקודה מבחינת ערכים עובדת בצורה דומה מאוד ל sleep כך שטיים האוט יכול גם להיות 10m
משהו נוסף, כדאי מאוד לעבור על ה help הקצר של הפקודה
#timeout
#sleep
#exit_code
@bash_tips
מניפולציה על מערכים
רמת קושי: #advanced
דברנו בעבר על כך שבאש מאפשרת לבצע מניפולציה על משתנים, להגדיל אותיות או להקטין, להחליף תוכן בתוכן אחר וכו'
מסתבר שאת כל הפעולות הללו ניתן לבצע גם על מערך שלם, מבלי לרוץ עליו בלולאה.
לדוגמה, להלן מערך של משתמשים שכל איבר בו מכיל שם משתמש וסיסמה, פעם אחת אנו רוצים לקבל את המשתמשים ופעם אחרת רק את הסיסמאות
אם נמשיך עם הרעיון הזה נראה שאפשר לממש מילון עם מפתח מכל סוג שנרצה, על ידי כך שנעביר מחרוזת וכשנרצה לשלוף אותה, נבצע מניפולציה על התוכן
#array
#parameter_expansion
@bash_tips
רמת קושי: #advanced
דברנו בעבר על כך שבאש מאפשרת לבצע מניפולציה על משתנים, להגדיל אותיות או להקטין, להחליף תוכן בתוכן אחר וכו'
$ myvar=my_username:my_password
$ echo ${myvar^^}
MY_USERNAME:MY_PASSWORD
$ echo ${myvar//my/your}
your_username:your_password
מסתבר שאת כל הפעולות הללו ניתן לבצע גם על מערך שלם, מבלי לרוץ עליו בלולאה.
לדוגמה, להלן מערך של משתמשים שכל איבר בו מכיל שם משתמש וסיסמה, פעם אחת אנו רוצים לקבל את המשתמשים ופעם אחרת רק את הסיסמאות
$ users_auth=(admin:1234356)
$ users_auth+=(myuser:456789)
$ users_auth+=(writer:00001)
$ echo ${users_auth[@]}
admin:1234356 myuser:456789 writer:00001
$ echo ${users_auth[@]/:*}
admin myuser writer
$ echo ${users_auth[@]/*:}
1234356 456789 00001
אם נמשיך עם הרעיון הזה נראה שאפשר לממש מילון עם מפתח מכל סוג שנרצה, על ידי כך שנעביר מחרוזת וכשנרצה לשלוף אותה, נבצע מניפולציה על התוכן
#array
#parameter_expansion
@bash_tips
להחריג תווים $
רמת קושי: #advanced
אנו יודעים שבשביל להחריג תווים מיוחדים ממחרוזת בקוד משתמשים בלוכסן, זה כך כמעט בכל השפות ובאש אינה יוצאת דופן.
יוצאת דופן אמרנו? הכוונה שהיא משתדלת לא לצאת דופן, עדין ישנן מקומות בהם לוכסן לא מבצע שום פעולה
בכדי שיהיה אפשרי להשתמש בלוכסן במקרה כגון זה, צריך להריץ את הפקודה עם דולר בראש המחרוזת
מקום נוסף שזה בא ליידי ביטוי
נושא זה נקרא ANSI-C
למי שרוצה להרחיב את הקריאה על כך
#echo
#ansi_c
@bash_tips
רמת קושי: #advanced
אנו יודעים שבשביל להחריג תווים מיוחדים ממחרוזת בקוד משתמשים בלוכסן, זה כך כמעט בכל השפות ובאש אינה יוצאת דופן.
יוצאת דופן אמרנו? הכוונה שהיא משתדלת לא לצאת דופן, עדין ישנן מקומות בהם לוכסן לא מבצע שום פעולה
$ echo "name='version'"
name='version'
$ echo 'name=\'version\' '
> ^C
בכדי שיהיה אפשרי להשתמש בלוכסן במקרה כגון זה, צריך להריץ את הפקודה עם דולר בראש המחרוזת
$ echo $'name=\'version\''
name='version
'מקום נוסף שזה בא ליידי ביטוי
$ echo $'first line \nsecond line'
first line
second line
נושא זה נקרא ANSI-C
למי שרוצה להרחיב את הקריאה על כך
#echo
#ansi_c
@bash_tips
אתר חביב שמסביר בצורה מעט ויזואלית איך פקודות ופרמטרים מורכבים בבאש עובדים
רמת קושי: #beginners
https://explainshell.com
#tools
@bash_tips
רמת קושי: #beginners
https://explainshell.com
#tools
@bash_tips
להעביר מספר שורות לקובץ (א)
רמת קושי: #advanced
לא מעט פעמים נרצה שהסקריפט שלנו יצור קובץ בעל תוכן מסויים, להלן מספר אפשרויות
שימוש ב Heredoc
פקודת cat וtee יודעות לקבל קלט וליצור ממנו קובץ, הסינטקס בנוי בצורה כזאת
בלוק שמתחיל באיזו מילה שתבחרו, במקרה שלנו EOL, ומופנה אל ה stdin של הפקודה בעזרת >>.
כל הטקסט שבתוך הבלוק יכתב אל הקובץ שעליו אנו מכריזים בשורה הראשונה.
זה נראה כך
בעוד שמדובר על צורה עבודה שנמצאת בשימוש מאוד נרחב, היא בעלת סינטקס לא ממש אינטואיטיבי אבל הבעיה הגדולה יותר זה שהיא רגישה לכך שהמילה שסוגרת את הבלוק תהיה בתחילת השורה, מספיק רווח אחד כדי להכשיל את הקוד.
פתרון
לאלו שרוצים להכניס את הקוד לעיל לפונקציה ולהזיח את הטסט כראוי, ניתן להשתמש בטאב במקום ברווח, בצורה זו שימוש ב heredoc יעבוד בלא בעיה (שימו לב שעורך הטקסט לא מחליף לכם טאבים ברווחים)
#cat
#heredoc
@bash_tips
רמת קושי: #advanced
לא מעט פעמים נרצה שהסקריפט שלנו יצור קובץ בעל תוכן מסויים, להלן מספר אפשרויות
שימוש ב Heredoc
פקודת cat וtee יודעות לקבל קלט וליצור ממנו קובץ, הסינטקס בנוי בצורה כזאת
בלוק שמתחיל באיזו מילה שתבחרו, במקרה שלנו EOL, ומופנה אל ה stdin של הפקודה בעזרת >>.
כל הטקסט שבתוך הבלוק יכתב אל הקובץ שעליו אנו מכריזים בשורה הראשונה.
זה נראה כך
$ cat << EOF > myfile.sql
first line
second line
EOF
למה לא נרצה לעבוד בשיטה זו?בעוד שמדובר על צורה עבודה שנמצאת בשימוש מאוד נרחב, היא בעלת סינטקס לא ממש אינטואיטיבי אבל הבעיה הגדולה יותר זה שהיא רגישה לכך שהמילה שסוגרת את הבלוק תהיה בתחילת השורה, מספיק רווח אחד כדי להכשיל את הקוד.
פתרון
לאלו שרוצים להכניס את הקוד לעיל לפונקציה ולהזיח את הטסט כראוי, ניתן להשתמש בטאב במקום ברווח, בצורה זו שימוש ב heredoc יעבוד בלא בעיה (שימו לב שעורך הטקסט לא מחליף לכם טאבים ברווחים)
#cat
#heredoc
@bash_tips
להעביר מספר שורות לקובץ (ב)
רמת קושי: #beginners
שימוש ב echo
הדרך הקלה ביותר ליצירת קובץ היא על ידי echo, ניתן להשתמש עם מחרוזת בעלת משתנים או סתם מחרוזת בעלת גרש בודד
שימוש ב Grouping Commands
על תכונה זו דיברנו בעבר, בקצרה היא מאפשרות לאגוד מספר פקודות תחת פלט אחד, אם נרצה לכתוב תוכן לקובץ נוכל לעשות זאת בצורה הבאה
#echo
#grouping_commands
@bash_tips
רמת קושי: #beginners
שימוש ב echo
הדרך הקלה ביותר ליצירת קובץ היא על ידי echo, ניתן להשתמש עם מחרוזת בעלת משתנים או סתם מחרוזת בעלת גרש בודד
$ echo "there's no place like $HOME" > /tmp/test.txt
זה מתחיל להיראות מעט שונה כשצריך ליצור קובץ בעל כמה שורות, או לחילופין קובץ שמכיל שרשור גרשיים ומשתנים מסוגים שונים כחלק מהמחרוזת, התוכן בקוד הופך להיות פחות קריא וקל לשבור אותושימוש ב Grouping Commands
על תכונה זו דיברנו בעבר, בקצרה היא מאפשרות לאגוד מספר פקודות תחת פלט אחד, אם נרצה לכתוב תוכן לקובץ נוכל לעשות זאת בצורה הבאה
$ {
echo "first line"
echo "second line"
} > myfile.sql
אין הרבה מה לומר פרט לכך שהקוד נראה ברור נקי ויפה, וכבר לפני יצירת הקובץ קל לראות איך התוכן שלו יראה, ניתן להשתמש בקומבינציה של מחרוזות כפולי גרשיים עם משתנים ועם מחרוזות של גרש בודד, הטוב שבכל העולמות.#echo
#grouping_commands
@bash_tips
פוסט מעט אחר, על אנדרואיד ובאש
רמת קושי: #beginners
אחר חג שמח לכולם, חופש חול המועד וכל מיני צרכים משתנים גרמו לי להכיר את Termux קצת יותר טוב, למי שלא מכיר Termux זה טרמינל לינוקס שרץ על מכשירי אנדרואיד, הוא מאפשר להתקין חבילות, להשתמש בכלים המוכרים מעולם הלינוקס ועוד, כל הכיף הזה בלי צורך להיות root.
איפה היינו? 🤔 באש כן
לא זכור לי שצריך להתקין משהו מיוחד בשביל באש, בכל אופן פקודת הקסם שלנו בשביל להוסיף איזו חבילה שהיא למערכת היא על ידי
להלן הדברים שעזרו לי ולמה אני חושב שזאת אפליקציה ממש ממש ממש נהדרת.
קיצורי מקשים
מסתבר שיש אנשים חכמים בעולם שמבינים שסטנדרט זה דבר חשוב, termux תומכת ברשימה יפה מאוד של קיצור מקשים בדיוק כמו בטרמינל שבמחשב, שני דברים שלא חשוב לזכור אבל נחמד לדעת,
ווליום למעלה זה המקבילה של Alt
ווליום למטה זה המקבילה של Ctrl
מכאן כל קומבינציה של קיצורי מקשים מהטרמינל נכונה גם לtermux
למה אני אומר שזה לא חשוב לזכור את זה? מהסיבה הפשוטה שזה מופיע על המסך.
הגדרת termux
ברוח השימוש בטרמינל כל הגדרות שנרצה להגדיר לאפליקציה יעשו דרך הקובץ הבא שיהיה "בתיקיית הבית"
פאנל השליטה בו מופיעים הכפתורים ניתן לעריכה ואפשר להוסיף לו אלו כפתורים שנרצה כל זה נעשה על ידי השמה של ערכים למערך בשם extra-keys עליו תוכלו לקרוא יותר כאן
או פשוט להריץ הפקודות של הסקריפט הבא (שששש אצלנו לא משרשרים לינקים לא ידועים ישירות לשאלל)
אחסון
ברירת מחדל "לתיקיית הבית" יש הרשאות רק לroot ולבעלים של התיקייה, מאחר ומשתשמש האנדרואידי שלנו לא נכלל ברשימה הקצרה הזאת, נצטרך למצוא דרך להעביר קבצים שאנו מורידים אל המכשיר עצמו.
לדרך הזאת יש שם או יותר נכון פקודה שמבקשת מהמשתמש לאשר גישה לאחסון כך שיהיה ניתן לשמור אליו דברים ישירות, הרצה של הפקודה הבאה תיצור תיקיית storage בה יש לינקים סימבולים למספר תיקיות במכשיר
התממשקות לAPI של המכשיר
מסתבר שהחברה ב Termux הגדילו לעשות, ישנה התממשקות לapi של אנדרואיד וניתן לתשאל את המערכת בכל מיני צורות, זה דיי מוגבל ומגרסת פאי זה מוגבל אפילו יותר, בכל אופן לאלו שרוצים להשתעשע מוזמנים להתקין את החבילה הבאה
לסיום כדאי לעבור על התיעוד, מן הסתם לא הקפתי את כל הדברים ש Termux מאפשרת אלא רק את מה שנגע בקצה המזלג שלי, הלינק המעניין הוא כאן
#termux
#android
@bash_tips
רמת קושי: #beginners
אחר חג שמח לכולם, חופש חול המועד וכל מיני צרכים משתנים גרמו לי להכיר את Termux קצת יותר טוב, למי שלא מכיר Termux זה טרמינל לינוקס שרץ על מכשירי אנדרואיד, הוא מאפשר להתקין חבילות, להשתמש בכלים המוכרים מעולם הלינוקס ועוד, כל הכיף הזה בלי צורך להיות root.
איפה היינו? 🤔 באש כן
לא זכור לי שצריך להתקין משהו מיוחד בשביל באש, בכל אופן פקודת הקסם שלנו בשביל להוסיף איזו חבילה שהיא למערכת היא על ידי
$ pkg install python
בחזרה לעניינים, למי שינסה להשתמש ב termux מיד לאחר ההתקנה יגלה מהר מאוד קרניים שצומחות לאיטן, זה מתחיל בזה שאין אפשרות להחזיר את הסמן מילים ואותיות לאחור ובעוד כל מיני שטויות שהופכות את האפליקציה ללא שמישה.להלן הדברים שעזרו לי ולמה אני חושב שזאת אפליקציה ממש ממש ממש נהדרת.
קיצורי מקשים
מסתבר שיש אנשים חכמים בעולם שמבינים שסטנדרט זה דבר חשוב, termux תומכת ברשימה יפה מאוד של קיצור מקשים בדיוק כמו בטרמינל שבמחשב, שני דברים שלא חשוב לזכור אבל נחמד לדעת,
ווליום למעלה זה המקבילה של Alt
ווליום למטה זה המקבילה של Ctrl
מכאן כל קומבינציה של קיצורי מקשים מהטרמינל נכונה גם לtermux
למה אני אומר שזה לא חשוב לזכור את זה? מהסיבה הפשוטה שזה מופיע על המסך.
הגדרת termux
ברוח השימוש בטרמינל כל הגדרות שנרצה להגדיר לאפליקציה יעשו דרך הקובץ הבא שיהיה "בתיקיית הבית"
~/.termux/termux.properties
אני מגרגש את המונח תיקיית הבית כי תכלס מדובר על תיקייה שנמצאת בנתיב הבא והוא מוגדר ביחס ל termux ולא ביחס לתיקיית הבית של המכשיר/data/data/com.termux/files/home
הגדרת פאנל שליטהפאנל השליטה בו מופיעים הכפתורים ניתן לעריכה ואפשר להוסיף לו אלו כפתורים שנרצה כל זה נעשה על ידי השמה של ערכים למערך בשם extra-keys עליו תוכלו לקרוא יותר כאן
או פשוט להריץ הפקודות של הסקריפט הבא (שששש אצלנו לא משרשרים לינקים לא ידועים ישירות לשאלל)
אחסון
ברירת מחדל "לתיקיית הבית" יש הרשאות רק לroot ולבעלים של התיקייה, מאחר ומשתשמש האנדרואידי שלנו לא נכלל ברשימה הקצרה הזאת, נצטרך למצוא דרך להעביר קבצים שאנו מורידים אל המכשיר עצמו.
לדרך הזאת יש שם או יותר נכון פקודה שמבקשת מהמשתמש לאשר גישה לאחסון כך שיהיה ניתן לשמור אליו דברים ישירות, הרצה של הפקודה הבאה תיצור תיקיית storage בה יש לינקים סימבולים למספר תיקיות במכשיר
$ termux-setup-storage
חשוב לזכור שזאת מערכת לינוקס ותמיד אפשר לשנות הרשאות או ליצור לינקים סימבוליים נוספים לרחבי המערכתהתממשקות לAPI של המכשיר
מסתבר שהחברה ב Termux הגדילו לעשות, ישנה התממשקות לapi של אנדרואיד וניתן לתשאל את המערכת בכל מיני צורות, זה דיי מוגבל ומגרסת פאי זה מוגבל אפילו יותר, בכל אופן לאלו שרוצים להשתעשע מוזמנים להתקין את החבילה הבאה
$ pkg install termux-api
התיעוד לא ממש מעודכן, בכל אופן הוא נמצא כאן לסיום כדאי לעבור על התיעוד, מן הסתם לא הקפתי את כל הדברים ש Termux מאפשרת אלא רק את מה שנגע בקצה המזלג שלי, הלינק המעניין הוא כאן
#termux
#android
@bash_tips
על אנדרואיד ובאש פרק ב
רמת קושי: #beginners
אחת הסיבות שאני אוהב לשתף מה למדתי היא השיח המעשיר שמגיע לאחר מכן, בקצרה אלו הדברים שלמדתי בעקבות הפוסט שכתבתי על Termux, ותודה רבה לכל נותני ההערות והמעשירים למינם, תבואו לעיתים קרובות יותר 😃
התקנת Tremux
את Termux לא כדאי להתקין מחנות האפליקציות של גוגל אלא מ Fdroid, הסיבה לכך היא שהמפתחים הפסיקו לעדכן את האפליקציה בגוגל פליי (גרסת SDK ישנה), במקום זאת העדכונים עולים לחנות המקבילה והחופשית.
למי שלא מכיר F-droid היא חנות אפליקציות המקבילה לגוגל פליי, מוכרת מאוד בעולם הקוד פתוח אבל לא רק, שמה הוא בעצם קיצור של FOSS Droid.
תוספי Termux בחינם
לאחר שהתקנתי את החבילה מ Fdroid ראיתי שגם כל התוספים הנלווים ל Termux מוצעים בחינם להורדה, מדובר על תוספים שבתשלום בחנות של גוגל מן הסתם זה עדין כך עקב חוסר העדכון, תוסף שאהבתי הוא Widget המחזיק רשימת סקריפטים ומאפשר להריץ אותם ישירות ממסך הבית.
כמובן יש עוד, זאת הרשימה.
התממשקות לAPI של המכשיר
בניגוד למה שכתבתי בפוסט הקודם נראה שהתמיכה ב API של אנדרואיד אפילו גדלה, רשימה נאה של פונקציונליות ניתן לראות כאן,
באג בהשלמה אוטומטית
למשתמשי מקלדת samsung יש בעיית התממשקות לTermux, ההשלמה האוטומטית משלימה דיי מה שמתחשק לה, הבעיה ידועה וניתנת לפתרון על ידי הורדת ההערה מהשורה הבאה בקובץ ההגדרות של Termux הלא הוא
כמו תמיד מוזמנים לשתף ולהגיב
#termux
#android
@bash_tips
רמת קושי: #beginners
אחת הסיבות שאני אוהב לשתף מה למדתי היא השיח המעשיר שמגיע לאחר מכן, בקצרה אלו הדברים שלמדתי בעקבות הפוסט שכתבתי על Termux, ותודה רבה לכל נותני ההערות והמעשירים למינם, תבואו לעיתים קרובות יותר 😃
התקנת Tremux
את Termux לא כדאי להתקין מחנות האפליקציות של גוגל אלא מ Fdroid, הסיבה לכך היא שהמפתחים הפסיקו לעדכן את האפליקציה בגוגל פליי (גרסת SDK ישנה), במקום זאת העדכונים עולים לחנות המקבילה והחופשית.
למי שלא מכיר F-droid היא חנות אפליקציות המקבילה לגוגל פליי, מוכרת מאוד בעולם הקוד פתוח אבל לא רק, שמה הוא בעצם קיצור של FOSS Droid.
תוספי Termux בחינם
לאחר שהתקנתי את החבילה מ Fdroid ראיתי שגם כל התוספים הנלווים ל Termux מוצעים בחינם להורדה, מדובר על תוספים שבתשלום בחנות של גוגל מן הסתם זה עדין כך עקב חוסר העדכון, תוסף שאהבתי הוא Widget המחזיק רשימת סקריפטים ומאפשר להריץ אותם ישירות ממסך הבית.
כמובן יש עוד, זאת הרשימה.
התממשקות לAPI של המכשיר
בניגוד למה שכתבתי בפוסט הקודם נראה שהתמיכה ב API של אנדרואיד אפילו גדלה, רשימה נאה של פונקציונליות ניתן לראות כאן,
באג בהשלמה אוטומטית
למשתמשי מקלדת samsung יש בעיית התממשקות לTermux, ההשלמה האוטומטית משלימה דיי מה שמתחשק לה, הבעיה ידועה וניתנת לפתרון על ידי הורדת ההערה מהשורה הבאה בקובץ ההגדרות של Termux הלא הוא
.termux/termux.properties
enforce-char-based-input = true
טעינה מחדש של ההגדרות על ידי termux-reload-settings
, והסיפור סגורכמו תמיד מוזמנים לשתף ולהגיב
#termux
#android
@bash_tips
לוג לפונקציות, צנזור מידע ו subshell
רמת קושי: #advanced
הרצה של קוד בתת מעטפת מתרחש מכל מיני דרכים כמו בעת שימוש בpipe או בעת הרצת פקודה בתוך סוגריים, הכירות עם התכונה הזאת של באש עשויה לא רק למנוע באגים לא צפויים אלא אפילו למצוא פתרונות יצירתיים לבעיות שעולות.
ניקח לדוגמה סיטואציה בה יש לנו פונקציית לוגר שמתעדת כל פונקציה שנקראת ועם אלו פרמטרים היא רצה, הפונקציה נראית כך
מה שיקרה כרגע הוא שהמידע הרגיש שלנו יכתב ללוג וזה כבר פחות סבבה.
אנחנו רוצים בעצם יכולת לצנזר מידע רגיש שעובר ללוגר, העניין הוא שלא תמיד נדע איזה מידע אנו רוצים לצנזר ואם בכלל צריך לצנזר, לכן אנו צריכים אופציה להגדיר מהו מידע רגיש מחוץ ללוגר ושנוכל להשתמש באופציה הזאת רק מתי שנחוץ לנו.
אפשרות למימוש
פשוט להריץ פקודת sed שתעשה החלפה למחרוזות שהלוגר מקבל, על ידי הגדרה של שני משתנים כשהראשון מקבל regex מה להחליף והשני מגדיר לאיזה מחרוזת להחליף.
נשנה מעט את הפונקציה שלנו וכעת היא נראית כך.
אבל עכשיו יש בעיה אחרת, אם כל פעם נצטרך ליצור משתנים שמגדירים איזה תוכן לצנזר, זה אומר שנצטרך גם למחוק את אותם משתנים כדי שלא ישפיעו על פונקציות אחרות ויצנזרו מידע שאנו כן צריכים
כדי לפתור את הבעיה הזאת נוכל להריץ את הקוד בתת מעטפת וכך כל המשתנים ימחקו אוטומטית ברגע שהקוד יצא מתת המעטפת.
#subshell
#function
רמת קושי: #advanced
הרצה של קוד בתת מעטפת מתרחש מכל מיני דרכים כמו בעת שימוש בpipe או בעת הרצת פקודה בתוך סוגריים, הכירות עם התכונה הזאת של באש עשויה לא רק למנוע באגים לא צפויים אלא אפילו למצוא פתרונות יצירתיים לבעיות שעולות.
ניקח לדוגמה סיטואציה בה יש לנו פונקציית לוגר שמתעדת כל פונקציה שנקראת ועם אלו פרמטרים היא רצה, הפונקציה נראית כך
get_page(){
logger "run function: ${FUNCNAME[0]} with parameters: ${*}"
echo "${page}"
}
וכך נראית הסקריפט כשאנו מריצים אותו$ bash test.sh https://google.com
[*] run function: get_page with parameters: https://google.com
ולמי שמאוד סקרן כך נראית פונקציית loggerlogger() {
status=$?
if [[ $status -eq 0 ]]; then
echo -e "\e[92m[*] ${@}"
else
echo -e "\e[91m[!] ${@}"
fi
}
פונקציונליות נחמדה מאוד אין ספק אבל ישנה בעיה, מה קורה ברגע שנעביר מידע רגיש כמו פרטי התחברות לאתר לפונקציה? מה שיקרה כרגע הוא שהמידע הרגיש שלנו יכתב ללוג וזה כבר פחות סבבה.
$ test.sh https://admin.site myuser mypass
[*] run function: get_page with parameters: https://admin.site myuser mypass
מה בעצם אנו צריכים?אנחנו רוצים בעצם יכולת לצנזר מידע רגיש שעובר ללוגר, העניין הוא שלא תמיד נדע איזה מידע אנו רוצים לצנזר ואם בכלל צריך לצנזר, לכן אנו צריכים אופציה להגדיר מהו מידע רגיש מחוץ ללוגר ושנוכל להשתמש באופציה הזאת רק מתי שנחוץ לנו.
אפשרות למימוש
פשוט להריץ פקודת sed שתעשה החלפה למחרוזות שהלוגר מקבל, על ידי הגדרה של שני משתנים כשהראשון מקבל regex מה להחליף והשני מגדיר לאיזה מחרוזת להחליף.
נשנה מעט את הפונקציה שלנו וכעת היא נראית כך.
get_page(){
input=$(sed "s|${REPLACE}|${REPLACE_TO}|g" <<<"${@}")
logger "run function: ${FUNCNAME[0]} with parameters: ${input}"
echo "${page}"
}
וכך אנו קוראים לפונקציה בסקריפטREPLACE="myp.*"
REPLACE_TO="***"
get_page "${@}"
נבדוק רגע נראה שהכל עובד תקין$ test.sh https://admin.site myuser mypass
[*] run function: get_page with parameters: https://admin.site myuser ***
אחלה הכל עובד פיקס!אבל עכשיו יש בעיה אחרת, אם כל פעם נצטרך ליצור משתנים שמגדירים איזה תוכן לצנזר, זה אומר שנצטרך גם למחוק את אותם משתנים כדי שלא ישפיעו על פונקציות אחרות ויצנזרו מידע שאנו כן צריכים
REPLACE="myp.*"
REPLACE_TO="***"
get_page "${@}"
unset REPLACE
unset REPLACE_TO
לא כיףכדי לפתור את הבעיה הזאת נוכל להריץ את הקוד בתת מעטפת וכך כל המשתנים ימחקו אוטומטית ברגע שהקוד יצא מתת המעטפת.
(
REPLACE="myp.*"
REPLACE_TO="***"
page=$(get_page "${@}")
)
#scripting#subshell
#function
@bash_tipsהמדריך_לטרמינל_לינוקס_למתחילים_Qazjap11.pdf
236.2 KB
רמת קושי: #beginners
כחלק מהמאמץ להנגיש את התוכן של הערוץ לא רק למתקדמים, להלן מסמך שמאוד ניהנתי לקרוא לפני מיליון שנה בערך, כמובן שהוא עדין רלוונטי
אני חשוב שהוא מאוד יעזור למתחילים אחרים
@bash_tips
כחלק מהמאמץ להנגיש את התוכן של הערוץ לא רק למתקדמים, להלן מסמך שמאוד ניהנתי לקרוא לפני מיליון שנה בערך, כמובן שהוא עדין רלוונטי
אני חשוב שהוא מאוד יעזור למתחילים אחרים
@bash_tips
יציאה מלולאה מקוננת
רמת קושי: #beginners
בבאש כמו בכל שפת תכנות בשביל להפסיק ריצה של לולאה משתמשים בב break
לשם כך באש מאפשרת להעביר פרמטר ל break כדי להגדיר עד איזה עומק השבירה של הלולאה תתבצע, בדוגמה הבאה בשבירה תתבצע על שתי הלולאות.
@bash_tips
רמת קושי: #beginners
בבאש כמו בכל שפת תכנות בשביל להפסיק ריצה של לולאה משתמשים בב break
,
for i in {1..10}
do
echo $i
sleep 1
breakמה עושים כשהלולאה רצה בתוך לולאה אחרת (לולאה מקוננת) ורוצים לצאת משתי הלולאות?
done
לשם כך באש מאפשרת להעביר פרמטר ל break כדי להגדיר עד איזה עומק השבירה של הלולאה תתבצע, בדוגמה הבאה בשבירה תתבצע על שתי הלולאות.
for i in {1..10}
do
for j in {1..10}
do
echo $i
sleep 1
break 2
done
echo first loop
done
#loops@bash_tips
אוהבים אתגרים? הנה אתר גאוני ממש
רמת קושי: #advanced
https://oops.cmdchallenge.com/
https://12days.cmdchallenge.com/
אתם רק מתחילים ורוצים להכיר את באש בצורה חווייתית יותר?
רמת קושי: #beginners
https://cmdchallenge.com/
#challenge
#tools
@bash_tips
רמת קושי: #advanced
https://oops.cmdchallenge.com/
https://12days.cmdchallenge.com/
אתם רק מתחילים ורוצים להכיר את באש בצורה חווייתית יותר?
רמת קושי: #beginners
https://cmdchallenge.com/
#challenge
#tools
@bash_tips
קוד קריא
מכירים את זה ששרשרתם כמה פקודות עם pipe כדי לפלטר בדיוק את המידע שרציתם מהפלט אבל קיבלתם שורה ארוכה ולא קריאה בעליל?
@bash_tips
pipe
רמת קושי: #beginnersמכירים את זה ששרשרתם כמה פקודות עם pipe כדי לפלטר בדיוק את המידע שרציתם מהפלט אבל קיבלתם שורה ארוכה ולא קריאה בעליל?
$ curl https://google.com -v --trace-time 2>&1 | grep "^[0-9]" | cut -d ' ' -f1 | cut -d ':' -f3
אז מסתבר שאפשר לפצל שורות בעזרת ה pipe, קוד הגיוני סך הכל$ curl https://google.com -v --trace-time 2>&1 |
grep "^[0-9]" |
cut -d ' ' -f1 |
cut -d ':' -f3
#pipe@bash_tips
להמיר מחרוזת למערך
רמת קושי: #beginners
כפי שאנו מכירים יצירת מערך בבאש נעשית על ידי הכנסת ערכים לסוגריים עגולים
קוד שאפשר לראות לא מעט עושה את הדבר הבא כדי לקבל מערך ממחרוזת
דרך נוספת וקריאה יותר היא להעביר את המשנה כמות שהוא בלי גרשיים
בעוד שבדרך כלל כל התייחסות למשתנה צריכה להיות כשהוא עטוף בגרשיים, במקרה שלנו דווקא החוסר שלהם עושה את הקסם.
קריאה למשתנה "מגורגש"
במידה והמחרוזת שלנו מכילה ערכים שהם globbing characters מה שיקרה הוא שבאש יתייחס לתווים הללו כבעלי משמעות ולא יתייחס אליהם כתווים רגילים.
כפי שניתן לראות חוץ מהמחרוזת שלנו קיבלנו גם את רשימת הקבצים שבתיקייה, כל זה קורה כי התוכן שאנו מעבירים למערך הוא לא רק מחרוזת אלא מחרוזת וביטוי wildcard ולכן בנוסף לתוכן שהעברנו קיבלנו גם את רשימת הקבצים בתיקייה ממנה הרצנו את הפקודה.
#globbing_characters
#declare
#array
@bash_tips
רמת קושי: #beginners
כפי שאנו מכירים יצירת מערך בבאש נעשית על ידי הכנסת ערכים לסוגריים עגולים
$ arr=(1 2 3)
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")
קריאה למשתנה בתוך הסוגרייםקוד שאפשר לראות לא מעט עושה את הדבר הבא כדי לקבל מערך ממחרוזת
$ numbers="1 2 3"
$ myarr=($(echo "${numbers}"))
האמת זה עובד נפלא, shellcheck לא ממש אוהב את זה, אבל זהו קוד שעובד.דרך נוספת וקריאה יותר היא להעביר את המשנה כמות שהוא בלי גרשיים
בעוד שבדרך כלל כל התייחסות למשתנה צריכה להיות כשהוא עטוף בגרשיים, במקרה שלנו דווקא החוסר שלהם עושה את הקסם.
קריאה למשתנה "מגורגש"
$ numbers="1 2 3"
$ myarr=("${numbers}")
$ declare -p myarr
declare -a myarr=([0]="1 2 3")
קריאה למשתנה נטול גרשיים$ myarr=(${numbers})
$ declare -p myarr
declare -a myarr=([0]="1" [1]="2" [2]="3")
היכן הפינות?במידה והמחרוזת שלנו מכילה ערכים שהם globbing characters מה שיקרה הוא שבאש יתייחס לתווים הללו כבעלי משמעות ולא יתייחס אליהם כתווים רגילים.
$ ls
1.txt 2.txt 3.txt
$ myvar="text with wildcard *"
$ mylist=( $(echo "$myvar") )
$ declare -p mylist
declare -a mylist=([0]="text" [1]="with" [2]="wildcard" [3]="1.txt" [4]="2.txt" [5]="3.txt")
כפי שניתן לראות חוץ מהמחרוזת שלנו קיבלנו גם את רשימת הקבצים שבתיקייה, כל זה קורה כי התוכן שאנו מעבירים למערך הוא לא רק מחרוזת אלא מחרוזת וביטוי wildcard ולכן בנוסף לתוכן שהעברנו קיבלנו גם את רשימת הקבצים בתיקייה ממנה הרצנו את הפקודה.
#globbing_characters
#declare
#array
@bash_tips
תוסף bash-ide
רמת קושי: #beginners
מי שמשתמש ב VScode ודאי שם לב שאין שום תמיכה של סביבת עבודה בכל מה שקשור לבאש, לשם כך יש את התוסף הבא, וכמו בכל תוסף שווה להסתכל בהגדרות.
https://marketplace.visualstudio.com/items?itemName=mads-hartmann.bash-ide-vscode
#tools
@bash_tips
רמת קושי: #beginners
מי שמשתמש ב VScode ודאי שם לב שאין שום תמיכה של סביבת עבודה בכל מה שקשור לבאש, לשם כך יש את התוסף הבא, וכמו בכל תוסף שווה להסתכל בהגדרות.
https://marketplace.visualstudio.com/items?itemName=mads-hartmann.bash-ide-vscode
#tools
@bash_tips
Bash Tips
רצפים ופורמטים עם seq רמת קושי: #beginners כפי שאנו מכירים באש מאפשרת ליצור רצפים של מספרים על ידי שימוש ב Brace expansion (הביטוי שמתאר את הפעולה הבאה {10..1} ) וזה עובד יפה מאוד כשמשתמשים בזה עם מספרים cat myscript.sh for i in {1..10}; do echo $i…
איחוד רצפים seq
רמת קושי: #beginners
פקודת
תכונה שימושית נוספת שהפקודה מכילה היא האפשרות לקבוע איזה תו יפריד בין כל תו/מילה/מספר שהיא יוצרת
דוגמה שימושית בתכונה זו היא יצירת מחרוזת לregex שבוחרת שנים בין 2016 ל 2021 מבלי להיכנס לסינטקס הלא ברור של regex
#seq
#regex
@bash_tips
רמת קושי: #beginners
פקודת
seq
עליה דיברנו בעבר מאפשרת ליצור רצף של תוויםתכונה שימושית נוספת שהפקודה מכילה היא האפשרות לקבוע איזה תו יפריד בין כל תו/מילה/מספר שהיא יוצרת
דוגמה שימושית בתכונה זו היא יצירת מחרוזת לregex שבוחרת שנים בין 2016 ל 2021 מבלי להיכנס לסינטקס הלא ברור של regex
$ seq -s "|" 2016 2021
2016|2017|2018|2019|2020|2021
#seq
#regex
@bash_tips
השמה למשתנה בתהליך תנאי
רמת קושי: #beginners
באש מאפשרת ליצור תנאים שמבוססים על הרצה של פקודה, התנאי הבא שווה לtrue במידה והפקודה הצליחה ולא נכשלה.
ובשביל תנאי הפוך שמממש את ה-if מתי שהפקודה נכשלת מוסיפים ! לפני הפקודה
עד כאן כולם מכירים
מה שפחות מכירים היא האפשרות של השמה למשתנה כחלק מתהליך התנאי.
כפי שניתן לראות אנו מבצעים השמה למשתנה כחלק מתהליך התנאי, במידה והפקודה נכשלת המשתנה נשאר ריק ולא תתבצע שום השמה
#if
#conditions
#assignment
@bash_tips
רמת קושי: #beginners
באש מאפשרת ליצור תנאים שמבוססים על הרצה של פקודה, התנאי הבא שווה לtrue במידה והפקודה הצליחה ולא נכשלה.
if curl "${my_url}" ; then
my_logger "link to song: ${my_url}"
fi
ובשביל תנאי הפוך שמממש את ה-if מתי שהפקודה נכשלת מוסיפים ! לפני הפקודה
if ! curl "${my_url}" ; then
my_logger "failed to fetch: ${my_url}"
fi
עד כאן כולם מכירים
מה שפחות מכירים היא האפשרות של השמה למשתנה כחלק מתהליך התנאי.
if output=$(curl "${my_url}" | grep "rozy-*"); then
my_logger "user ${output} looged in"
fi
כפי שניתן לראות אנו מבצעים השמה למשתנה כחלק מתהליך התנאי, במידה והפקודה נכשלת המשתנה נשאר ריק ולא תתבצע שום השמה
#if
#conditions
#assignment
@bash_tips