НАЗВА

autoexpect - генерує сценарій Expect зі спостереження сеансу

ЗВЕДЕННЯ

autoexpect [ аргументи ] [ програма аргументи... ]

ВСТУП

autoexpect спостерігає за вашою взаємодією з іншою програмою, і створює сценарій Expect, який відтворює ваші дії. У разі прямолінійних сценаріїв, autoexpect істотно економить час порівняно з їхнім написанням вручну. Навіть вважаючи себе знавцем Expect, ви переконаєтесь у зручності використання autoexpect для автоматизації простіших частин взаємодії з програмою. Набагато легше вирізати та вставити кілька шматів сценаріїв autoexpect, ніж писати те саме з нуля. Якщо ви початківець, то можете нічого майже не знати більше про Expect окрім як викликати autoexpect.

Найпростіший спосіб використання autoexpect - викликати її з командного рядка без ніяких аргументів. Наприклад:

% autoexpect

Без задання, autoexpect продовжує процес оболонки для вас. Якщо вказати назву програми й аргументи, autoexpect продовжить процес цієї програми. Наприклад:

% autoexpect ftp ftp.cme.nist.gov

Як тільки продовжена програма запрацює, дійте як звичайно. Після виходу з оболонки (або вказаної вами програми), autoexpect створить новий файл сценарію для вас. Стандартно autoexpect записує новий сценарій у "script.exp". Ви можете переважити таке поводження прапорцем -f із подальшою назвою сценарію.

Наступний приклад запускає "ftp ftp.cme.nist.gov" і зберігає отриманий у наслідок сценарій Expect у файлі "nist".

% autoexpect -f nist ftp ftp.cme.nist.gov

Важливо розуміти, що autoexpect не гарантує робочого сценарію, оскільки деякі речі вона має вгадувати, й іноді вгадує неправильно. Проте звичайно ці проблеми досить легко виявити та виправити. Ось типові:

o : Синхронізація. На диво багато програм (rn, ksh, zsh, telnet тощо) та пристроїв (наприклад модеми) ігнорують натиски клавиш, які надійшли "зашвидко" після запрошення до вводу. Якщо ви виявите, що ваші сценарії зависають в якомусь місці, спробуйте додати коротку затримку (sleep) після попереднього надсилання даних.

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

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

На щастя дірки в синхронізації повторюються не часто. Приміром програма telnet ігнорує символи тільки після того як одержала керівну послідовність. Модеми - тільки одразу після першого сполучення з ними. Декілька програм поводяться так увесь час, але типово мають перемикач для скасування цієї поведінки (наприклад прапорець -T програми rn).

У наступному прикладі autoexpect розпочато в консервативному режимі.

autoexpect -c

За допомогою прапорця -C можна визначити клавиші, які викликатимуть консервативний режим. У наступному прикладі autoexpect розпочато у звичайному режимі, але з ^L як перемикач (^L означає control-L).

autoexpect -C ^L

У прикладі далі autoexpect розпочато у консервативному режимі з ^L як перемикач.

autoexpect -c -C ^L

o : Відлуння. Багато програм відлунюють символи. Наприклад, якщо ви введете "more" в оболонці, те що autoexpect побачить виглядатиме як:

ви ввели 'm', комп'ютер вивів на екран 'm', ви ввели 'o', комп'ютер вивів на екран 'o', ви ввели 'r', комп'ютер вивів на екран 'r', ви ввели 'e', комп'ютер вивів на екран 'e' ...

Без специфічного знання програми неможливо сказати, чи слід чекати відлуння кожного символу перед вводом наступного. Якщо програма autoexpect бачить, що символи відлунюються, вона припускає собі, що може відіслати їх усі гуртом замість по-черзі так, як вони з'являлися. Це робить сценарій приємнішим для читання, але може бути неправильно, якщо дійсно треба було зачекати на відлуння кожного символу.

o : Відмінності. Програма autoexpect записує до сценарію кожний символ під час взаємодії з програмою. Це є бажаним, оскільки дозволяє вам вирішити, що є важливим, і що можна замінити порівнянням із шаблоном.

З іншого боку, якщо ви користуєтесь командами, чий вивід відрізняється від одного сеансу до іншого, тоді згенеровані сценарії будуть неправильні. Так, наприклад команда "date" завжди продукує відмінний вивід. Тому використання команди date під час запуску autoexpect - це вірний спосіб отримати сценарій, який потребуватиме редагування для того, щоб він запрацював.

Прапорець -p переводить autoexpect у "режим запрошення" (підказки). У цьому режимі autoexpect шукатиме тільки останній рядок виводу програми, який зазвичай складається із запрошення. Це вирішує проблему із date (дивіться вище) і багато інших.

Наступний приклад запускає autoexpect у режимі запрошення.

autoexpect -p

За допомогою прапорця -P можна визначити клавіші, які викликатимуть режим запрошення. У наступному прикладі autoexpect розпочато у звичайному режимі з ^P як перемикач (^P означає control-P).

autoexpect -P ^P

А в цьому прикладі autoexpect розпочато в режимі запрошення з ^P як перемикач.

autoexpect -p -P ^P

ІНШІ ПРАПОРЦІ

Прапорець -quiet унеможливлює інформаційні повідомлення, які може видавати autoexpect.

Прапорець -Q позначає символ екранації, який використовуватиметься для введення символів, які autoexpect інакше б проковтнув через те, що вони служать перемикачами.

У прикладі нижче показано кілька прапорців разом і вказівником екранації, який дозволяє ввести перемикачі буквально.

autoexpect -P ^P -C ^L -Q ^Q

ЩОДО СТИЛЮ

Я не знаю, чи існує якийсь "стиль" програм Expect, але autoexpect безсумнівно не слід вважати взірцем стилю. Наприклад autoexpect користується рисами Expect, призначеними спеціально для сценаріїв, генерованих комп'ютером. Тож не пишіть бездумно сценаріїв, які вдають ніби були згенеровані autoexpect. Це - ні до чого.

Одночасно сценарії autoexpect показують деякі важливі речі. Наприклад ви можете бачити, як слід екранувати (брати в лапки) ланцюжки для використання з Tcl, просто пропустивши ланцюжок крізь autoexpect.

ДИВІТЬСЯ ТАКОЖ

?expect(1)

"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs" автор Don Libes, O'Reilly and Associates, січень 1995-го року.

АВТОР

Don Libes, Національний Інститут Стандартів і Технології.

expect та autoexpect являються громадською власністю. NIST та я були би вдячні за посилання на авторів, якщо ці програми чи їхні частини використовуються деінде.