מדריך: שורת הפקודה - תגובות
-
@yossiz תמשיך מחכים לזה בכיליון עינים
-
@כוספים-למשיח ביקשת - קיבלת
(עכשיו תבקש שהמשיח יבוא במהרה...)
חבר'ה!!! אם משהו לא ברור או אם רוצים הרחבה בפרט מסויים, תשאלו!, (יותר משהעגל וכו'...).
-
-
@dovid לא הייתי מספיק ברור.
לא התכוונתי להתנהגות ה-short circuiting אלא לזה שהתוצאה של ביטוי לוגי הוא לא ערך בוליאני אלא הערך של הביטוי האחרון שהורץ.(בטבלה הזאת בוויקיפידיה אפשר לראות ש-JS ו-shell הם השפות הכי נפוצות שמתנהגים כך [יש גם את perl lua python ו-ruby. זה ברור לי ש-perl הושפע רבות מתחביר shell] )
ערכתי בפנים
-
@yossiz מיוחד מאד המדריך של הפייפס, אני זוכר שפעם הסתבכתי מאד עם הקטע של הפלט השונה של השגיאות, אני מקווה שאתה הולך להרחיב על זה עוד (על הקטע של > שזה הזרם הרגיל, ו >> שזה הזרם של השגיאות, נראה לי).
בכל מקרה תודה רבה על המדריך המושקע הזה, זה באמת מאד חשוב ולא כ"כ ידוע.
-
@nigun אמר במדריך: שורת הפקודה - תגובות:
מה קורה בתוכנות עם ממשק גרפי?
אני מניח שאתה מדבר על לינוקס.
(בווינדוס המושג הזה של stdout ו-stderr לא קיים בצורה מובנית. בשפת C, C++ שהמושג קיים הם עושים שכבת תאימות - ב-CRT - ש(בין השאר) מספק את הזרמים האלו לתוכנה, אגב זה קיים בהרבה דברים שהמושגים של unix ושפת C מאוד תואמים אחד את השני, כי אלה שהמציאו את מערכת יוניקס הם אותם שהמציאו את שפת C).
בלינוקס לכל תוכנה (כולל תוכנות גרפיות) קיימים שלוש file handles שפתוחים מיד בעת הרצת התוכנה.
אם תהליך האבא לא מגדיר את הקבצים האלו אז הבן יורש את אותם handle-ים של האבא.בד"כ תוכנת הטרמינל מריץ את ה-shell כאשר ה-handles פונים לקובץ PTY שמקביל לקלט ופלט של הטרמינל. ואז רואים את ה-prompt של הטרמינל בחלון הטרמינל. אם תריץ תוכנה מתוך shell שרץ בטרמינל תראה את הפלט שלו בטרמינל (אם הוא לא עושה fork כדי להתנתק מהטרמינל)
אם אתה מריץ תוכנה מתוך תפריט התחלה גרפית בלינוקס, אז הוא יירש את ה-stdout מהאבא, פעם (כאשר הייתי משתמש בלינוקס...) היה קובץ שנקרא משהו כמו xsession_errors (אני לא זוכר בדיוק את השם) שקיבל את ה-stderr של תוכנות שהורצו בתוך סביבה גרפית.
עריכה: הקובץ נקרא.xsession-errors
וה-stdout של ה-Xserver מחובר אליו, וממילא גם של כל הבנים והנכדים וכל המשפחה העניפה... עיין (https://stackoverflow.com/a/17019341) כהיום שעברו ל-wayland ייתכן שדברים השתנו.
לשירותים, (כמו של systemd) אפשר להגדיר בתצורת השירות לאן יפנה ה-stdout ו-stderr.
יש מושג של ניתוב הפלט ל-/dev/null
שזה חור שחור שמדמה קובץ.ובקיצור יש המון פרטים וקשה לכתוב את הכל על רגל אחת...
-
@nigun אם אתה באמת רוצה לדעת לאן מנותבים שלוש הזרמים הסטנדרטיים של תהליך בלינוקס, תוכל לבדוק ב-
lsof
או יותר קל ב-htop
(מקש L כאשר אתה עומד על תהליך) את הקבצים הפתוחים של התוכנה. המזהים של הזרמים הסטנדרטיים הם תמיד:שם מזהה stdin
0 stdout
1 stderr
2 -
הסברתי את זה, אבל כנראה לא מספיק ברור... (לוקח משאבים להסביר ברור...)
@yossiz אמר במדריך: שורת הפקודה - תגובות:
בד"כ תוכנת הטרמינל מריץ את ה-shell כאשר ה-handles פונים לקובץ PTY שמקביל לקלט ופלט של הטרמינל. ואז רואים את ה-prompt של הטרמינל בחלון הטרמינל. אם תריץ תוכנה מתוך shell שרץ בטרמינל תראה את הפלט שלו בטרמינל
כל טרמינל מייצר קובץ (וירטואלי, משהו שמדמה קובץ). ואז הוא מריץ את ה-shell כאשר הזרמים הסטנדרטיים שלו כולם מנותבים ל"קובץ" הזה. (בתמונה שהעליתי בפוסט הקודם שם הקובץ הוא
/dev/ttyS0
).
הטרמינל קורא מתוך הקובץ הזה את הפלט של תוכנות וכותב לתוכה את הקלט שמשתמש מזין לתוך חלון הטרמינל. (אני מפשט קצת, בפועל יש שני קבצים... עיין בכתבה בויקיפידיה או תגגל את הנושא של pty).
כאשר ה-shell מוליד תהליך בן, תהליך הבן יורש בברירת מחדל את ה-handle-ים לזרמים הסטנדרטיים מהאבא.
כאשר תוכנה כותב פלט הוא כותב ל-handle עם מזהה 1 או 2 (תלוי אם זה stderr או stdout) וזה מנותב לקובץ שה-handle הזה מייצג. שבברירת מחדל יהיה הקובץ שמננו הטרמינל קורא את הפלט של תוכנות.מובן, או שעדיין לא ברור?