Új sorok nyomtatása a parancssori kimenetben

Meglepő, hogy a számítógépek elérése az emberek számára olvasható kimenetet nem könnyű. A szabványos adatfolyamok és kifejezetten a standard kimenet bevezetésével a programok módot nyertek egymással való beszélgetésre egyszerű szöveges adatfolyamok segítségével. De a stdout humanizálása és megjelenítése más kérdés. A technológia a számítástechnika korában megpróbálta megoldani ezt a problémát, az ASCII karakterek használatától a videokomputerek kijelzőin át a modern shell parancsokig, mint a echoés printf.

Ezek az előrelépések nem voltak zökkenőmentesek. A kimenet terminálra történő kinyomtatása rengeteg furcsaságot jelent a programozók számára a navigáláshoz, ezt példázza az a megtévesztően nem triviális feladat, hogy kibővítsék a menekülési szekvenciát új sorok nyomtatására. A helyőrző bővítése \nsokféle módon valósítható meg, mindegyiknek megvan a maga egyedi története és szövődményei.

Használata echo

A Multics-ban való megjelenésétől kezdve a mai Unix-szerű rendszer mindenütt jelenlétéig echotovábbra is ismerős eszköz a terminál „Hello világ!” Mondására. Sajnos az operációs rendszerek közötti következetlen megvalósítás miatt a használata bonyolult. Ahol echoegyes rendszereken automatikusan kibővülnek a menekülési szekvenciák, másoknak -elehetőségre van szükségük ugyanahhoz:

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

A megvalósításban tapasztalható ezen következetlenségek miatt echonem hordozhatónak tekinthető. Ezen túlmenően, a felhasználói bevitelekkel együtt történő használata viszonylag könnyen megsérülhet a shell behelyezéses támadással, parancsok helyettesítésével.

A modern rendszerekben csak azért tartják fenn, hogy kompatibilitást biztosítson a még mindig sok programmal. A POSIX specifikáció printfaz új programok használatát javasolja .

Használata printf

A Unix 4. kiadás óta a hordozható printfparancs lényegében az új és jobb echo. Ez lehetővé teszi, hogy formátum-specifikátorokat használjon a bemenet humanizálásához. A hátsó perjel menekülési szekvenciák értelmezéséhez használja a %b. A karaktersorozat \nbiztosítja, hogy a kimenet új sorral záruljon:

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

Bár printfvannak további lehetőségei, amelyek sokkal erőteljesebb cseréjévé teszik echo, ez a segédprogram nem bolondbiztos és kiszolgáltatott lehet egy ellenőrizetlen formátumú karakterlánc-támadásnak. A programozók számára fontos, hogy gondoskodjanak a felhasználói adatok gondos kezeléséről.

Új sorok felvétele a változókba

A fordítók közötti hordozhatóság javítása érdekében az ANSI C szabványt 1983-ban hozták létre. Az ANSI-C használatával a $'...'menekülési szekvenciákat a kimeneten a szabványnak megfelelően cserélik.

Ez lehetővé teszi számunkra, hogy új vonalakkal ellátott karakterláncokat tároljunk azokban a változókban, amelyeket az értelmezett új vonalakkal nyomtatunk. Ezt úgy teheti meg, hogy beállítja a változót, majd meghívja printfa következővel $:

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

A kibővített változó egyetlen idézőjelű, amelyet szó szerint továbbítunk neki printf. Mint mindig, fontos a bemenet megfelelő kezelése.

Bónusz kör: shell paraméterek bővítése

A Bash-t és a zárójeleket ismertető cikkemben a héjparaméterek kibővítésének varázslatát ismertettem. Egy kibővítést használhatunk ${[email protected]}a menekülési szekvenciák értelmezésére is. Az általunk használt printf„s %sspecifikátor nyomtatni, mint egy húr, és a Ekezelő megfelelően fogja bővíteni az escape szekvenciát a mi változó:

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

Az emberi beszélgetés folyamatos kihívása

A húrinterpoláció továbbra is rágós problémát jelent a programozók számára. Amellett, hogy a nyelvek és a kagylók megegyezzenek abban, mit jelentenek bizonyos helyőrzők, a megfelelő menekülési szekvenciák megfelelő használata szemrevételezést igényel.

A gyenge karakterlánc-interpoláció ostoba kinézetű kimenethez vezethet, valamint biztonsági réseket okozhat, például injekciós támadásokból. Amíg a terminál következő evolúciója során emoji-kban nem beszélünk, akkor a legjobban odafigyelünk, ha az emberek számára nyomtatunk kimenetet.