Bash Tips
997 subscribers
14 photos
4 files
45 links
רוצים להשתמש בלינוקס אבל לא ממש מכירים את הכלים שהיא מספקת לעבודה?

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
לטעון עם source
רמת קושי: #beginners

פקודה שנתקלים בה לא מעט בלינוקס היא source, בדרך כלל כשעורכים את קובץ .bashrc, מהי הפקודה הזאת ולמה היא חשובה לנו

אנו פותחים טרמינל ויוצרים משתנה חביב

$ my_var=123

כעת אם נקרא למשתנה הזה נקבל את הערך שלו

$ echo $my_var
123

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

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

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

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

$ nano ~/.bashrc && source ~/.bashrc

#source
#bashrc

@bash_tips
להכיר נקודה
רמת קושי: #beginners

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

קיצור דרך נחמד שבאש מאפשרת לנו הוא הרצה של source על ידי נקודה, רווח ושם הקובץ.

$ . myenv


#source

@bash_tips
לטעון סביבה
רמת קושי: #advanced

קובץ שמוכר בעולם ה ops הוא .env מדובר על קובץ שבגדול מכיל רשימה של משתני סביבה בהם הסביבה מאותחלת, מספר כלים כדוגמת docker-compose מכירים בקובץ ויודעים לטעון אותו לבד, מה קורה כשאנו רוצים לטעון קובץ .env ישירות לטרמינל?

דוגמה לקובץ .env

$ cat .env
APP_NAME=mytest
DEPLOYMENT_MODE=true
BUNDLE=test
...

מחשבה ראשונה זה לעשות source לקובץ ולטעון אותו, העניין הוא שהכרזת משתנים בלי הפקודה export תטען את המשתנים לסשן של הטרמינל, כל סקריפט שנריץ מאותו הסשן לא יקבל את המשתנים שבקובץ כי הוא רץ בסשן משל עצמו (דברנו על זה מעט בעבר).

נוכל לראות זאת בדוגמה שלהלן

$ source .env

$ cat test.sh
#!/bin/bash
declare -p APP_NAME DEPLOYMENT_MODE BUNDLE

$ bash test.sh
test.sh: line 2: declare: APP_NAME: not found
test.sh: line 2: declare: DEPLOYMENT_MODE: not found
test.sh: line 2: declare: BUNDLE: not found


להלן 2 דרכים מעניינות לפתרון
פתרון אפשרי, export

export $(grep -v '^#' .env)

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


פתרון אפשרי נוסף allexport

set -a
source .env
set +a


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

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


#env
#export
#source
#variable
#env_variable
#session

@bash_tips