לדלג לתוכן

redirect וpipes בלינוקס מוסבר

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

שלושה ערוצים שכל תהליך מכיר

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

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

ההפרדה בין stdout ל-stderr היא חשובה - היא מאפשרת להפנות פלט תקין למקום אחד, ושגיאות למקום אחר לגמרי, גם אם שניהם נראים באותו מסך.

redirect - מפנים פלט למקום אחר

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

  • > - מפנה את stdout לקובץ, ודורס את התוכן הקיים אם הקובץ כבר קיים. ls > files.txt ישמור את רשימת הקבצים בקובץ.
  • >> - כמו >, אבל מוסיף לסוף הקובץ במקום לדרוס אותו. שימושי מאוד לקבצי log שרוצים לצבור לאורך זמן.
  • < - מפנה קובץ להיות ה-stdin של פקודה, במקום קלט מהמקלדת.
  • 2> - מפנה ספציפית את ערוץ השגיאות, stderr, לקובץ נפרד. command 2> errors.log ישמור רק את השגיאות בקובץ.

אפשר גם לשלב - command > output.log 2>&1 ישלח גם את הפלט הרגיל וגם את השגיאות לאותו קובץ בדיוק.

pipes - מחברים פקודות אחת לשנייה

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

ps aux | grep firefox

הפקודה הזו מריצה ps aux שמציגה את כל התהליכים, ומעבירה את הפלט ישירות ל-grep firefox, שמסנן ומשאיר רק שורות שמכילות את המילה firefox. שתי פקודות פשוטות, שביחד עונות על שאלה ספציפית - "האם firefox רץ, ואם כן, עם איזה PID".

שרשור ארוך יותר

אפשר לחבר יותר משתי פקודות ברצף אחד, וכל אחת מעבדת את הפלט של הקודמת לה:

cat access.log | grep "ERROR" | sort | uniq -c | sort -nr

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

tee - גם קובץ וגם המסך

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

ls -la | tee output.txt

למה זה שווה ללמוד לעומק

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

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

יש לכם שרשור פקודות שהצליח לכם לפתור בעיה מעניינת? שתפו אותנו בקהילה.

הצטרפו לקהילה בדיסקורד