În mod surprinzător, obținerea computerelor pentru a oferi oamenilor un rezultat lizibil nu este un lucru ușor. Odată cu introducerea fluxuri standard și în mod specific ieșirii standard, programele au câștigat o modalitate de a vorbi între ele folosind fluxuri de text simplu. Dar umanizarea și afișarea stdout-ului este o altă problemă. Tehnologia de-a lungul erei informatice a încercat să rezolve această problemă, de la utilizarea Caracterele ASCII din afișajele computerului video la comenzile shell moderne precum echo și printf.

Aceste progrese nu au fost perfecte. Sarcina de a imprima ieșirea către un terminal este plină de ciudățenii pe care programatorii le pot naviga, după cum este exemplificat de sarcina înșelător nontrivială de a extinde un secvență de evadare pentru a imprima linii noi. Extinderea substituentului n poate fi realizat într-o multitudine de moduri, fiecare cu istoria și complicațiile sale unice.

Folosind echo

De la apariția sa în Multics la ubicuitatea modernă a sistemului Unix, echo rămâne un instrument familiar pentru ca terminalul dvs. să spună „Bună ziua lume!” Din păcate, implementările incoerente ale sistemelor de operare îngreunează utilizarea acestuia. Unde echo pe unele sisteme se vor extinde automat secvențele de evadare, alții necesită o -e opțiunea de a face același lucru:

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

Din cauza acestor neconcordanțe în implementări, echo este considerat neportabil. În plus, utilizarea acestuia împreună cu introducerea utilizatorului este relativ ușor de corupt atac de injectare a cochiliei folosind substituții de comandă.

În sistemele moderne, este păstrat doar pentru a oferi compatibilitate cu numeroasele programe care încă îl folosesc. Specificația POSIX recomandă utilizarea printf în programe noi.

ad-banner

Folosind printf

Din 4 Ediție Unix, portabilul printf comanda a fost în esență nou și mai bun echo. Vă permite să utilizați specificatori de format a umaniza aportul. Pentru a interpreta secvențele de evacuare a barei inversă, utilizați %b. Secvența de caractere n asigură că ieșirea se termină cu o linie nouă:

printf "%bn" "Many females in Oble are noblewomen"
# Many females in Oble are 
# oblewomen

Deşi printf are alte opțiuni care îl fac o înlocuire mult mai puternică a echo, acest utilitar nu este infailibil și poate fi vulnerabil la un șir de format necontrolat atac. Este important ca programatorii să le asigure gestionați cu atenție informațiile utilizatorului.

Introducerea de linii noi în variabile

Într – un efort de a îmbunătăți portabilitatea printre compilatoare, Standard ANSI C a fost înființată în 1983. Cu Citarea ANSI-C folosind $'...', secvențe de evadare sunt înlocuite la ieșire conform standardului.

Acest lucru ne permite să stocăm șiruri cu linii noi în variabile care sunt tipărite cu noile linii interpretate. Puteți face acest lucru setând variabila, apoi apelând-o cu printf folosind $:

puns=$'numbernarrownethernice'

printf "%bn" "These words started with n but don't make $puns"

# These words started with n but don't make 
# umber
# arrow
# ether
# ice

Variabila extinsă este citată singură, care este transmisă literalmente către printf. Ca întotdeauna, este important să gestionați corect intrarea.

Runda bonus: extinderea parametrilor shell

În articolul meu care explică Bash și bretele, Am acoperit magia lui extinderea parametrilor shell. Putem folosi o singură expansiune, ${parameter@operator}, pentru a interpreta și secvențe de evadare. Folosim printf‘s %s specificator pentru a imprima ca un șir, și E operatorul va extinde în mod corespunzător secvențele de evadare din variabila noastră:

printf "%sn" ${puns@E}

# umber
# arrow
# ether
# ice

Provocarea continuă de a vorbi în om

Interpolarea șirurilor continuă să fie o problemă masticabilă pentru programatori. Pe lângă obținerea limbajelor și a cochiliei de acord asupra a ceea ce înseamnă anumiți substituenți, utilizarea corectă a secvențelor de evacuare corecte necesită un ochi pentru detalii.

O interpolare slabă a șirurilor poate duce la o ieșire prostească, precum și introduce vulnerabilități de securitate, cum ar fi de la atacuri de injectare. Până când următoarea evoluție a terminalului ne va face să vorbim în emojis, cel mai bine ar fi să fim atenți la tipărirea rezultatelor pentru oameni.