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, שמסנן ומשאיר רק שורות שמכילות את המילה firefox. שתי פקודות פשוטות, שביחד עונות על שאלה ספציפית - "האם firefox רץ, ואם כן, עם איזה PID".
שרשור ארוך יותר¶
אפשר לחבר יותר משתי פקודות ברצף אחד, וכל אחת מעבדת את הפלט של הקודמת לה:
השרשור הזה קורא קובץ log, מסנן רק שורות שגיאה, ממיין אותן, סופר כמה פעם כל שורה ייחודית מופיעה, וממיין לפי התדירות מהגבוהה לנמוכה. זה בעצם דוח שלם שנבנה מכמה כלים פשוטים מאוד, בלי לכתוב שום קוד ייעודי.
tee - גם קובץ וגם המסך¶
לפעמים רוצים גם לראות את הפלט על המסך וגם לשמור אותו לקובץ, במקום לבחור אחד מהשניים. הפקודה tee עושה בדיוק את זה:
למה זה שווה ללמוד לעומק¶
ברגע שמבינים redirect ו-pipes, הטרמינל מפסיק להיות מקום שבו מריצים פקודה אחת בכל פעם, והופך לסביבת עבודה שבה מרכיבים כלים קטנים לפתרונות מותאמים אישית, בלי לכתוב סקריפט שלם. זו בדיוק הפילוסופיה שמאחורי לינוקס - כלים קטנים שעושים דבר אחד טוב, ומתחברים אחד לשני.
רוצים ללמוד את כל היסודות של לינוקס, כולל עבודה מעשית בטרמינל? יש לנו קורס שלם וחינמי: קורס לינוקס בסיסי.
יש לכם שרשור פקודות שהצליח לכם לפתור בעיה מעניינת? שתפו אותנו בקהילה.