Рядок тривалістю життя

Існує широко поширена помилка, згідно якої графічний інтерфейс нібито є вищою і останньою стадією розвитку користувацьких інтерфейсів, а командний рядок — це щось примітивне і малокорисне, якщо не застаріле.

Насправді, ця послідовність відображає не що інше, як порядок, з яким з двома основными метафорами організації користувацьких інтерфейсів познайомилися користувачі персональних комп'ютерів. Аж до початку дев'яностих ПК були простими і малопотужними, підтримка графіки і можливість комфортної роботи з віконними графічними системами з'явилася на них недавно (навіть у масштабі інформаційно-технологічної галузі, що стрімко розвивається).

Проте за роки до цього графічні інтерфейси вже широко застосовувалися на робочих станціях — звичайно, дорожчому, рідкісному і спеціалізованому устаткуванні. Якщо бути точними, то обидві концепції в їх більш менш сучасному вигляді сформувалися приблизно в один час.

У 1967-68 рр. Дуг Энгельбарт представив прототип т.з. WIMP-інтерфейсу, тобто інтерфейсу, що використовує поняття вікон (windows), піктограм (icons), меню (menus) і покажчиків (pointers), що є ключовими і для сьогоднішніх графічних призначених для користувача середовищ.

У 1968-69 рр. Кен Томсон і Денніс Річі представили перший реліз ОС UNIX, що, по суті, стала прототипом артикульованої системи сучасних понять практичної інформатики, таких, як процеси і файли, і що містить несуперечливу, логічну і лаконічну мову роботи з відповідними їм сутностями, який опісля півтора десятка років став стандартним користувацьких інтерфейсом ОС. (Рубіж шестидесятих і сімдесятих минулого століття взагалі є «осьовим часом» інформатики і обчислювальної техніки...).

Зрозуміло, як одна, так і друга метафоричні системи з'явилися не на голому місці, і їх родовід можна прослідкувати назад аж до витоків обчислювальної техніки: до комунікаційної панелі перших комп'ютерів, як речі твердої і вельми графічної (або, в усякому разі, живописної) — це кінець сорокових, і до мов управління завданнями в перших програмних планувальниках, завантажувачах і ОС — це середина п'ятдесятих, відповідно. Відзначимо, що ідея управління комп'ютером як «приладом» — за допомогою органів управління (неважливо, «в залізі» або намальованих на екрані) старша за ідею «діалогу» за допомогою слів.

При цьому, для більшості користувачів знайомство з командним рядком до недавнього часу обтяжувалося радикальним спрощенням і зміною, яким мова стандартної оболонки ОС була піддана при розробці ОС для ПК (таких, як CP/M, MS-DOS (PC-DOS) і клонів останньої). Обмежуючись знайомством із засобами MS-DOS і її командних файлів, про метафору командного рядка можна скласти лише вельми мінливе і убоге уявлення.

Текстофобія

Для людей старорежимних, починаючи від віку автора (йому 33) і старше, комп'ютер дивовижний і страшний своєю унікальною здібністю до символічної активності. Ми виросли в світі «дурних» речей, пасивних або таких, що проявляють свою активність чисто механічно (як автомобіль, який може швидко довезти, або ж роздавити, якщо вчасно не ухилишся), і нездібних до діалогу в побутовому оточенні. До діалогу здібні були речі культури (книга, картина, симфонія) — але опосередковано, в окремих, відведених для цього місцях, в призначений час і при ретельному відборі співбесідників.

Можливо, тістечко і говорило, по Курту Левіну, на своїй кондитерській мові «з'їш мене», але нічого подібного до продемонстрованої нам недавно упаковки, що говорить «купи мене» вже звичайним людським голосом (причому, з урахуванням физіоантропометричних даних покупця, що наблизився), не було. Речі були «дурними», наскільки б витончений розум своїх творців вони не утілювали, а розумними були тільки люди.

Автор дотепер знаходиться під впливом першого свого досвіду в десятирічному віці спілкування з комп'ютером, котрий йому щось відповів у відповідь на введений рядок. І відповів осмислено. (Подробиць він не пам'ятає, але, швидше за все, першою відповіддю була вказівка на те, що команда містить синтаксичну помилку.) Слово страшний вище — не випадково, але, врешті-решт, комп'ютери були тоді надійно замкнуті в своїх обчислювальних центрах.

Роль клітки для цього звіра для багатьох сьогодні грає гладка поверхня «графічних інтерфейсів», що приховує діалог. Комп'ютер, прикритий таким чином, вже не демонструє лякаючу символічну наготу. Він реагує на натиснуту кнопку з картинкою — можна заспокоювати себе, що це така хитра машинка: пилосос після натиснення кнопки смокче, а комп'ютер — друкує, зв'язано все чисто механічно, і ніякого чоловічка, який з вивороту інтерфейсу подивився, куди ж ти натиснув і визначив, що ж зробити з картинкою, немає.

Насправді примара маленьких чоловічків є — за лаштунками гладкої розмальованої поверхні йде обмін такими ж — mutatis mutandis — повідомленнями, що спантеличили автора, коли він був маленьким. Від нинішніх маленьких їх хочуть поховати, як електричний струм за ізоляцією. Щоб не стукнуло. Але в шафі кожного комп'ютера, будь він тричі персональний, захований скелет штучного розуму, при всій умовності останнього виразу.

Існує впливова тенденція в сучасних гуманітарних дисциплінах, що набула поширення в основному в англомовному світі і пов'язана з дотепними теоріями канадського професора Маршала Мак-Льюена, котрий стверджував, що письмова («візуальна») культура пов'язана з гіпертрофією аналітичних функцій людського інтелекту на певних стадіях його розвитку, і що її змінює культура «аудіальна», направлена на синтез цілого шляхом розсіювання уваги, і повернення до доіндивідуалістичної, громадській свідомості, від поліса і урба — до «глобального села».

З цією зміною він зв'язував популярність телебачення (і втрату популярності читання як дозвілля) і «кліп-культури», а його послідовники указують і на безперечне зростання в дев'яності популярності «графічних користувацьких інтерфейсів» комп'ютерів, причому не тільки в побуті, але і в діловому оточенні.

Мак-Льюен, втім, в своєму «зондуванні» (як він іменував свою творчість, вельми послідовно відмовляючись називати свої пізніші твори «текстами») був достатньо іронічний, що в значно меншій степені спостерігається в творчості його послідовників.

Зрозуміло, кожен має право, хоча воно особливо і не обумовлено в Конституції, на персональні фобії, і навіть право постфактум раціоналізувати їх в теоріях. Проте ми вважаємо, що нікому не повинно бути дозволено транслювати ці фобії іншим, тим паче — підростаючому поколінню.

Комп'ютери (і нова генерація «розумних» приладів, машин і механізмів, включаючи промислові, канцелярські і побутові) відрізняються від всього, створеного людиною раніше, здатністю безпосередньо маніпулювати символами, сприймати символи і повідомляти символи людині, тобто, в деякому роді вести з нею діалог.

Чи варто називати цю властивість комп'ютерів і програм штучним інтелектом — окреме питання, але сам факт, на нашу думку, повинен зайняти одне з основних місць в змісті навчального предмету інформатики. У цьому сенсі, тенденція до витіснення програмного інструментарію, що виявляє цю властивість в найбільш методично і дидактичний відвертій формі, з шкільних курсів здається нам украй неприємною і такою, що потребує корекції.

Ми з ентузіазмом відносимося до застосування графічних інтерфейсів, як в традиційній сфері комп'ютерної графіки, так і в нових, перспективних застосуваннях. Картинка часто коштує сотні слів, а енергійний жест здатний виразити просту думку швидко і однозначно.

Проте думка про те, що піктограмами і жестами можна замінити повноцінну мову, нагадує нам лише одну з геніальних ідей академії наук в Лагадо, описаної Свіфтом в «Третій подорожі Гуллівера»:

«А оскільки слова суть тільки назви речей, то автор проекту висловлює пропозицію, що для нас набагато зручніше носити при собі речі, необхідні для виразу наших думок і бажань».

Дивлячись на візуально-дизайнерський витвір чергового їх послідовника, лише дивуєшся: з якого мішка він дістав значок, що виражає ідею: «Вхід з неповнолітніми леопардами, що жують морозиво, в темний час доби заборонений»? І чому він думає, що цей значок інтуїтивно зрозумілий?

«Мені часто траплялося бачити двох таких мудреців, що знемагали під тяжкістю ноші ... При зустрічі на вулиці вони знімали з плечей мішки, відкривали їх і, діставши звідти необхідні речі, розмовляли протягом години». У Ладаго спроба мудреців здійснити масштабне впровадження свого винаходу закінчилася тим, що: «Жінки, увійшовши до страйку з неосвіченою черню ... пригрозили підняти повстання, вимагаючи, щоб мові їх була надана повна воля ... так простий народ постійно виявляється непримиренним ворогом науки!»

Графік наочний, лише поки цифри на ньому можна розгледіти, а піктограми осмислені тільки при виборі з небагатьох варіантів (навіть сотню дорожніх знаків вивчити вже непросто). Для артикулюючого і гнучкого виразу ідей (далеко не всі з яких можна намалювати) і їх зв'язку людство виробило такий інструмент, як мови (природні і формальні), і заміни їм поки що не передбачається.

Командна оболонка: основні поняття

Операційна система, як «місце існування» файлів і процесів, складається з ядра і оболонки з інструментами. Ядро при нормальному функціонуванні системи залишається для користувача «річчю в собі», яку безпосередньо не видно і не чути. В той же час, тільки ядро, маючи доступ до устаткування, здатне оперувати файлами і процесами, тобто здійснювати діяльність з деяким об'єктивним результатом.

Користувачу ця функціональність доступна тільки опосередковано, через особливу програму, яка «спілкується» з ним за допомогою терміналу і цілком логічно називається «оболонкою». Теоретично оболонка могла б реалізувати замкнуту мову діалогу (і рання архітектура ОС носить сліди таких спроб), але у відкритих системах прийнята інша філософія — розділення, спеціалізації і мінімізації програм. Тому на практиці оболонка використовується разом з інструментами — набором найчастіше вживаних програм — і лише синтаксис і семантика оболонки укупі з синтаксисом і семантикою використовуваних утиліт і утворюють повноцінну формальну мову діалогу користувача з системою. У червні 1993 р. ця мова була стандартизована Міжнародною організацією стандартизації (документ ISO/IEK IS 9945-2:1993), але відомий він більше під своєю «галузевою» назвою POSIX.2.

Існує безліч реалізацій стандартної мови оболонки і утиліт, що беруть свої витоки у системах Unix, BSD, проекту GNU і деяких інших проектах. Найпопулярнішим на сьогоднішній день є bash у складі GNU Tools, розроблених частково у Фонді вільного програмного забезпечення і частково за його підтримкою. GNU Tools є, разом з ядром Linux, основою операційних систем на цьому ядрі, але доступні і для інших ОС, включаючи альтернативну архітектуру.

У технічному аспекті оболонка є порядковим інтерпретатором простої мови сентенціонального (директивного) програмування, в якості операторів якої можуть використовуватися утиліти, як, втім, і будь-які інші програми, включаючи, зокрема, написані самим користувачем, і, в тому числі, написані на мові самої оболонки, бо, будучи інтерпретатором, вона може читати команди як інтерактивно (з терміналу), так і з файлу.

Командна оболонка як інструмент

Користування оболонкою дуже просте: у відповідь на запрошення («підказку»), що видається оболонкою, котра знаходиться у очікуванні, користувач вводить команду і, після її виконання (котре, можливо, супроводжується виводом на екран деякої інформації), оболонка знову виводить запрошення і чекає наступної команди. І так — поки користувач не введе символ кінця файлу (або команду exit), після чого сеанс роботи закінчиться. Так само (з деякими нюансами) оболонка інтерпретує і файл «сценарію» (програми) із записаними в ньому командами (можливо, з використанням керуючих конструкцій; загальну характеристику оболонки як мови програмування див. нижче).

$ ls
!                     k7m-104.old                tmp.sh
EPIA_Manual_v1.0.pdf  k7m-104.pdf                wget-log
[0-11-9].jpg          words-to-avoid.ru.html.1   army_engl.txt 
names                 words-to-avoid.ru.html.2   dengi.rar
opensource.mit.edu    www.computerra.ru          econ.pdf
ruspunk.swf           www.ctc.msiu.ru            firewalls.tar
school                tmp                        gosorgan.amursk.ru
tmp.1                 www.oreilly.com            j463_k7m.pdf
tmp.html
$_

Мал. 1

Простий «обмін репліками» між оболонкою і користувачем приведений на мал. 1 Ввівши команду ls (від LiSt — вивести список файлів в поточному каталозі), користувач одержав список файлів, що знаходяться в поточному каталозі.

$ ls -l
total 3707
drwxr-xr-x   2 maksim   None         4096 Oct 29  2001 !
-rw-r--r--   1 maksim   None        19743 Nov  5 00:08 EPIA_Manual_v1.0.pdf
-rw-r--r--   1 maksim   None           39 May 27  2002 [0-11-9].jpg
-rw-r--r--   1 maksim   None       666120 Nov 12  2001 army_engl.txt
-rw-r--r--   1 maksim   None        12402 Oct 11  2001 dengi.rar
-rw-r--r--   1 maksim   None       101873 Oct  8  2001 econ.pdf
-rw-r--r--   1 maksim   None      2129920 Aug 15  2001 firewalls.tar
drwxr-xr-x   2 maksim   None            0 Nov 10 08:48 gosorgan.amursk.ru
-rw-r--r--   1 maksim   None       768086 May  1  2002 j463_k7m.pdf
-rw-r--r--   1 maksim   None       340016 May  1  2002 k7m-104.old
-rw-r--r--   1 maksim   None      2543572 Dec  9  2001 k7m-104.pdf
-rw-r--r--   1 maksim   None           23 Nov 28 03:44 names
drwxr-xr-x   5 maksim   None         4096 Nov  7 07:08 opensource.mit.edu
-rw-r--r--   1 maksim   None       855480 Jun  7 17:01 ruspunk.swf
drwxr-xr-x   5 maksim   None            0 Oct 14  2001 school
-rw-r--r--   1 maksim   None        16000 Aug 25 02:24 tmp
-rw-r--r--   1 maksim   None          467 Oct 29  2001 tmp.1
-rw-r--r--   1 maksim   None        67888 Sep 26  2001 tmp.html
-rwxr-xr-x   1 maksim   None          198 Aug 23 04:48 tmp.sh
-rw-r--r--   1 maksim   None          835 Nov 27  2001 wget-log
-rw-r--r--   1 maksim   None        12698 Jun 16  2000 words-to-avoid.ru.html.1
-rw-r--r--   1 maksim   None        12698 Jun 16  2000 words-to-avoid.ru.html.2
drwxr-xr-x   6 maksim   None         4096 Sep 26  2001 www.computerra.ru
drwxr-xr-x   3 maksim   None            0 Oct  9  2001 www.ctc.msiu.ru
drwxr-xr-x  12 maksim   None         4096 Apr 26  2002 www.oreilly.com
$_

Мал. 2

Користувачів-початківців (особливо вихованих в субкультурі ПК) часто дивує така річ: якщо дати, наприклад, команду ls, результат буде вельми лаконічним, в той час, як у неї є ключі-модифікатори, що дозволяють одержати вказаний список у вигляді, що значно легший для сприйняття людиною (див. мал. 2). Чому ж стандартною (варіантом, вжитим у випадку, якщо ключі явно вказані не були) є саме лаконічна, «неприваблива», «незручна» форма?

Причина дуже проста: як і будь-яка інша стандартна утиліта, ls набагато частіше використовується не оператором, а якою-небудь іншою програмою, тому її вивід пристосований для його найзручнішої подальшої обробки. Подача команди з клавіатури — виключення, а не правило, і для зручності оператора передбачений відповідний ключ. Якщо користувачу часто потрібно виводити список файлів на екран, він запрограмує оболонку, визначивши для себе синонім (наприклад, синонімом конструкції ls -al --color=always | less, що виводить посторінковий список файлів зі всіма атрибутами і з виділенням типів файлів різними кольорами, може бути визначена команда lls).

Зрозуміти цю просту річ означає зрозуміти вельми серйозну частину комп'ютерної культури. Універсальні системи (наприклад, ОС), на відміну від спеціалізованих (наприклад, мультимедійних кіосків або ігрових приставок) створюються не для зручності користування ними «з коробки» абстрактним «простим користувачем», а для зручності їх настройки (програмування) конкретним користувачем під його конкретні потреби. Це не зручність, а метазручність, не вбудовані в стіни кімнати меблі, а модульний гарнітур з інструкцією по збірці, не «для всіх», а для кожного. А «простих» користувачів не буває, всі ми складні і різні.

$ cat
Петя
Петя
Яна
Яна
Вася
Вася
Маша
Маша
^D
$_

Мал. 3

$ cat >names
Петя
Яна
Вася
Маша
^D
$ ls names
names
$ cat <names
Петя
Яна
Вася
Маша
$_

Мал. 4

Утиліти можуть не лише виводити текст, але і читати ввід. Простий приклад — утиліта конкатенації cat, яка, будучи видана без аргументів, просто порядково копіює текст (див. мал. 3). Утиліта, що читає що-небудь із стандартного вводу і виводить що-небудь на стандартний висновок, називається фільтром, фільтрами є багато із стандартних POSIX-утиліт.

Стандартний ввід-вивід — це два файли, які за замовчуванням пов'язані з поточним терміналом. Одним з найпотужніших засобів оболонки є перенаправлення вводу і виводу в довільний файл, що задається відповідно знаками < і >, за якими слідують імена файлів. На мал. 4. показано перенаправлення виводу команди cat у файл names і перенаправлення вводу цієї команди із створеного попередньою командою файлу. Важливо відмітити, що перенаправлення стандартного вводу-виводу проводиться саме оболонкою, «уміння» розпізнавати перенаправлення як свої аргументи від самої утиліти (або, наприклад, призначеної для користувача програми) не вимагається.

Ще одним могутнім засобом оболонки є так званий «конвейєр» (або «канал») — з'єднання виводу однієї команди з вводом іншої.

$ cat names names >names2
$ cat <names2
Вася
Маша
Петя
Яна
Вася
Маша
Петя
Яна
$ sort <names2
Вася
Вася
Маша
Маша
Петя
Петя
Яна
Яна
$ uniq <names2
Вася
Маша
Петя
Яна
Вася
Маша
Петя
Яна
$ sort <names2 | uniq
Вася
Маша
Петя
Яна

Мал. 5

На мал. 5 наведено розгорнутий приклад. Командою cat names names >names2 ми створюємо файл names2, що містить подвоєний вміст раніше створеного файлу names. Утилітою sort його можна відсортувати в алфавітному порядку, а про утиліту uniq відомо, що вона видаляє рядки, що повторюються. Проте видаляє вона тільки рядки, що йдуть підряд, тому, щоб унікалізувати рядки у файлі, що містить їх в довільному порядку, файл потрібно спершу відсортувати.

Нам вже відомо, що перенаправленням вводу-виводу можна створити тимчасовий файл (це виглядало б так: sort temp ; uniq temp ; rm temp), проте конвейєр, що задається символом |, дозволяє «замкнути» вивід команди sort на ввід uniq без створення проміжного файлу, який потім потрібно видаляти: sort <names2 | uniq temp. Ланцюжок команд, що об'єднуються в конвейєр, може бути довільної довжини.

І, нарешті, ще одним могутнім засобом командної оболонки є підтримка шаблонів імен файлів (усіченого варіанту так званих «регулярних виразів»). Якщо ми хочемо видалити з каталога, вміст якого відображався в прикладі на мал. 1, файли words-to-avoid.ru.html.1 і words-to-avoid.ru.html.2, нам не обов'язково передавати їх список команді rm; досить визначити вираз, однозначно їх що характеризує, наприклад words-to-avoid*. Метасимвол * означає будь-яку кількість будь-яких символів; існують і інші метасимволи. Результат виконання цієї команди у вказаному каталозі в точності еквівалентний команді rm words-to-avoid.ru.html.1 words-to-avoid.ru.html.2, причому розкривання метасимволів виконує, знову ж таки, не утиліта, а сама оболонка.

Командна оболонка як мова програмування

Як мова програмування стандартна оболонка може бути охарактеризована таким чином:

  • сентенціональна (директивна) парадигма;
  • можливість порядкової інтерпретації або однопрохідної компіляції (тобто порядкова контекстна незалежність зверху вниз). Нам невідомі що компілюючі реалізації мови стандартної оболонки;
  • наявність керуючих конструкцій:
    • послідовного виконання
    • умовного (if-then, if-else, if-then-else, if-then-elif...) виконання
    • багатоваріантного вибору (case)
    • циклів (перебору списку for, з постумовою until, з передумовою while) і їх розриву (break, continue);
  • наявність механізму підпрограм-функцій (описуваних як у файлі сценарію, так і в окремих файлах або бібліотеках);
  • наявність оператора привласнення (установки значення змінної);
  • можливість використання зовнішніх програм (команд) ОС як операторів (викликів функцій) і обробка значень їх кодів повернення;
  • наявність нетипізованих змінних. Змінні декларуються першою згадкою, можуть приймати як значення довільний ланцюжок. Значення, що може бути інтерпретованим як число може використовуватися у виразах цілочисельної арифметики;
  • розвинений синтаксис виразів, що використовуються в операторах привласнення, а також як умови виконання або циклів;
  • розвинена система роботи з файлами (вводу/виводу), зокрема із стандартним вводом з терміналу і виводом на термінал;

Таким чином, мова оболонки добре підходить для того, для чого він призначений: написання програм (сценаріїв) роботи з файлами (цікаво, що значна частина самих відкритих ОС написана саме на мові оболонки). Вона не дуже підходить для вирішення завдань алгебри, хоча відсутність вбудованого механізму роботи з плаваючою арифметикою може бути обійдена застосуванням спеціальних утиліт, наприклад, універсального калькулятора довільної точності bc, і зберіганням значень дійсного чисел в рядкових змінних. Подібним же чином використанням зовнішніх утиліт можна писати на цій мові програми з віконним (як псевдографічним, так і графічним) інтерфейсом.

Синтаксис мови (зокрема, синтаксис виразів) не відрізняється зовнішньою витонченістю (хоча для знавця сценарії можуть бути вельми красивими і нетривіальними) і навряд чи може бути рекомендований як перша мова при знайомстві з програмуванням. Відсутність типізації і непідтримка інших, окрім сентенціональної, парадигм програмування, в усякому разі, служать вагомим приводом для того, щоб не вводити його в навчальний курс як єдиний.

В той же час, хоча б побіжне знайомство з мовою оболонки, крім очевидного прагматичного значення, дидактично корисне. Вона цілком придатна для демонстрації таких важливих понять, як привласнення значень, зміст і використання керуючих конструкцій, підпрограми (функції). Технічно вона простий у використанні завдяки наявності інтерпретатора bash (що може працювати в POSIX-режимі, тобто в строгій відповідності із стандартами); під рукою в будь-якій стандартній ОС (а також наявності портів того ж bash практично для будь-якої альтернативної платформи). Вона може бути єдиною сентенціональною мовою в загальноосвітньому курсі інформатики.

Ресурси

Методична література, спеціально орієнтована на шкільний курс і присвячена програмуванню на мові оболонки, російською мовою сьогодні відсутня, хоча слід зазначити, що «класичне» керівництво по Unix за тридцять років розвитку галузі досягло практично кристальної прозорості викладу і легко може бути адаптоване для потреб як вчителів, так і учнів. Російською нам відома єдина книга , спеціально присвячена програмуванню на мові оболонки. Інтерпретатори мови оболонки є невід'ємною частиною відкритих систем і включені до складу будь-якого дистрибутива (так само, як і посібники користувача); кращим з них ми вважаємо вільний bash, розроблений Фондом вільного програмного забезпечення. Для користувачів альтернативної архітектури (наприклад, Microsoft Windows) ми рекомендуємо також bash, доступний у складі численних програмних пакетів.

Для Microsoft Windows рекомендується установка пакету Cygwin, що містить утиліти GNU і деякі інші програми, що дозволяють організувати стандартне робоче середовище. Слід врахувати, що при роботі у версіях MS Windows, заснованих на MS-DOS (MS Windows 95/98/Me), у багатьох програм виникають складнощі через відсутність в MS-DOS контролю за правами доступу до файлів і каталогів (версії, засновані на NT, — MS Windows NT/00/XP, позбавлені цього недоліку), а також те, що локалізована для російського середовища збірка Cygwin в даний час не поставляється. Для підтримки кирилічних символів необхідно в каталозі користувача створити файл з ім'ям .inputrc, що містить рядки:

set meta-flag on
set convert-meta off
set output-meta on

Альтернативою Cygwin (з ряду причин менш бажаною) є використання системи Interix UNIX Tools for Windows, що також містить утиліти GNU, включаючи bash (її можна придбати через Microsoft на диску або викачати з їх сайту).