Kako ispisati nove redove u izlazu naredbenog retka

Iznenađujuće je to što računala daju ljudima čitljiv izlaz nije lak podvig. Uvođenjem standardnih streamova i posebno standardnog izlaza, programi su stekli način međusobnog razgovora koristeći tokove običnog teksta. Ali humanizacija i prikazivanje stdout-a je druga stvar. Tehnologija tijekom čitavog doba računalstva pokušala je riješiti ovaj problem, od upotrebe ASCII znakova u zaslonima video računala do modernih naredbi ljuske poput echoi printf.

Ovi pomaci nisu jednolični. Posao ispisa izlaza na terminal ispunjen je neobičnostima za navigaciju programera, što je ilustrirano varljivim netrivijalnim zadatkom širenja izlazne sekvence za ispis novih redaka. Proširenje rezerviranog mjesta \nmože se postići na mnogo načina, svaki sa svojom jedinstvenom poviješću i komplikacijama.

Koristeći echo

Od pojave u Multics-u do moderne sveprisutnosti sustava nalik Unixu, i echodalje je poznat alat za nagovaranje vašeg terminala na "Hello world!" Nažalost, nedosljedne implementacije u operativnim sustavima čine njegovu upotrebu zapetljanom. Gdje će se echona nekim sustavima automatski proširiti izlazne sekvence, drugima je potrebna -eopcija da učine isto:

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

Zbog ovih nedosljednosti u implementacijama, echosmatra se prijenosnim. Uz to, njegovu upotrebu zajedno s korisničkim unosom relativno je lako oštetiti napadom ubrizgavanja ljuske pomoću zamjena naredbi.

U modernim sustavima zadržava se samo radi pružanja kompatibilnosti s mnogim programima koji ga još uvijek koriste. POSIX specifikacija preporučuje upotrebu printfu novim programima.

Koristeći printf

Od 4. izdanja Unixa, prijenosna printfnaredba u osnovi je nova i bolja echo. Omogućuje vam upotrebu specifikatora formata za humanizaciju unosa. Tumačiti kosa crta escape sekvence, koristiti %b. Slijed znakova \nosigurava da se izlaz završava s novom linijom:

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

Iako printfima dodatne mogućnosti koje ga čine daleko moćnijom zamjenom echo, ovaj uslužni program nije siguran i može biti ranjiv na nekontrolirani napad niza formata. Programerima je važno osigurati pažljivo rukovanje korisničkim unosom.

Stavljanje novih redaka u varijable

U nastojanju da se poboljša prenosivost među kompajlerima, ANSI C Standard uspostavljen je 1983. Uz korištenje ANSI-C citiranja $'...', izlazne se sekvence zamjenjuju u izlazu prema standardu.

To nam omogućuje pohranu nizova s ​​novim redovima u varijable koje se ispisuju s protumačenim novim redovima. To možete učiniti postavljanjem varijable, a zatim pozivanjem printfpomoću $:

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

Proširena je varijabla s jednim navodnikom, koja se doslovno prenosi na printf. Kao i uvijek, važno je pravilno rukovati unosom.

Bonus krug: proširenje parametra ljuske

U svom članku koji objašnjava Bash i zagrade opisao sam magiju proširenja parametara ljuske. Možemo upotrijebiti jedno proširenje ${[email protected]}, kako bismo interpretirali i sekvence bijega. Koristimo printf„s %sSpecifier ispisati kao string, i Eoperater će ispravno proširiti escape sekvence u našoj varijable:

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

Stalni izazov razgovora u ljudima

Interpolacija nizova i dalje je žvakaći problem za programere. Osim što se jezici i školjke dogovore oko značenja određenih rezerviranih mjesta, pravilno korištenje ispravnih sekvenci izlaza zahtijeva i detalje.

Loša interpolacija niza može dovesti do glupog izgleda, kao i do sigurnosnih ranjivosti, poput napada ubrizgavanjem. Dok sljedeća evolucija terminala ne počne razgovarati u emojijima, najbolje bismo pazili kad ispisujemo izlaz za ljude.