כיצד להדפיס שורות חדשות בפלט שורת הפקודה

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

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

באמצעות echo

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

echo "the study of European nerves is \neurology" # the study of European nerves is \neurology echo -e "the study of European nerves is \neurology" # the study of European nerves is # eurology

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

במערכות מודרניות, הוא נשמר רק כדי לספק תאימות לתוכנות הרבות שעדיין משתמשות בו. מפרט POSIX ממליץ להשתמש printfבתוכניות חדשות.

באמצעות printf

מאז יוניקס המהדורה הרביעית, printfהפקודה הניידת למעשה הייתה החדשה והטובה יותר echo. זה מאפשר לך להשתמש במפרטי פורמט כדי להזין קלט. כדי לפרש רצפי בריחה מפסיקה, השתמש %b. רצף התווים \nמבטיח שהפלט מסתיים בשורה חדשה:

printf "%b\n" "Many females in Oble are \noblewomen" # Many females in Oble are # oblewomen

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

הצבת שורות חדשות במשתנים

במטרה לשפר את הניידות בקרב המהדרים, תקן ANSI C הוקם בשנת 1983. כאשר ANSI-C מצטט באמצעות $'...', רצפי בריחה מוחלפים בפלט על פי התקן.

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

puns=$'\number\narrow\nether\nice' printf "%b\n" "These words started with n but don't make $puns" # These words started with n but don't make # umber # arrow # ether # ice

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

סבב בונוס: הרחבת פרמטר מעטפת

במאמר שלי המסביר את Bash and braces, כיסיתי את הקסם של הרחבת פרמטר מעטפת. אנו יכולים להשתמש בהרחבה אחת ${[email protected]}, כדי לפרש גם רצפי בריחה. אנו משתמשים printfים" %sמציין להדפיס כמחרוזת, ואת Eהמפעיל יהיה כמו שצריך להרחיב את רצפי בריחה במשתנה שלנו:

printf "%s\n" ${[email protected]} # umber # arrow # ether # ice

האתגר המתמשך בשיחה אנושית

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

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