Как да отпечатваме нови редове в изхода на командния ред

Изненадващо е, че да накараш компютрите да дават на хората читав изход не е лесен подвиг. С въвеждането на стандартни потоци и конкретно стандартни изходи, програмите придобиха начин да говорят помежду си, използвайки потоци от обикновен текст. Но хуманизирането и показването на stdout е друг въпрос. Технологията през цялата изчислителна епоха се е опитвала да реши този проблем, от използването на ASCII символи във видео компютърните дисплеи до съвременни командни команди като echoи printf.

Тези постижения не са безпроблемни. Работата по отпечатването на изход към терминал е изпълнена със странности за навигация на програмистите, както е илюстрирано от измамно нетривиалната задача за разширяване на изходната последователност за отпечатване на нови редове. Разширяването на заместителя \nможе да се осъществи по множество начини, всеки със своя уникална история и усложнения.

Използвайки echo

От появата му в Multics до съвременната си Unix-подобна системна повсеместност, echoостава познат инструмент за принуждаване на вашия терминал да каже „Здравей, свят! За съжаление, непоследователните внедрения в операционните системи правят използването му сложно. Когато echoна някои системи автоматично ще се разширят последователностите за бягство, други изискват -eопция да направят същото:

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

Поради тези несъответствия в изпълнението, echoсе счита за непоносим. Освен това използването му във връзка с въвеждането от потребителя е сравнително лесно да се повреди чрез атака за инжектиране на черупки, като се използват замествания на команди.

В съвременните системи той се запазва само за осигуряване на съвместимост с многото програми, които все още го използват. Спецификацията POSIX препоръчва използването на printfв нови програми.

Използвайки printf

От 4-то издание на Unix, преносимата printfкоманда по същество е новата и по-добра echo. Тя ви позволява да използвате спецификатори на формат за хуманизиране на въвеждането. Да се тълкува обратно наклонена черта екраниращи последователности, използване %b. Последователността от символи \nгарантира, че изходът завършва с нов ред:

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

Въпреки че printfима допълнителни опции, които го правят далеч по-мощна подмяна на echo, тази помощна програма не е надеждна и може да бъде уязвима от неконтролирана атака на низ във формат. За програмистите е важно да се уверят, че внимателно се справят с въвеждането от потребителя.

Поставяне на нови редове в променливи

В опит да подобри преносимостта сред компилаторите, през 1983 г. е създаден стандарт ANSI C. С използване на ANSI-C котиране $'...', изходните последователности се заменят в изхода според стандарта.

Това ни позволява да съхраняваме низове с нови редове в променливи, които се отпечатват с интерпретираните нови редове. Можете да направите това, като зададете променливата, след което я извикате с printfпомощта на $:

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

Разширената променлива е с единичен кавичка, която се предава буквално на printf. Както винаги, важно е да се справите правилно с входа.

Бонус кръг: разширяване на параметъра на черупката

В моята статия, обясняваща Bash и скоби, разгледах магията на разширяването на параметрите на черупката. Можем да използваме едно разширение ${[email protected]}, за да интерпретираме и евакуационни последователности. Ние използваме printfе %sспецификатор за отпечатване като низ и Eоператорът правилно ще се разшири на бягството последователности в нашата променлива:

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

Продължаващото предизвикателство да се говори по човешки

Интерполацията на низовете продължава да бъде дъвчащ проблем за програмистите. Освен получаване на езици и черупки, за да се съгласим какво означават определени заместители, правилното използване на правилните последователности за бягство изисква внимание и за подробности.

Лошата интерполация на низове може да доведе до глупаво изглеждащи резултати, както и да въведе уязвимости в сигурността, като например от инжекционни атаки. Докато следващата еволюция на терминала не ни накара да говорим в емотикони, най-добре бихме обърнали внимание при отпечатването на изход за хора.