לטעון עם
רמת קושי: #beginners
פקודה שנתקלים בה לא מעט בלינוקס היא
אנו פותחים טרמינל ויוצרים משתנה חביב
הדבר הזה נכון הן למשתנים והן לפונקציות.
אז אנו רוצים לעבוד על הטרמינל וליצור סביבה עם משתנים פונקציות וכל דבר אחר, מה כל פעם נצטרך להקליד או להעתיק ולהדביק את תוכן הפונקציות לטרמינל?
זהו בעצם השלב בו נכנסת פקודת
אז מה בעצם קורה עם קובץ bashrc?
קובץ bashrc נטען בעת יצירת הסשן, ברגע שאנו עושים בו שינויים תוך כדי הסשן bash לא מתחשב בשינויים הללו עד שנכריח את bash לטעון את הקובץ שוב.
#bashrc
@bash_tips
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
דברנו בעבר על כך שפקודת
קיצור דרך נחמד שבאש מאפשרת לנו הוא הרצה של
@bash_tips
רמת קושי: #beginners
דברנו בעבר על כך שפקודת
source
מאפשרת לטעון מידע שנמצא בקובץ כגון משתני סביבה, משתנים, ופונקציות לסביבת העבודה שלנו.קיצור דרך נחמד שבאש מאפשרת לנו הוא הרצה של
source
על ידי נקודה, רווח ושם הקובץ.$ . myenv
#source@bash_tips
לטעון סביבה
רמת קושי: #advanced
קובץ שמוכר בעולם ה ops הוא .env מדובר על קובץ שבגדול מכיל רשימה של משתני סביבה בהם הסביבה מאותחלת, מספר כלים כדוגמת docker-compose מכירים בקובץ ויודעים לטעון אותו לבד, מה קורה כשאנו רוצים לטעון קובץ .env ישירות לטרמינל?
דוגמה לקובץ .env
מחשבה ראשונה זה לעשות
נוכל לראות זאת בדוגמה שלהלן
להלן 2 דרכים מעניינות לפתרון
פתרון אפשרי, export
מה שקורה כאן הוא שפקודת
פתרון אפשרי נוסף allexport
בגדול מדובר על הפעלה של flag allexport, האופציה הזאת מעבירה לexport את רצף המשתנים ובעצם מאפשרת לפקודת
בכדי לראות שהמשתנים שלנו אכן נטענו לסביבה ניתן לבדוק זאת על ידי פקודת
#env
#export
#source
#variable
#env_variable
#session
@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