Bash Tips
מילונים / מערכים אסוציאטיבים ובאש מאז הגרסאות האחרונות של באש יש אובייקט חדש שמוכר מכל שפת תכנות נפוצה הלא הוא מילון/מערך אסוציטיבי, ניתן להגדיר אותו על ידי שימוש ב declare שדיברנו עליו בעבר $ declare -A my_dict $ my_dict=(["First Name"]="Yossi" ["Last Name"]="Cohen")…
מפתחות וערכים
רמת קושי: #advanced
כפי שראינו בעבר הגדרה של מערך נראית כך
ישנם משתנים בבאש שמכילים מידע במערך אסוציאטיבי, למשל המשתנה הגלובלי BASH_ALIASES שמכיל את כל האליאסים בתצורה של key value
נ.ב. ימים אחרונים לאתגר ולאחר מכן אפרסם פתרון אפשרי.
#array
@bash_tips
רמת קושי: #advanced
כפי שראינו בעבר הגדרה של מערך נראית כך
$ declare -A my_array
$ my_array=([first]="test here" [second]="more text here")
יש לנו מערך אסוציאטיבי בעל שני מפתחות, בכדי לקבל ערך פשוט קוראים למערך עם המפתח המתאים.$ echo "${my_array[first]}"
test here
$ echo "${my_array[second]}"
more text here
אפשרות נוספת שבאש מאפשרת לנו היא לרוץ רק על הערכים על ידי שימוש ב @
במקום מפתח $ for i in "${my_array[@]}"; do
echo $i
done
test here
more text here
או אם רוצים לקבל רק את המפתחות פשוט לשים !
לפני שם המערך$ for i in "${!my_array[@]}"; do
echo $i
done
first
second
ובדומה למערך רגיל #
לפני שם המערך האסוציאטיבי יחזיר את הגודל שלו $ echo "${#my_array[@]}"
2
למה זה מעניין אותנו כל הסיפור הזה?ישנם משתנים בבאש שמכילים מידע במערך אסוציאטיבי, למשל המשתנה הגלובלי BASH_ALIASES שמכיל את כל האליאסים בתצורה של key value
נ.ב. ימים אחרונים לאתגר ולאחר מכן אפרסם פתרון אפשרי.
#array
@bash_tips
לקבץ פקודות ותת מעטפת
רמת קושי: #advanced
באש מאפשרת לנו לאגוד מספר פעולות יחד ולשרשר את הפלט הסופי רק בגמר הריצה של כל הפקודות ל stdout, בכדי לעשות כך ניתן להריץ את הפקודות בתוך סוגרים / מסולסלות ואת הפלט לשרשר החוצה.
לדוגמה
הקוד הבא לא ישרשר את שני המילים לקובץ test אלא ידפיס אחד למסך ואחד לקובץ המדובר
זה לא משנה אם נשתמש בסוגריים מסולסלות או בסוגריים רגילות, בשני המקרים הפקודות ירוצו בגרופ. העניין הוא ששימוש בסוגריים רגילות הפקודות ירוצו ב
השמה בתת מעטפת
#grouping_commands
@bash_tips
רמת קושי: #advanced
באש מאפשרת לנו לאגוד מספר פעולות יחד ולשרשר את הפלט הסופי רק בגמר הריצה של כל הפקודות ל stdout, בכדי לעשות כך ניתן להריץ את הפקודות בתוך סוגרים / מסולסלות ואת הפלט לשרשר החוצה.
לדוגמה
הקוד הבא לא ישרשר את שני המילים לקובץ test אלא ידפיס אחד למסך ואחד לקובץ המדובר
$ echo first; echo second > /tmp/test
first
$ cat /tmp/test
second
במקום זאת בכדי להפנות את שני הפלטים של פקודת ה echo לקובץ אחד ניתן לתחום את הפקודות כגרופ על ידי סוגריים / מסולסלות, ורק כשהפקודות יסיימו לרוץ הפלט יועבר הלאה.$ (echo first echo second) > /tmp/test
$ cat /tmp/test
first
second
חשוב לשים לבזה לא משנה אם נשתמש בסוגריים מסולסלות או בסוגריים רגילות, בשני המקרים הפקודות ירוצו בגרופ. העניין הוא ששימוש בסוגריים רגילות הפקודות ירוצו ב
subshell
ואילו שימוש בסוגריים מסולסלות יריץ את הפקודות בshell הנוכחיהשמה בתת מעטפת
$ (a=1; b=2; c=3; echo $a-$b-$c)
1-2-3
$ echo $a-$b-$c
--
השמה במעטפת הראשית$ {a=1; b=2; c=3; echo $a-$b-$c}
1-2-3
$ echo $a-$b-$c
1-2-3
#subshell#grouping_commands
נ.ב. ימים אחרונים לאתגר ולאחר מכן אפרסם פתרון אפשרי.@bash_tips
רמת קושי: #advanced
פוסט נהדר של ינון פרק
אני מדביק כאן את הלינק לפוסט כי הדיון בתגובות פשוט מעניין
https://t.me/c/1217780911/5892
#cal
#ncal
@bash_tips
פוסט נהדר של ינון פרק
אני מדביק כאן את הלינק לפוסט כי הדיון בתגובות פשוט מעניין
https://t.me/c/1217780911/5892
#cal
#ncal
@bash_tips
Forwarded from לומדים לינוקס
רישום למערכת
אתחול מעטפת
ישנן שני אפשרויות כניסה של משתמש למערכת, האחת טוענת את כל הסביבה של המשתמש, ומוכרת בשם
והאחרת פשוט מחליפה את המשתמש אבל לא טוענת את כל הסביבה, מוכרת בשם
עוד מידע בנושא ניתן למצוא ב man bash INVOCATION
@learnlinuxnote
אתחול מעטפת
ישנן שני אפשרויות כניסה של משתמש למערכת, האחת טוענת את כל הסביבה של המשתמש, ומוכרת בשם
login shell
.והאחרת פשוט מחליפה את המשתמש אבל לא טוענת את כל הסביבה, מוכרת בשם
non login shell.
כניסה רגילה למערכת טוענת את כל סביבת המעטפת, ומחפשת לטעון את הקבצים שברשימה אם הם קיימים, ברגע שאחד מהם זוהה האחרים לא יטענו פרט לקובץ /etc/bashrc
שיטען תמיד/etc/profileמצד שני אם מחליפים משתמש על ידי
~/.bash_profile
~/.bash_login
~/.bashrc
su
לא כל הסביבה של המשתמש שהוחלף נטענת, והקבצים שיטענו הן רק /etc/bashrcבכדי לטעון משתמש אחר עם su ולטעון את כל הסביבה שלו ציך לציין זאת במפורש על ידי דגל
~/.bashrc
-l
או על ידי הקיצור שלו שמוכר יותר su -
$ su -l
$ su -
אם כן למדנו טריק נחמד, ברגע שרוצים לטעון מחדש את סביבת המשתמש בלי לעשות login logout, ניתן פשוט להריץ$ su - userישנן עוד השפעות non shell login כגון משתני סביבה שלא מוגדרים
עוד מידע בנושא ניתן למצוא ב man bash INVOCATION
@learnlinuxnote
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
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
2. פקודת
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
פקודת
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
1 for file in *;
2 do
3 sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4 dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5 mkdir -p "$dest"
6 cp "$file" "$dest"
7 done
שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf
2. פקודת
sed
מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים (;
הוא חוצץ בין שני הביטויים)שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
_ , -
ברווח.מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf
3. בחירה של 2 המילים הראשונות, איך זה קורה? פקודת
cut
מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח, ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
dest="test/שמחה פרידמן"
מפה זה די פשוט וקלשורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
משימה שניה
רמת קושי: #beginners
החלק השני של המשימה הוא
להצליח להתגבר על קבצים ששם הזמר נמצא בסוף שם הקובץ.
לכאורה כשחושבים על המשימה הזאת בפעם הראשונה לא מבינים איך זה אפשרי לביצוע בלא שיהיה רשימה של הזמרים לעבור עליה ולחפש מחרוזות. לאחר שמסיימים את האתגר הראשון מבינים שבעצם יש לנו רשימה של זמרים, הלא היא רשימת התיקיות שיצרנו במשימה הראשונה שבעצם נתנה לנו רשימה נכבדה של זמרים.
מה יהיה אם פשוט נעבור על שמות התיקיות שיצרנו ונחפש את המחרוזות שלהם בכל הקבצים? בצורה הזאת לא משנה היכן יהיה קיים שם הזמר, אם לפני כן היה קובץ אחד ששם הזמר היה בתחילתו, נוכל לאתר את כל הקבצים ששם הזמר נמצא בסופם.
הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך
שורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)
ובעצם יוצא שכך נראה כרגע התוכן של משתנה
1. לוקחת את שם הזמר בדוגמה שלנו הוא
הנתיבים שאנו מקבלים נראים כך
2. שמות הקבצים שיצאו תואמים לשם התיקייה של הזמר מועברים לאותה תיקייה.
זה גורם לכך שכל תיקיית זמר מאורגנת מחדש ומקבלת קבצים חדשים, ולכך שיש כרגע תיקיות ריקות בעץ הקבצים שלנו לאחר ששלפנו משם את הקבצים שהיו תואמים את החיפוש.
שורה 12: הפקודה האחרונה בסופו של דבר עוברת על כל התיקיות הריקות ומוחקת אותם.
זהו עד כאן משימה שניה של האתגר
התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
#challenge
#find
#loop
#rmdir
@bash_tips
משימה שניה
רמת קושי: #beginners
החלק השני של המשימה הוא
להצליח להתגבר על קבצים ששם הזמר נמצא בסוף שם הקובץ.
לכאורה כשחושבים על המשימה הזאת בפעם הראשונה לא מבינים איך זה אפשרי לביצוע בלא שיהיה רשימה של הזמרים לעבור עליה ולחפש מחרוזות. לאחר שמסיימים את האתגר הראשון מבינים שבעצם יש לנו רשימה של זמרים, הלא היא רשימת התיקיות שיצרנו במשימה הראשונה שבעצם נתנה לנו רשימה נכבדה של זמרים.
מה יהיה אם פשוט נעבור על שמות התיקיות שיצרנו ונחפש את המחרוזות שלהם בכל הקבצים? בצורה הזאת לא משנה היכן יהיה קיים שם הזמר, אם לפני כן היה קובץ אחד ששם הזמר היה בתחילתו, נוכל לאתר את כל הקבצים ששם הזמר נמצא בסופם.
הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך
7 for dir in test/*;
8 do
9 dirname="${dir/ /*}"
10 find test/* -type f -path "*${dirname##*/}*" -exec mv {} "$dir" \;
11 done
12 rmdir test/*
אחרי שהסברנו מה הרעיון שהקוד בא לממש, נעבר לראות איך זה קורה בפועלשורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)
test/שמחה פרידמן
שורה 9: מחליפה את הרווח בכוכבית, למה אתם שואלים? כי regex זה חשוב.ובעצם יוצא שכך נראה כרגע התוכן של משתנה
dirname
test/שמחה*פרידמן
שורה 10: מבצעת 2 פעולות1. לוקחת את שם הזמר בדוגמה שלנו הוא
שמחה*פרידמן
ומחפשת קבצים שנושאים את שם שלו תחת הנתיב testהנתיבים שאנו מקבלים נראים כך
test/שמחה פרידמן/שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf
החיפוש נעזר בregex, זוכרים את ה * ממקודם? אז כאן היא באה לידי שימוש ו find
מקבל את המחרוזת ה regex הבאה *שמחה*פרידמן*
ומחפש אותה בנתיב של הקבצים כמו זה שראינו שלעיל, זה מביא לידי כך שלא משנה אלו תווים יש לפני ואלו תווים יש אחרי או אפילו באמצע המחרוזת, שם הזמר תמיד יהיה מזוהה.2. שמות הקבצים שיצאו תואמים לשם התיקייה של הזמר מועברים לאותה תיקייה.
זה גורם לכך שכל תיקיית זמר מאורגנת מחדש ומקבלת קבצים חדשים, ולכך שיש כרגע תיקיות ריקות בעץ הקבצים שלנו לאחר ששלפנו משם את הקבצים שהיו תואמים את החיפוש.
שורה 12: הפקודה האחרונה בסופו של דבר עוברת על כל התיקיות הריקות ומוחקת אותם.
זהו עד כאן משימה שניה של האתגר
התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
#challenge
#find
#loop
#rmdir
@bash_tips
Forwarded from לומדים לינוקס
לקבל את רשומי המערכת
getent
לינוקס מלאה בקבצים שמכילים מידע על משתמשים, תהליכים, הגדרות וכו', במקום לרוץ ולאסוף את כל המידע הזה ולזכור היכן הוא ממוקם ישנה פקודה שמנגישה את המידע, קובץ ההגדרות נמצא בנתיב /etc/nsswitch.conf
ומאפשר להגדיר מהיכן לאסוף את המידע, להלן רשימת המידע אותו היא מספקת ברירת מחדל$ getent --helpבכדי לקבל מידע במלואו ניתן להריץ
...
Supported databases:
ahosts ahostsv4 ahostsv6 aliases ethers group gshadow hosts initgroups
netgroup networks passwd protocols rpc services shadow
...
$ getent hostsאו לבחור לקבל מידע על ערך ספציפי
127.0.0.1 localhost
192.168.39.12 myrancher.com
178.62.121.30 playground
$ getent services 67@learnlinuxnote
bootps 67/udp
$ getent services git
git 9418/tcp
Forwarded from Alex M. Schapelle
לכל אוהבי באש ואוכל :
https://gitlab.com/lpi-devops/bash_cuisine
https://gitlab.com/lpi-devops/bash_cuisine
GitLab
Lpi and DevOps Course / Bash Cuisine
👍1
טיפ נהדר של @dank3y והזוית של באש
רמת קושי: #advanced
משתמשי Zsh
אם אתם על הטרמינל כותבים פקודה כלשהי, מעבר לשימוש ב-vi mode של zsh כדי לערוך אותה,
לחיצה על ctrl + e (או מקש אחר לבחירתכם) תביא אתכם ל- vim על מלא בו תוכלו לערוך את הקוד ממש כאילו היה מיני סקריפט שלכם.
כשתסיימו תוכלו לשגר אותו ל-prompt שלכם עם שמירה ויציאה כמו שאתם מכירים.
נדרש רק להוסיף את שתי השורות האלו לקובץ
ניתן להשתמש בפונקציונליות דומה אין צורך להגדיר שום דבר, קיצור המקשים הוא
בשני המקרים העורך שיפתח הוא העורך שמוגדר למשתנה הסביבה
רמת קושי: #advanced
משתמשי Zsh
אם אתם על הטרמינל כותבים פקודה כלשהי, מעבר לשימוש ב-vi mode של zsh כדי לערוך אותה,
לחיצה על ctrl + e (או מקש אחר לבחירתכם) תביא אתכם ל- vim על מלא בו תוכלו לערוך את הקוד ממש כאילו היה מיני סקריפט שלכם.
כשתסיימו תוכלו לשגר אותו ל-prompt שלכם עם שמירה ויציאה כמו שאתם מכירים.
נדרש רק להוסיף את שתי השורות האלו לקובץ
.zshrc
שלכם:autoload edit-command-line; zle -N edit-command-line
bindkey '^e' edit-command-line
משתמשי Bashניתן להשתמש בפונקציונליות דומה אין צורך להגדיר שום דבר, קיצור המקשים הוא
Ctrl + X
Ctrl + E
בשני המקרים העורך שיפתח הוא העורך שמוגדר למשתנה הסביבה
$EDITOR
#editor
@bash_tips👍1
חיפוש
לבצע חיפוש על טקסט ללא רגישות ל case sensitive
ניתן לחפש ביטוי על מספר רב של קבצים, גם כאלו במבנה היררכי
כל שורה תכיל את הנתיב לקובץ שהכיל את ההתאמה ואת ההתאמה
grep
רמת קושי: #advanced
פקודת grep מלאה בפיצ'רים, בכל אופן אני מוצא את עצמי משתמש בכמה עיקריים בתדירות יחסית גבוהה, בדרך כלל כמה מהם ביחדלבצע חיפוש על טקסט ללא רגישות ל case sensitive
$ grep -i "name" file
name: test
Last Name
שימוש בדגלי A / B / C יאפשר לנו להגדיר שלא רק השורה שתואמת את הביטוי תוצג, אלא גם אלו שסביבה, A יחזיר את השורות הבאות לאחר השורה שנמצאה בה התאמה לביטוי, B יחזיר את השורות שקדמו לשורה התואמת לביטוי, C יציג בשווה שורות לפני ואחרי $ grep -A2 "three" /tmp/test
three
four
five
$ grep -B2 "three" /tmp/test
One
two
three
$ grep -C2 "three" /tmp/test
One
two
three
four
five
הוספת מספרי שורות לתוצאות בהם נמצאה ההתאמה$ grep -n "three" /tmp/test
3:three
היפוך תוצאות החיפוש, להחזיר רק את מה שאינו תואם לביטוי$ grep -v "three" /tmp/test
One
two
four
five
בכדי לקבל פונקציולניות מתקדמת ל regex כמו lookbehind, ניתן להשתמש במנוע הregex שתואם את perl, מוכר גם בשם PCRE$ grep -P
ברירת מחדל grep יחזיר את כל השורה בה נמצא מילה התואמת לביטוי, בכדי לשלוף רק את הרצף שתואם לביטוי ניתן להשתמש בדגל -o
$ grep name Chart.yaml
name: Test
grep -o name Chart.yaml
name
ניתן לחפש ביטוי על מספר רב של קבצים, גם כאלו במבנה היררכי
כל שורה תכיל את הנתיב לקובץ שהכיל את ההתאמה ואת ההתאמה
$ grep -r "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml: type: NodePort
test_env/k8s/backend-service.yml: type: NodePort
בכדי לקבל רק את הנתיב לקובץ שתואם לביטוי, ניתן להשתמש בנוסף בדגל -l
$ grep -rl "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml
test_env/k8s/backend-service.yml
וכמובן שאפשר לקבל רק את הקבצים שאינם מכילים את הביטוי על ידי דגל -L
$ grep -rL "NodePort" sonarqube
וכן אתם לא טועים אפשר לממש את אותו הרעיון עם דגל v$ grep -rlv "NodePort" sonarqube
#grep
@bash_tipsלהעביר מידע רגיש
בכדי להימנע מהמצב דומה ניתן להשתמש בדגל
[המערכת שומרת כל קלט שנכנס עד שהוא יאושר עם אנטר]
read
רמת קושי: #beginners
לא מעט פעמים אנו רוצים לכתוב סקריפט שמתחבר לשירות כזה אחר, לשם כך אנו צריכים להכניס סיסמה וכאן מתחילה הבעיה,ברגע שמכניסים סיסמה היא תהיה כתובה על המסך זמינה לכולם.בכדי להימנע מהמצב דומה ניתן להשתמש בדגל
-s
לפקודת read
, האופציה הזאת מאפשרת לקבל מידע לתוך משתנה מבלי להציג אותו למשתמש.$ read -s PASS
[המערכת שומרת כל קלט שנכנס עד שהוא יאושר עם אנטר]
$ echo $PASS
123123123
#read
@bash_tipsForwarded from V0id
להציג את הקבצים בתקייה הנוכחית עם נתיב אבסולוטי
find "$PWD" -maxdepth 1
כדי להפוך את זה לפשוט יצרתי 'אליאס' בbashrc
function lspwd() {
find "$PWD" -maxdepth 1 -exec ls --color -d {} \;
}
Forwarded from לומדים לינוקס
לינוקס וקבצים
פקודת lsof היא בעצם פקודה שבודקת קבצים, אבל במונח הרחב יותר היא בעצם מספקת כלי בדיקה להרבה חלקים מהמערכת (הכל קבצים זוכרים), רוצים לבדוק לאיזה מקום תהליך מסויים רושם את הלוגים שלו? או לחילופין איזה תהליך מאזין לאיזה פורט? הפקודה מציגה את כל אלו ומאפשרת לשלב בין היכולות השונות כדי לפלטר את המידע
לדוגמה אנו רוצים לקבל מידע על כל תהליך שרץ במערכת
עמודת FD מציגה תיאור על הקובץ המדובר (קיצור של File Descriptor)
תהליך
שימוש בדגל
שימוש בדגל
שימוש בדגל
פקודת
כל התהליכים שמשתמשים בפרוטוקול מסויים ועוברים דרך פורט 80
דרך טווח של פורטים (300-1000)
דומיין מסויים (@whatsapp.com)
וכמובן ניתן ליצור קומבינציות משולבות של פילטרים
כל המשתמשים האחרים חוץ ממשתמש מסויים (^)
אלו קבצים בתיקייה הנוכחית פתוחים על ידי איזה תהליך (+D)
כדאי לעבור על הman שלו ולראות עוד אלו הפתעות יש לו בשרוול
@learnlinuxnote
lsof
אנו מכירים את הכלל בלינוקס לפיו כל אובייקט הוא קובץ, לכן כלי שעוקב אחרי קבצים במערכת הוא כלי נורא חשוב, נעים להכיר פקודת lsofפקודת lsof היא בעצם פקודה שבודקת קבצים, אבל במונח הרחב יותר היא בעצם מספקת כלי בדיקה להרבה חלקים מהמערכת (הכל קבצים זוכרים), רוצים לבדוק לאיזה מקום תהליך מסויים רושם את הלוגים שלו? או לחילופין איזה תהליך מאזין לאיזה פורט? הפקודה מציגה את כל אלו ומאפשרת לשלב בין היכולות השונות כדי לפלטר את המידע
לדוגמה אנו רוצים לקבל מידע על כל תהליך שרץ במערכת
$ lsof...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1698400 1842178 /usr/lib/
...
הרבה מהמידע שמוצג נראה ג'בריש ולא ברור להלן הסבר קצר על שתי עמודות חשובות שישפוך קצת אור על הנושאעמודת FD מציגה תיאור על הקובץ המדובר (קיצור של File Descriptor)
cwd: current working directoryלעמודה הזאת יש עוד סוג של מידע שנראה ממש מוזר
err: FD information error
ltx: shared library text (code and data)
Mxx: hex memory-mapped type number xx.
m86: DOS Merge mapped file
mem: memory-mapped file
mmap: memory-mapped device
pd: parent directory
rtd: root directory
txt: program text (code and data)
v86: VP/ix mapped file
99rובעצם בא לספר לנו באלו הרשאות נפתח אותו הקובץ על ידי התהליך
104w
113u
r: readעמודת TYPE מציגה את סוג הקובץ עליו אנו מסתכלים, הסוגים הנפוצים
w: write
u: read & write
DIR = תיקייה
REG = קובץ רגיל
CHR = קובץ בעל תווים מיוחדים
FIFO = קובץ pipe
אז מה בעצם אפשר לעשות עם פקודת lsof
?תהליך
שימוש בדגל
p
יאפשר לחקור לאלו קבצים תהליך מסוים ניגש ועם אלו הרשאות$ lsof -p 1
OMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dumb-init 1 root cwd DIR 0,54 4096 9964742 /
dumb-init 1 root rtd DIR 0,54 4096 9964742 /
dumb-init 1 root txt REG 0,54 54744 9
309915 /u...
dumb-init 1 root mem REG 8,1 9309915 /usr/bin/...
...
פקודהשימוש בדגל
c
יאפשר לקבל רק מידע שקשור לפקודה לסויימת$ lsof -c firefoxתקשורת
שימוש בדגל
i
יאפשר לראות קבצים ותהליכים פונים לרשת$ lsof -iפילטר
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kdeconnec 2292 user 11u IPv6 49368 0t0 UDP *:1716
kdeconnec 2292 user 12u IPv6 49369 0t0 TCP *:1716 (LISTEN)
פקודת
lsof
מאפשרת ליצור מגוון פילטרים על המידע אותו אנו מבקשים, להלן כמה שימושיים במיוחדכל התהליכים שמשתמשים בפרוטוקול מסויים ועוברים דרך פורט 80
דרך טווח של פורטים (300-1000)
דומיין מסויים (@whatsapp.com)
וכמובן ניתן ליצור קומבינציות משולבות של פילטרים
$ lsof -i TCP:80תאחזר את כל הקבצים אליהם ניגש משתמש מסויים (-u)
$ lsof -i UDP:3000-10000
$ lsof -i @whatsapp.com
כל המשתמשים האחרים חוץ ממשתמש מסויים (^)
אלו קבצים בתיקייה הנוכחית פתוחים על ידי איזה תהליך (+D)
$ lsof -u userלסיכום זאת רק טעימה, יש עוד הרבה אפשרויות שהכלי מספק
$ lsof -u ^root
$ lsof +D Project/test/
כדאי לעבור על הman שלו ולראות עוד אלו הפתעות יש לו בשרוול
@learnlinuxnote
אתר אנטרקטיבי חביב ללימוד באש.
האתר תומך במגוון שפות בניהם גם עברית
רמת קושי: #beginners
Learn the ways of Linux-fu
https://linuxjourney.com/
#tools
@bash_tips
האתר תומך במגוון שפות בניהם גם עברית
רמת קושי: #beginners
Learn the ways of Linux-fu
https://linuxjourney.com/
#tools
@bash_tips