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 \n
sokfé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 echo
tová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 echo
egyes rendszereken automatikusan kibővülnek a menekülési szekvenciák, másoknak -e
lehető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 echo
nem 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ó printf
az új programok használatát javasolja .
Használata printf
A Unix 4. kiadás óta a hordozható printf
parancs 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 \n
biztosí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 printf
vannak 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 printf
a 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 %s
specifikátor nyomtatni, mint egy húr, és a E
kezelő 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.