Kaip spausdinti eilutes komandinės eilutės išvestyje

Keista, kad gauti kompiuterius, kad žmonės galėtų skaityti, nėra lengva. Įvedus standartinius srautus ir specialiai standartinę išvestį, programos įgijo būdą kalbėtis tarpusavyje naudojant paprasto teksto srautus. Tačiau žmogiškumas ir „stdout“ demonstravimas yra kitas dalykas. Technologijos per visą skaičiavimo amžių bandė išspręsti šią problemą, pradedant ASCII simbolių naudojimu vaizdo kompiuterių ekranuose ir baigiant šiuolaikinėmis apvalkalo komandomis, tokiomis kaip echoir printf.

Šie laimėjimai nebuvo sklandūs. Išvesties spausdinimo į terminalą darbas yra kupinas programuotojų naršymo ypatumų, kaip pavyzdį rodo apgaulingai netiesioginė užduotis išplėsti pabėgimo seką, kad būtų galima spausdinti naujas eilutes. Vietos rezervo ženklo išplėtimas \ngali būti atliekamas įvairiais būdais, kiekvienas turi savo unikalią istoriją ir komplikacijas.

Naudojant echo

Nuo pat pasirodymo „Multics“ iki šiuolaikinės į „Unix“ panašios sistemos visuotinumo echoišlieka įprastas įrankis, leidžiantis jūsų terminalui pasakyti „Sveikas pasaulis!“ Deja, dėl nenuoseklaus diegimo visose operacinėse sistemose jo naudojimas tampa sudėtingas. Kai echokuriose sistemose automatiškai išsiplės pabėgimo sekos, kitoms reikia -eparinkties tai padaryti:

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

Dėl šių neatitikimų diegiant echolaikoma nešiojamuoju. Be to, jo naudojimą kartu su vartotojo įvestimi yra gana lengva sugadinti naudojant apvalkalo injekcijos ataką naudojant komandų pakeitimus.

Šiuolaikinėse sistemose jis išlaikomas tik tam, kad būtų suderinamas su daugeliu jį vis dar naudojančių programų. POSIX specifikacijoje rekomenduojama naudoti printfnaujose programose.

Naudojant printf

Nuo 4-ojo leidimo „Unix“ nešiojama printfkomanda iš esmės buvo nauja ir geresnė echo. Tai leidžia naudoti formato specifikatorius, kad humanizuotumėte įvestį. Norėdami interpretuoti atbulinio brūkšnio pabėgimo sekas, naudokite %b. Simbolių seka \nužtikrina, kad išvestis baigsis nauja eilute:

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

Nors printfyra papildomų galimybių, leidžiančių jį pakeisti kur kas galingesniu echo, ši programa nėra atspari klaidoms ir gali būti pažeidžiama nekontroliuojamo formato eilutės išpuolio. Programuotojams svarbu užtikrinti, kad jie atidžiai tvarkytų vartotojo įvestį.

Naujų eilučių įtraukimas į kintamuosius

Siekiant pagerinti kompiliatorių perkeliamumą, 1983 m. Buvo nustatytas ANSI C standartas. Naudojant ANSI-C citatas $'...', pabėgimo sekos išvestyje pakeičiamos pagal standartą.

Tai leidžia mums saugoti eilutes su naujomis eilutėmis kintamuosiuose, kurie spausdinami interpretuojant naujas eilutes. Tai galite padaryti nustatydami kintamąjį ir paskambinę printfnaudodami $:

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

Išplėstas kintamasis yra vienkartinis, kuris perduodamas pažodžiui printf. Kaip visada, svarbu tinkamai tvarkyti įvestį.

Premijos turas: apvalkalo parametrų išplėtimas

Savo straipsnyje, paaiškinančiame „Bash“ ir „breketus“, aptariau apvalkalo parametrų išplėtimo magiją. Mes taip pat galime naudoti vieną išplėtimą ${[email protected]}, norėdami interpretuoti pabėgimo sekas. Mes naudojame printf'S %sspecifikatoriaus spausdinti kaip eilutę, ir Eoperatorius tinkamai išplėsti evakuacijos sekas mūsų kintamąjį:

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

Nuolatinis iššūkis kalbėti žmogumi

Styginių interpoliacija ir toliau yra kramtoma problema programuotojams. Norint, kad kalbos ir kriauklės susitartų, ką reiškia tam tikri vietos rezervavimo ženklai, norint tinkamai naudoti teisingas pabėgimo sekas reikia atkreipti dėmesį į detales.

Blogas eilučių interpoliavimas gali sukelti kvailai atrodantį išvestį, taip pat gali sukelti saugumo spragų, pavyzdžiui, dėl injekcijos atakų. Kol kita terminalo evoliucija neleis mums kalbėtis jaustukais, geriausia atkreipti dėmesį, kai spausdiname produkciją žmonėms.