Sådan udskrives nye linjer i kommandolinieoutput

Overraskende nok er det ikke let at få computere til at give mennesker læsbar output. Med introduktionen af ​​standardstrømme og specifikt standardoutput fik programmer en måde at tale med hinanden ved hjælp af almindelige tekststrømme. Men humanisering og visning af stdout er en anden sag. Teknologi i hele databehandlingsalderen har forsøgt at løse dette problem, fra brugen af ​​ASCII-tegn i videocomputerskærme til moderne shell-kommandoer som echoog printf.

Disse fremskridt har ikke været problemfri. Jobbet med at udskrive output til en terminal er fyldt med quirks for programmører at navigere, som eksemplificeret ved den vildledende ikke-trivielle opgave at udvide en escape-sekvens til at udskrive nye linjer. Udvidelsen af ​​pladsholderen \nkan gennemføres på en række måder, hver med sin egen unikke historie og komplikationer.

Ved brug af echo

Fra dets optræden i Multics til dets moderne Unix-lignende systemallokalitet er det echostadig et velkendt værktøj til at få din terminal til at sige "Hej verden!" Desværre gør inkonsekvente implementeringer på tværs af operativsystemer brugen vanskelig. Hvor echonogle systemer automatisk udvider escape-sekvenser, kræver andre en -emulighed for at gøre det samme:

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

På grund af disse uoverensstemmelser i implementeringer echobetragtes som ikke-bærbar. Derudover er dets anvendelse i forbindelse med brugerinput relativt let at ødelægge gennem angreb af shellinjektion ved hjælp af kommandosubstitutioner.

I moderne systemer bevares det kun for at give kompatibilitet med de mange programmer, der stadig bruger det. POSIX-specifikationen anbefaler brug af printfi nye programmer.

Ved brug af printf

Siden 4. udgave Unix har den bærbare printfkommando stort set været den nye og bedre echo. Det giver dig mulighed for at bruge formatspecifikatorer til at humanisere input. Brug til at fortolke backslash escape-sekvenser %b. Tegnsekvensen \nsikrer, at output slutter med en ny linje:

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

Selvom det printfhar flere muligheder, der gør det til en langt mere kraftfuld erstatning for echo, er dette værktøj ikke idiotsikkert og kan være sårbart over for et ukontrolleret formatstrengeangreb. Det er vigtigt for programmører at sikre, at de omhyggeligt håndterer brugerinput.

Sætte nye linjer i variabler

I et forsøg på at forbedre bærbarheden blandt kompilatorer blev ANSI C-standarden etableret i 1983. Med ANSI-C-citering ved hjælp af $'...'udskiftes escape-sekvenser i output i henhold til standarden.

Dette giver os mulighed for at gemme strenge med nye linjer i variabler, der udskrives med de nye linjer fortolket. Du kan gøre dette ved at indstille variablen og derefter ringe til den ved printfhjælp af $:

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

Den udvidede variabel er enkeltciteret, som overføres bogstaveligt til printf. Som altid er det vigtigt at håndtere input korrekt.

Bonusrunde: udvidelse af shell-parameter

I min artikel, der forklarede Bash og seler, dækkede jeg magien ved udvidelse af shellparametre. Vi kan også bruge en udvidelse ${[email protected]}til at fortolke flugtsekvenser. Vi bruger printf's %sspecifikator til at udskrive som en streng, og Eoperatøren udvider escape-sekvenserne korrekt i vores variabel:

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

Den igangværende udfordring ved at tale menneskeligt

Strenginterpolation er fortsat et sejt problem for programmører. Udover at få sprog og skaller til at blive enige om, hvad bestemte pladsholdere betyder, kræver korrekt brug af de korrekte flugtsekvenser øje for detaljer.

Dårlig strenginterpolering kan føre til fjollet udseende samt introducere sikkerhedssårbarheder, f.eks. Fra injektionsangreb. Indtil den næste udvikling af terminalen får os til at tale i emojis, skal vi bedst være opmærksomme, når vi udskriver output til mennesker.