הקדמה להפניה של קלט/פלט בלינוקס

הקדמה

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

דרישות קדם

כדי להמשיך עם מדריך זה, יש לך צורך בגישה לשרת Linux. אם אתה זקוק למידע על התחברות לשרת שלך לראשונה, תוכל לעקוב אחרי מדריך שלנו להתחברות לשרת Linux באמצעות SSH.

זרמים

הקלט והפלט בסביבת ה-Linux מתפזרים על שלושה זרמים. הזרמים אלו הם:

  • קלט סטנדרטי (stdin)

  • פלט סטנדרטי (stdout)

  • שגיאה סטנדרטית (stderr)

הפלטים מסופרים גם:

  • stdin (0)

  • stdout (1)

  • stderr (2)

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

קלט סטנדרטי

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

פלט סטנדרטי

הפלט הסטנדרטי הוא הפלט שנוצר על ידי תוכנית. כאשר זרם הפלט הסטנדרטי לא מופנה, הוא יפליא טקסט ישירות לטרמינל. נסו להוציא טקסט שרירותי, באמצעות echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

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

הריצו echo בלי ארגומנטים:

  1. echo

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

שגיאת סטנדרט

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

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

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

  1. ls %

מאחר ש-% אינו תיקייה קיימת, זה ישלח את הטקסט הבא לשגיאת סטנדרט:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

הפניה של הזרמה

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

פקודות עם סוגריים יחידים מחליפות את התוכן הקיים ביעד.

החלפת תוכן

  • > – פלט תקני

  • < – קלט תקני

  • 2> – שגיאת תקני

פקודות עם סוגריים כפולים אינן מחליפות את התוכן הקיים ביעד.

הוספת תוכן

  • >> – פלט תקני

  • << – קלט תקני

  • 2>> – שגיאת תקני

צינורות

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

הצינור ב-Linux מיוצג על ידי קו אנכי: |

הנה דוגמה לפקודה המשתמשת בצינור:

  1. ls | less

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

ls בדרך כלל מציגה את תוכן הספרייה בשורות מרובות. כאשר אתה מפעיל אותה דרך less, כל ערך מונח על שורה חדשה.

אף על פי שהפונקציונליות של הצינור עשויה להיראות דומה לזו של > ו־>>, ההבחנה היא כי הצינור מפנה נתונים מפקודה אחת אל פקודה אחרת, בעוד ש־> ו־>> משמשים להפניה באופן בלעדי אל קבצים.

מסננים

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

  • find – מחזיר קבצים עם שמות קבצים שתואמים את הארגומנט שעבר ל-find.

  • grep – מחזיר טקסט שתואם את תבנית המחרוזת שעברה ל-grep.

  • tee – מפנה קלט סטנדרטי לפלט סטנדרטי ולפחות קובץ אחד או יותר.

  • tr – מוצא ומחליף מחרוזת אחת במחרוזת אחרת.

  • wc – מספור תווים, שורות ומילים.

דוגמאות

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

התבנית command > file מפנה את הפלט התקני של פקודה לקובץ.

  1. ls ~ > root_dir_contents.txt

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

התבנית command > /dev/null מפנה את הפלט התקני לשום מקום. /dev/null הוא קובץ מיוחד שמשמש להשלכת כל נתונים שמופנים אליו. הוא משמש לזריקת פלט תקני שאינו נדרש, ושייתכן ויפריע בתפקוד של פקודה או סקריפט. כל פלט שנשלח אל /dev/null נזרק.

  1. ls > /dev/null

פקודה זו משליכה את פלט השגיאה התקני שנמסר מהפקודה ls ל- /dev/null.

התבנית command 2> file מפנה את פלט השגיאה התקני של פקודה לקובץ, ומחליף תוכן קיים.

  1. mkdir '' 2> mkdir_log.txt

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

התבנית command >> file מפנה את הפלט התקני של פקודה לקובץ מבלי למחוק את תוכן הקובץ הקיים.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

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

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

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

הפקודה לעיל מפנה את הודעת השגיאה שנגרמה על ידי ארגומנט לא תקין של find לקובץ בשם stderr_log.txt. לאחר מכן, היא מוסיפה את הודעת השגיאה שנגרמה על ידי ארגומנט לא תקין של wc לאותו קובץ.

התבנית command | command מפנה את פלט הפקודה הראשונה לפקודה השנייה בתור קלט סטנדרטי.

  1. find /var lib | grep deb

הפקודה הזו מחפשת בתיקיית /var ובתתי-תיקיותיה שמות קבצים וסיומות התואמים את מחרוזת ה-deb, ומחזירה את נתיבי הקבצים, עם החלק התואם בכל נתיב מודגש בצבע אדום.

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

בהקשר של תבנית זו, tee נהוג לשימוש כדי לצפות בפלט של תוכנית ובו זמנית לשמור אותו לקובץ.

  1. wc /etc/magic | tee magic_count.txt

זה מופנה את הספירות עבור תווים, שורות ומילים בקובץ /etc/magic (המשמש על ידי המסוף הלינוקסי לקביעת סוגי קבצים) אל פקודת ה־tee, שאז מפצלת את הפלט של wc לשני כיוונים, ושולחת אותו לתצוגה במסך ולקובץ magic_count.txt. לפקודת tee, דמיינו את האות T. החלק התחתון של האות הוא הנתונים המקוריים, והחלק העליון הוא הנתונים שמתפצלים לשני כיוונים שונים (פלט סטנדרטי ולמסך).

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

מסקנה

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

חיפוש אחר פקודות ספציפיות, או למשהו שתרצה לעשות בשורת הפקודה (לדוג' "מחק את כל הקבצים בתיקייה שמתחילים באות גדולה") יכול גם להיות מועיל כאשר תצטרך לבצע משימה ספציפית באמצעות שורת הפקודה.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection