Uute ridade printimine käsurea väljundis

Üllatav on see, et arvutite hankimine inimestele loetava väljundi saamiseks pole lihtne saavutus. Standardvoogude ja spetsiaalselt standardväljundi kasutuselevõtuga said programmid viisi, kuidas tavalise tekstivoogude abil omavahel rääkida. Kuid stdouti inimlikustamine ja kuvamine on teine ​​asi. Kogu arvutiajastu tehnoloogia on seda probleemi proovinud lahendada, alates ASCII tähemärkide kasutamisest videoarvutite ekraanides kuni moodsate shellikäsklusteni nagu echoja printf.

Need edusammud pole olnud sujuvad. Terminali väljundi printimise töö on täis programmeerijate navigeerimisvajadusi, mida illustreerib petlikult mittetriviaalne ülesanne laiendada põgenemisjärjestust uute ridade printimiseks. Kohahoidja laiendamine on \nvõimalik mitmel viisil, millel on oma ainulaadne ajalugu ja tüsistused.

Kasutamine echo

Alates selle ilmumisest Multicsis kuni tänapäevase Unixi-laadse süsteemi üldlevimuseni on see echoendiselt tuttav tööriist , mille abil saate oma terminali öelda „Tere maailm!” Kahjuks muudavad opsüsteemide ebaühtlased rakendused selle kasutamise keerukaks. Kui echomõnes süsteemis laienevad põgenemisjärjestused automaatselt, nõuavad teised -esama võimalust:

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

Nende rakenduste vastuolude tõttu echopeetakse seda kaasaskantavaks. Lisaks on selle kasutamist koos kasutaja sisendiga suhteliselt lihtne korrumpeerida kestasüstimisrünnaku abil, kasutades käskude asendusi.

Kaasaegsetes süsteemides säilitatakse see ainult ühilduvuse tagamiseks paljude seda veel kasutavate programmidega. POSIX spetsifikatsioon soovitab kasutada printfuutes programmides.

Kasutamine printf

Alates 4. väljaande Unixist on kaasaskantav printfkäsk olnud sisuliselt uus ja parem echo. See võimaldab teil sisendi humaniseerimiseks kasutada vorminguspetsifikaate. Tagasi kaldkriipsuga põgenemisjärjestuste tõlgendamiseks kasutage %b. Tähemärkide järjestus \ntagab, et väljund lõpeb uue reaga:

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

Kuigi printfsellel on veel võimalusi, mis muudavad selle palju võimsamaks asendamiseks echo, ei ole see utiliit lollikindel ja võib olla kontrollimatu vormingus stringi rünnaku suhtes haavatav. Programmeerijatel on oluline tagada kasutaja sisendi hoolikas käitlemine.

Uute ridade panemine muutujatesse

Kompilaatorite kaasaskantavuse parandamiseks loodi ANSI C standard 1983. aastal. Kui ANSI-C tsiteeritakse $'...', asendatakse väljundis põgenemisjärjestused vastavalt standardile.

See võimaldab meil salvestada uutes ridades olevad stringid muutujatesse, mis on trükitud tõlgendatud uutes ridades. Seda saate teha, määrates muutuja ja kutsudes seda printfkasutades $:

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

Laiendatud muutuja on ühe jutumärgiga, millele edastatakse sõna otseses mõttes printf. Nagu alati, on oluline sisendit korralikult käsitseda.

Boonusvoor: kestaparameetri laiendamine

Oma Bashi ja traksidega selgitavas artiklis käsitlesin ma parameetrite laiendamise võlu. Ühtegi laiendust saame kasutada ${[email protected]}ka põgenemisjärjestuste tõlgendamiseks. Me kasutame printf's %sspecifier printida string ja Eoperaator korralikult laiendada põgeneda järjestused meie muutuja:

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

Jätkuv väljakutse rääkida inimeses

Stringi interpoleerimine on programmeerijate jaoks jätkuvalt nätske probleem. Lisaks sellele, et keeled ja kestad lepiksid kokku, mida teatud kohahoidjad tähendavad, nõuab õigete põgenemisjärjestuste nõuetekohane kasutamine detailide pilku.

Halb stringide interpoleerimine võib viia rumala väljanägemisega ning tuua kaasa turvanõrkusi, näiteks süstimisrünnakud. Kuni terminali järgmine areng on meil emotikonides rääkinud, pööraksime kõige paremini tähelepanu inimestele mõeldud väljundite printimisel.