Skip to main content

Ожидать командные команды Linux и Unix

Трюки командной строки Linux #2 (Июнь 2026)

Трюки командной строки Linux #2 (Июнь 2026)
Anonim

Ожидание - это программа, которая разговаривает с другими интерактивными программами в соответствии со сценарием. Следуя сценарию, Expect знает, чего можно ожидать от программы и какой должен быть правильный ответ. Интерпретируемый язык предоставляет ветвящиеся и высокоуровневые структуры управления для направления диалога. Кроме того, пользователь может взять управление и напрямую взаимодействовать по желанию, а затем вернуть управление сценарию.

Expectk - смесь Expect и Tk. Он ведет себя так же, как желание Expect и Tk. Expect также может использоваться непосредственно на C или C ++ без Tcl.

Название «Ожидание» происходит от идеи последовательности отправки / ожидания, популяризируемой программами uucp, kermit и другими модемами. Однако, в отличие от uucp, Expect обобщается так, что его можно запускать как команду уровня пользователя с любой программой и задачей. Ожидание может одновременно общаться с несколькими программами.

Что может ожидать

Например, вот некоторые вещи, которые может выполнить команда expect:

  • Причина, по которой ваш компьютер набирает вас, чтобы вы могли войти в систему, не заплатив за звонок.
  • Начните игру, и если оптимальная конфигурация не появится, перезапустите ее снова и снова), пока она не появится, а затем передайте управление вам.
  • Запустите fsck и в ответ на его вопросы ответьте «да» или «нет» или отдайте управление вам, основываясь на предопределенных критериях.
  • Подключитесь к другой сети и автоматически получите почту, чтобы она выглядела так, как если бы она была первоначально отправлена ​​в вашу локальную систему.
  • Переносить переменные среды, текущий каталог или любую информацию через rlogin, telnet, tip, su или chgrp

Существует множество причин, по которым оболочка не может выполнять эти задачи. Все возможны с помощью Expect.

В общем, Expect полезен для запуска любой программы, требующей взаимодействия между программой и пользователем. Все, что необходимо, - это то, что взаимодействие можно охарактеризовать программно. Ожидание также может вернуть пользователю контроль, не останавливая контролируемую программу. Аналогично, пользователь может в любое время вернуть управление сценарию.

использование

Ожидайте чтение cmdfile для списка исполняемых команд. Ожидание может быть вызвано неявно в системах, поддерживающих #! обозначение, пометив скрипт как исполняемый файл и сделав первую строку в скрипте:

#! / usr / local / bin / expect -f

Конечно, путь должен точно описать, где живет Ожидание. / usr / local / bin - просто пример.

Флаг -c предваряет команду, которая должна быть выполнена до любого в скрипте. Команда должна быть указана для предотвращения разрыва оболочки. Эта опция может использоваться несколько раз. Несколько команд могут быть выполнены с одним -c путем разделения их на точки с запятой. Команды выполняются в том порядке, в котором они отображаются. При использовании Expectk эта опция указывается как -команда.

Флаг -d позволяет получить некоторый диагностический вывод, который в основном сообщает о внутренней активности команд, таких как ожидание и взаимодействие. Этот флаг имеет тот же эффект, что и «exp_internal 1» в начале скрипта Expect, а также печатается версия Expect.

Флаг -D позволяет использовать интерактивный отладчик. Должно следовать целое значение. Отладчик возьмет управление перед следующей процедурой Tcl, если значение не равно нулю или если нажата кнопка ^ C или нажата точка останова, или в скрипте появится другая соответствующая команда отладчика. При использовании Expectk эта опция указывается как -Debug.

Флаг -f предваряет файл, из которого следует считывать команды. Сам флаг является необязательным, поскольку он полезен только при использовании #! но также можно указать другие аргументы в командной строке. При использовании Expectk эта опция указывается как -файл.

По умолчанию командный файл считывается в память и выполняется целиком. Иногда желательно читать файлы по одной строке за раз. Чтобы принудительно обрабатывать произвольные файлы, используйте флаг -b. При использовании Expectk эта опция указывается как -buffer.

Если строка «-» указывается как имя файла, вместо этого считывается стандартный ввод. Используйте «./-» для чтения из файла с именем «-».

Флаг -i заставляет Expect интерактивно запрашивать команды, а не читать их из файла. Вызов прерывается с помощью команды exit или EOF. Флаг -i предполагается, если не используется ни командный файл, ни -c. При использовании Expectk эта опция указывается как -интерактивная.

- может использоваться для ограничения конца опций. Это полезно, если вы хотите передать параметр-подобный аргумент в свой скрипт, не интерпретируя его. Это удобно использовать в #! чтобы предотвратить любую флаговую интерпретацию Expect. Например, следующее будет содержать исходные аргументы, включая имя сценария в переменной ARGV .

#! / usr / local / bin / expect -

Обратите внимание, что при добавлении аргументов в #! Необходимо соблюдать обычные соглашения getopt (3) и execve (2). линия.

Файл $ exp_library / expect.rc автоматически загружается, если присутствует, если не используется флаг -N. (При использовании Expectk эта опция указывается как -NORC.) Сразу после этого файл ~ / .expect.rc получается автоматически, если не используется флаг -n. Если определена переменная среды DOTDIR, она рассматривается как каталог, и от нее считывается .expect.rc. При использовании Expectk эта опция указывается как -norc.Этот поиск происходит только после выполнения каких-либо флагов -c.

-v вызывает Ожидание печати номера версии и выхода. Соответствующий флаг в Expectk, который использует длинные имена флагов, является -version.

Дополнительные аргументы строятся в списке и сохраняются в переменной argv и. argc инициализируется длиной argv.

Argv0 определяется как имя скрипта или двоичного файла, если скрипт не используется. Например, следующее выдает имя сценария и первые три аргумента:

send_user "$ argv0 lrange $ argv 0 2 n"

команды

Expect использует командный язык инструмента. Tcl обеспечивает поток управления (если, для, разрыв), оценку выражения и несколько других функций, таких как рекурсия и определение процедуры. Команды, используемые здесь, но не определенные (set, if, exec), являются командами Tcl. Ожидание поддерживает дополнительные команды. Если не указано иное, команды возвращают пустую строку.

Команды перечислены в алфавитном порядке, чтобы их можно было быстро найти. Тем не менее, новым пользователям может быть проще начать с чтения описаний появления, отправки, ожидания и взаимодействия в этом порядке.

close -slave -onexec 0 | 1 -i spawn_id

закрывает соединение с текущим процессом. Большинство интерактивных программ обнаруживают EOF на их stdin и выходе; таким образом близко обычно достаточно, чтобы убить процесс. Флаг -i объявляет процесс закрытием, соответствующим названию spawn_id.

И ожидание, и взаимодействие обнаруживают, когда текущий процесс выходит и неявно завершает работу, но если вы убьете процесс, скажем, «exec kill $ pid», вам нужно явно закрыть.

Флаг -onexec определяет, закрыт ли идентификатор спава в любых новых обработанных процессах или если процесс наложен. Чтобы оставить открытый идентификатор нереста, используйте значение 0. Значение, отличное от нуля, заставляет заклинание закрываться в любых новых процессах.

Флаг -slave закрывает ведомый, связанный с идентификатором spawn. Когда соединение закрыто, ведомое устройство также автоматически закрывается, если оно все еще открыто.

Независимо от того, закрыто ли соединение неявно или явно, вы должны вызвать wait, чтобы очистить соответствующий слот процесса ядра. Команда close не вызывает wait, поскольку нет гарантии, что закрытие соединения процесса приведет к ее завершению.

debug -now 0 | 1

управляет отладчиком Tcl, позволяющим вам выполнять инструкции и устанавливать контрольные точки.

Без аргументов возвращается 1, если отладчик не запущен, иначе возвращается 0.

С 1 аргументом отладчик запущен. С аргументом 0 отладчик остановлен. Если одному аргументу предшествует флаг «now», отладчик запускается немедленно. В противном случае отладчик запускается со следующего оператора Tcl.

Команда debug не изменяет никаких ловушек. Сравните это с запуском Expect с флагом -D.

Команда disconnect отключает разветвленный процесс с терминала. Он продолжает работать в фоновом режиме. Процесс получает свою собственную группу процессов. Стандартный ввод-вывод перенаправляется на / dev / null.

Следующий фрагмент использует disconnect для продолжения работы сценария в фоновом режиме.

если {fork! = 0} выйти из разъединения. , ,

Следующий скрипт считывает пароль, а затем запускает программу каждый час, требующий пароля при каждом запуске. Сценарий предоставляет пароль, поэтому вам нужно только ввести его один раз.

send_user "password? " expect_user -re "(. *) n" for {} 1 {} {if {fork! = 0} {sleep 3600; continue} disconnect spawn priv_prog ожидать Пароль: отправить «$ expect_out ( 1, строка) r ". , , выход }

Преимущество использования разъединения над асинхронным процессом оболочки (&) заключается в том, что Expect может сохранять параметры терминала перед отключением, а затем применять их к новым ptys. С помощью &, Expect не имеет возможности считывать параметры терминала, так как терминал уже отключен к тому времени, когда Expect получит управление.

exit -opts status

вызывает Ожидание выхода или иным образом подготовиться к этому.

-onexit флаг заставляет следующий аргумент использоваться в качестве обработчика выхода. Без аргумента возвращается текущий обработчик.

-выхода нет флаг вызывает ожидать чтобы подготовиться к выходу, но не прекратить фактически возвращать управление операционной системе. Выполняется пользовательский обработчик выходных событий, а также собственные внутренние обработчики Expect. Никакие команды Expect не должны выполняться. Это полезно, если вы используете Expect с другими расширениями Tcl. Текущий интерпретатор (и главное окно, если в среде Tk) остается таким, чтобы другие расширения Tcl могли очищаться. Если Expect's выход (но это может произойти), обработчики не повторяются.

При выходе все соединения с порожденными процессами закрываются. Закрытие будет определяться как EOF по порождаемым процессам. выход не предпринимает никаких других действий, кроме того, что делает обычная процедура _exit (2). Таким образом, порожденные процессы, которые не проверяют EOF, могут продолжать работать. (Для определения, например, того, какие сигналы будет отправлен процесс, важны различные условия, но они зависят от системы, обычно документируются в разделе exit (3).) Инициированные процессы, которые продолжают выполняться, будут наследоваться init.

статус (или 0, если не указано) возвращается как статус выхода ожидать . выход неявно выполняется, если достигнут конец скрипта.

exp_continue -continue_timer

Команда exp_continue позволяет ожидать чтобы продолжать выполнять, а не возвращаться, как обычно. По умолчанию exp_continue сбрасывает таймер тайм-аута. -continue_timer флаг предотвращает перезапуск таймера. (Увидеть ожидать для дополнительной информации.)

Значение exp_internal -f file

вызывает дальнейшие команды для отправки диагностической информации, ожидать на stderr, если значение отлична от нуля. Этот выход отключается, если значение 0. Диагностическая информация включает в себя все полученные символы и каждую попытку, соответствующую совпадению текущего вывода с шаблонами.

Если дополнительный файл , все нормальный и отладочный вывод записывается в этот файл (независимо от значения значение ). Любой предыдущий диагностический выходной файл закрыт.

-Информация flag заставляет exp_internal возвращать описание последних неинформационных аргументов.

exp_open args -i spawn_id

возвращает идентификатор файла Tcl, который соответствует исходному идентификатору spawn. Идентификатор файла может быть использован так, как если бы он был открыт Tcl открыть команда. (Идентификатор spawn больше не должен использоваться. Подождите не должно выполняться.

-leaveopen флаг оставляет идентификатор spawn открытым для доступа через команды Expect. Подождите должен выполняться на идентификаторе spawn.

exp_pid -i spawn_id

возвращает идентификатор процесса, соответствующий текущему порожденному процессу. Если используется флаг, возвращаемый pid соответствует значению данного идентификатора spawn.

exp_send

является псевдонимом для Отправить .

exp_send_error

является псевдонимом для SEND_ERROR .

exp_send_log

является псевдонимом для send_log .

exp_send_tty

является псевдонимом для send_tty .

exp_send_user

является псевдонимом для send_user .

exp_version -exit версия

полезно для обеспечения совместимости сценария с текущей версией Expect.

Без аргументов текущая версия ожидать возвращается. Затем эта версия может быть закодирована в вашем скрипте. Если вы действительно знаете, что не используете функции последних версий, вы можете указать более раннюю версию.

Версии состоят из трех чисел, разделенных точками. Первое - это главное число. Сценарии, написанные для версий ожидать с другим значительным числом почти наверняка не сработает. exp_version возвращает ошибку, если основные номера не совпадают.

Второе - младшее. Сценарии, написанные для версии с меньшим номером, чем текущая версия, могут зависеть от некоторой новой функции и могут не работать. exp_version возвращает ошибку, если основные номера совпадают, но младший номер скрипта больше, чем номер запуска ожидать .

Третье - это число, которое не играет роли в сравнении версий. Тем не менее, он увеличивается, когда ожидать распространение программного обеспечения каким-либо образом изменяется, например, путем дополнительной документации или оптимизации. Сбрасывается на 0 при каждой новой младшей версии.

С -выход флаг, ожидать выводит сообщение об ошибке и выходит, если версия устарела.

ожидание -opts pat1 body1 … -opts patn bodyn

до тех пор, пока один из шаблонов не будет соответствовать выходному процессу, порожденному процессом, указанному периоду времени или просмотру конца файла. Если конечное тело пустое, оно может быть опущено.

Шаблоны из самых последних expect_before команда неявно используется перед любыми другими шаблонами. Шаблоны из самых последних expect_after команда неявно используется после любых других шаблонов.

Если аргументы для всего ожидать оператор требует более одной строки, все аргументы могут быть «привязаны» к одному, чтобы избежать завершения каждой строки с обратной косой чертой. В этом случае обычные подстановки Tcl будут иметь место, несмотря на фигурные скобки.

Если шаблон является ключевым словом ВФ , соответствующее тело выполняется по окончании файла. Если шаблон является ключевым словом Тайм-аут , соответствующий орган выполняется с таймаутом. Если ключевое слово timeout не используется, при тайм-ауте выполняется неявное действие null. Период ожидания по умолчанию составляет 10 секунд, но может быть установлен, например, до 30, командой «установить таймаут 30». Неограниченное время ожидания может быть обозначено значением -1. Если шаблон является ключевым словом дефолт , соответствующий орган выполняется либо по таймауту, либо по окончанию файла.

Если шаблон совпадает, выполняется соответствующий орган. ожидать возвращает результат тела (или пустую строку, если не соответствует шаблону). Если совпадение нескольких шаблонов, первое, что появляется, используется для выбора тела.

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

Шаблоны задаются тремя способами. По умолчанию шаблоны задаются как с Tcl совпадение строк команда. (Такие шаблоны также похожи на регулярные выражения C-shell, обычно называемые шаблонами «glob»). -gl флаг может использоваться для защиты шаблонов, которые в противном случае могли бы совпадать ожидать флаги от этого. Любой шаблон, начинающийся с символа «-», должен быть защищен таким образом. (Все строки, начинающиеся с «-», зарезервированы для будущих опций.)

Например, следующий фрагмент ищет успешный логин. (Обратите внимание, что выкинуть предполагается, что это процедура, определенная в другом месте сценария.)

ожидать {busy {puts busy n; exp_continue} не удалось прервать «неверный пароль» прервать таймаут отключен подключен}

Котировки необходимы для четвертого шаблона, поскольку в нем содержится пробел, который в противном случае отделял бы шаблон от действия.Шаблоны с тем же действием (например, 3-й и 4-й) требуют повторного включения действий. Этого можно избежать, используя шаблоны в стиле regexp (см. Ниже). Более подробную информацию о формировании шаблонов в стиле глобуса можно найти в руководстве Tcl.

Шаблоны в стиле Regexp следуют синтаксису, определенному Tcl регулярное выражение (сокращение от команды «регулярное выражение»). шаблоны регулярных выражений вводятся с флагом -re , Предыдущий пример можно переписать с помощью регулярного выражения как:

ожидать {busy {puts busy n; exp_continue} -re "failed | недействительный пароль" прервать таймаут отключен}

Оба типа шаблонов являются «незакрепленными». Это означает, что шаблоны не должны совпадать со всей строкой, но могут начинаться и заканчиваться совпадением в любом месте строки (пока все остальные совпадают). Используйте ^, чтобы соответствовать началу строки, и $, чтобы соответствовать концу. Обратите внимание: если вы не дожидаетесь конца строки, ваши ответы могут легко оказаться в середине строки, поскольку они отражены от созданного процесса. Пока вы получаете правильные результаты, выход может выглядеть неестественно. Таким образом, рекомендуется использовать $, если вы можете точно описать символы в конце строки.

Обратите внимание, что во многих редакторах ^ и $ соответствуют началу и концу строк соответственно. Однако, поскольку функция ожидания не ориентирована на линию, эти символы соответствуют началу и концу данных (в отличие от строк), которые в настоящее время находятся в буфере соответствия ожидания. (Также см. Примечание ниже «Системное расстройство желудка»).

-ex флаг заставляет шаблон сопоставляться как «точная» строка. Никакой интерпретации *, ^ и т. Д. Не производится (хотя обычные соглашения Tcl все равно должны соблюдаться). Точные шаблоны всегда не отображаются.

-nocase флаг заставляет прописные символы вывода сравнивать, как если бы они были строчными буквами. Шаблон не влияет.

При чтении вывода более 2000 байт могут заставить «забыть» более ранние байты. Это можно изменить с помощью функции match_max , (Обратите внимание, что чрезмерно большие значения могут замедлить совпадение шаблона.) Если patlist является full_buffer , соответствующий орган выполняется, если match_max байты были получены, и никакие другие шаблоны не совпали. Независимо от того, full_buffer ключевое слово используется, забытые символы записываются в expect_out (buffer).

Если patlist это ключевое слово ноль , и нули разрешены (через remove_nulls команда), соответствующий орган выполняется, если согласован один ASCII 0. Невозможно сопоставить 0 байтов с помощью шаблонов glob или regexp.

После сопоставления шаблона (или eof или full_buffer) любой сопоставленный и ранее непревзойденный результат сохраняется в переменной expect_out (буфер) , До 9 матчей подстроки regexp сохраняются в переменных expect_out (1, строка) через expect_out (9, строка) , Если -indices флаг используется перед шаблоном, начальный и конечный индексы (в форме, подходящей для lrange ) из 10 строк сохраняются в переменных expect_out (Х, начало) а также expect_out (Х, конец) где X - это цифра, соответствует позиции подстроки в буфере. 0 относится к строкам, которые соответствуют всему шаблону и генерируются для шаблонов глобуса, а также шаблонов регулярных выражений. Например, если процесс выдал вывод «abcdefgh n», результат:

ожидать "cd"

как если бы выполнялись следующие утверждения:

set expect_out (0, строка) cd set expect_out (buffer) abcd

и «efgh n» остается в выходном буфере. Если процесс выдал результат «abbbcabkkkka n», результат:

expect -indices -re "b (b *). * (k +)"

как если бы выполнялись следующие утверждения:

set expect_out (0, старт) 1 комплект ожидающий_out (0, конец) 10 комплект ожидание_out (0, строка) bbbcabkkkk комплект ожидание_out (1, старт) 2 комплект ожидание_out (1, конец) 3 комплект ожидается_out (1, string) bb set ожидается_выход (2, start) 10 set expect_out (2, конец) 10 set expect_out (2, строка) k set expect_out (buffer) abbbcabkkkk

и «a n» остается в выходном буфере. Шаблон «*» (и -re ». *») Очистит выходной буфер, не считывая больше результатов процесса.

Как правило, согласованный вывод отбрасывается из внутренних буферов Expect. Это может быть предотвращено путем префикса шаблона с помощью -notransfer флаг. Этот флаг особенно полезен при экспериментировании (и может быть сокращен до «-not» для удобства при экспериментировании).

Идентификатор спава, связанный с соответствующим результатом (или eof или full_buffer), сохраняется в expect_out (spawn_id) .

-timeout flag заставляет текущую команду ожидать использовать следующее значение в качестве тайм-аута вместо использования значения переменной тайм-аута.

По умолчанию шаблоны сопоставляются с результатами текущего процесса, однако flag объявляет, что результат из указанного списка spawn_id сопоставляется с любыми следующими шаблонами (до следующего ). Список spawn_id должен быть либо разделенным пробелами списком spawn_ids, либо переменной, ссылающейся на такой список spawn_ids.

Например, следующий пример ждет «подключен» к текущему процессу, или «занят», «неудачен» или «неверный пароль» из spawn_id, названного $ proc2.

ожидать {-i $ proc2 busy {puts busy n; exp_continue} -re "failed | недействительный пароль" прервать таймаут отключен}

Значение глобальной переменной any_spawn_id может использоваться для сопоставления шаблонов с любыми именами spawn_id, которые называются со всеми другими флаги в текущем ожидать команда. Спав_ид из флаг без связанного шаблона (т. е. немедленно следуют другой ) становится доступным для любых других шаблонов в одном и том же ожидать команда, связанная с any_spawn_id.

flag также может указывать глобальную переменную, и в этом случае переменная считывается для списка идентификаторов нереста. Переменная перечитывается всякий раз, когда она изменяется. Это обеспечивает способ изменения источника ввода-вывода во время выполнения команды. Икры-икры, предоставленные таким образом, называются «косвенными» икру.

Такие действия, как перерыв а также Продолжить вызывают управляющие структуры (то есть, за , процедура ) вести себя обычным способом. Команда exp_continue позволяет ожидать чтобы продолжать выполнять, а не возвращаться, как обычно.

Это полезно для избежания явных циклов или повторных ожидающих операторов. Следующий пример является частью фрагмента для автоматизации rlogin. exp_continue избегает необходимости писать вторую ожидать (снова искать приглашение), если rlogin запрашивает пароль.

ожидать {Пароль: {stty -echo send_user пароль (для $ user) в $ host: "expect_user -re" (. *) n "send_user" n "отправить" $ expect_out (1, string) r "stty echo exp_continue} неверный {send_user "неверный пароль или учетная запись n" exit} timeout {send_user "подключение к $ host time out n" exit} eof {send_user "подключение к хосту не выполнено: $ expect_out (buffer)" exit} - re $ prompt}

Например, следующий фрагмент может помочь пользователю управлять взаимодействием, которое уже полностью автоматизировано. В этом случае терминал вводится в сырой режим. Если пользователь нажимает «+», переменная увеличивается. Если нажать «p», в процесс будет отправлено несколько возвратов, возможно, что-то вытолкнуть их, а «i» позволит пользователю взаимодействовать с процессом, эффективно убрав управление из сценария. В каждом случае exp_continue позволяет ожидать для продолжения сопоставления шаблонов после выполнения текущего действия.

stty raw -echo expect_after {-i $ user_spawn_id "p" {отправить " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {взаимодействовать; exp_continue} Выход «выйти»}

По умолчанию, exp_continue сбрасывает таймер тайм-аута. Таймер не перезапускается, если exp_continue вызывается с помощью -continue_timer флаг.

expect_after expect_args

работает идентично expect_before за исключением того, что если шаблоны из обоих ожидать а также expect_after может совпадать, ожидать образец используется. См. expect_before для получения дополнительной информации.

expect_background expect_args

принимает те же аргументы, что иожидать , однако он немедленно возвращается. Шаблоны проверяются всякий раз, когда приходит новый вход. ШаблонТайм-аут а такжедефолт не имеют смыслаexpect_background и молча отбрасываются. В противном случаеexpect_background команда используетexpect_before а такжеexpect_after шаблоны, какожидать делает.

когдаexpect_background действия оцениваются, фоновая обработка для одного и того же идентификатора спава блокируется. Фоновая обработка разблокируется, когда действие завершается. В то время как фоновая обработка заблокирована, возможно сделать (переднем плане)ожидать на том же идентификаторе спава.

Невозможно выполнитьожидать в то время какexpect_background разблокирован.expect_background для конкретного идентификатора spawn удаляется путем объявления нового объекта expect_background с тем же идентификатором spawn. декларированиеexpect_background без шаблона удаляет данный идентификатор спава из способности сопоставлять шаблоны в фоновом режиме.

expect_before expect_args

принимает те же аргументы, что иожидать , однако он немедленно возвращается. Паттерн-действие пар из последнихexpect_before с тем же идентификатором нереста неявно добавляются к следующемуожидать команды. Если шаблон совпадает, он обрабатывается так, как если бы он был указан вожидать сама команда, и связанное с ней тело выполняется в контекстеожидать команда. Если шаблоны из обоихexpect_before а такжеожидать может совпадать,expect_before образец используется.

Если шаблон не указан, идентификатор spawn не проверяется на наличие каких-либо шаблонов.

Если это не отменено флаг,expect_before шаблоны соответствуют идентификатору спава, определенному в то время, когдаexpect_before команда была выполнена (не тогда, когда ее шаблон сопоставлен).

Флаг -info вызываетexpect_before чтобы вернуть текущие спецификации того, какие шаблоны будут соответствовать. По умолчанию он сообщает о текущем идентификаторе спавна. Для получения информации об этом идентификаторе spawn может быть указана дополнительная спецификация idwn idwn. Например

expect_before -info -i $ proc

Может быть задано не более одной спецификации идентификатора спавна. Флаг -indirect подавляет прямые идентификаторы нереста, которые поступают только из косвенных спецификаций.

Вместо спецификации идентификатора spawn флаг «-all» приведет к тому, что «-info» будет сообщать обо всех идентификаторах нереста.

Вывод флага -info может быть повторно использован как аргумент expect_before.

expect_tty expect_args

какожидать но он считывает символы из / dev / tty (т. е. нажатия клавиш от пользователя). По умолчанию чтение выполняется в приготовленном режиме. Таким образом, строки должны заканчиваться возвратом, чтобыожидать видеть их. Это может быть изменено посредствомЗапущенная (см.Запущенная команда ниже).

expect_user expect_args

какожидать но он читает символы из stdin (т. е. нажатия клавиш от пользователя). По умолчанию чтение выполняется в приготовленном режиме. Таким образом, строки должны заканчиваться возвратом, чтобыожидать видеть их.Это может быть изменено посредствомЗапущенная (см.Запущенная команда ниже).

вилка

создает новый процесс. Новый процесс является точной копией текущейожидать процесс. Что касается успеха,вилка возвращает 0 в новый (дочерний) процесс и возвращает идентификатор процесса дочернего процесса в родительский процесс. При сбое (неизменно из-за нехватки ресурсов, например, пространства подкачки, памяти),вилка возвращает -1 в родительский процесс, и никакой дочерний процесс не создается.

Выключенные процессы выходят черезвыход как и исходный процесс. Обработанным процессам разрешается записывать в файлы журнала. Если вы не отключите отладку или протоколирование в большинстве процессов, результат может сбить с толку.

Некоторые реализации pty могут быть смущены несколькими читателями и писателями, даже на мгновение. Таким образом,вилка перед нерестовыми процессами.

взаимодействовать string1 body1 … stringn bodyn

дает управление текущему процессу пользователю, так что нажатия клавиш посылаются текущему процессу и возвращаются stdout и stderr текущего процесса.

Партии «тело-тело» могут быть указаны как аргументы, и в этом случае тело выполняется при вводе соответствующей строки. (По умолчанию строка не отправляется текущему процессу.)переводчик команда считается, если последний элемент отсутствует.

Если аргументы для всеговзаимодействовать оператор требует более одной строки, все аргументы могут быть «привязаны» к одному, чтобы избежать завершения каждой строки с обратной косой чертой. В этом случае обычные подстановки Tcl будут иметь место, несмотря на фигурные скобки.

Например, следующие запуски команд взаимодействуют со следующими парами строкового тела: Когда нажата кнопка ^ Z,ожидать приостановлено. (The-сброс флаг восстанавливает режимы терминала.) Когда ^ A нажата, пользователь видит «вы набрали элемент управления-A», и процесс отправляется a ^ A. Когда $ нажата, пользователь видит дату. Когда нажата кнопка ^ C,ожидать выходы. Если введено «foo», пользователь видит «бар». Когда ~~ нажата,ожидать интерпретатор работает интерактивно.

set CTRLZ 032 взаимодействовать {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "вы набрали элемент управления-A n"; Отправить " 001"} $ {send_user "Дата формат часов часы секунд."} 003 exit foo {send_user "bar"} ~~}

В парах строковых тел строки сопоставляются в том порядке, в котором они перечислены в качестве аргументов. Строки, которые частично совпадают, не отправляются в текущий процесс в ожидании остатка. Если символы вводятся таким образом, что больше не может быть соответствия, только часть строки будет отправлена ​​в процесс, который не может начать другой матч. Таким образом, строки, которые являются подстроками частичных совпадений, могут совпадать позже, если исходные строки, которые пытались совпасть, в конечном итоге терпят неудачу.

По умолчанию сопоставление строк является точным без каких-либо диких карт. (Напротив,ожидать команда использует шаблоны стиля glob по умолчанию.)-ex флаг может использоваться для защиты шаблонов, которые в противном случае могли бы соответствоватьвзаимодействовать флаги от этого. Любой шаблон, начинающийся с символа «-», должен быть защищен таким образом. (Все строки, начинающиеся с «-», зарезервированы для будущих опций.)

-re флаг заставляет строку интерпретироваться как шаблон стиля в регулярном выражении. В этом случае соответствующие подстроки сохраняются в переменной interact_out аналогичноожидать сохраняет свой результат в переменнойexpect_out ,-indices Аналогично поддерживается флаг.

ШаблонВФ вводит действие, выполняемое по окончании файла. ОтдельныйВФ шаблон может также следовать-выход флаг, в этом случае он сопоставляется, если во время записи выводится eof. По умолчаниюВФ действие - это «возврат», так чтовзаимодействовать просто возвращается на любой EOF.

ШаблонТайм-аут вводит тайм-аут (в секундах) и действие, которое выполняется после того, как никакие символы не были прочитаны в течение заданного времени.Тайм-аут шаблон применяется к самому последнему заданному процессу. Тайм-аут по умолчанию отсутствует. Специальная переменная «тайм-аут» (используетсяожидать команда) не влияет на этот таймаут.

Например, следующий оператор может использоваться для автообнаружения пользователей, которые не набрали ничего в течение часа, но которые все еще получают частые системные сообщения:

interactive -input $ user_spawn_id timeout 3600 return -output $ spawn_id

Если шаблон является ключевым словомноль , и нули разрешены (черезremove_nulls команда), соответствующий орган выполняется, если согласован один ASCII 0. Невозможно сопоставить 0 байтов с помощью шаблонов glob или regexp.

Предварительная обработка шаблона с помощью флага-я пишу вызывает переменную interact_out (spawn_id) для установки на spawn_id, который соответствует шаблону (или eof).

Такие действия, какперерыв а такжеПродолжить вызывают управляющие структуры (то есть,за , процедура ) вести себя обычным способом. тем не мениевернуть вызывает взаимодействие, чтобы вернуться к вызывающей стороне, тогда какinter_return причинывзаимодействовать чтобы вызвать возврат в своем вызывающем абоненте. Например, если «proc foo»взаимодействовать который затем выполнил действиеinter_return , proc foo вернется. (Это означает, что есливзаимодействовать звонкипереводчик интерактивный ввод текставернуть приведет к продолжению взаимодействия, в то время какinter_return приведет к тому, что взаимодействие вернется к вызывающему абоненту.)

В течениевзаимодействовать , режим raw используется так, чтобы все символы могли быть переданы текущему процессу.Если текущий процесс не поймает сигналы управления работой, он будет остановлен, если будет отправлен сигнал останова (по умолчанию ^ Z). Чтобы перезапустить его, отправьте сигнал продолжения (например, «kill -CONT»). Если вы действительно хотите отправить SIGSTOP на такой процесс (через ^ Z), сначала попробуйте сначала создать csh, а затем запустите свою программу. С другой стороны, если вы хотите отправить SIGSTOP вожидать сам, интерпретатор первого вызова (возможно, используя escape-символ), а затем нажмите ^ Z.

Партии String-body можно использовать как сокращенную форму, чтобы избежать необходимости вводить интерпретатор и выполнять команды в интерактивном режиме. Предыдущий режим терминала используется, когда тело пары «тело-тело» выполняется.

Для скорости действия выполняются в необработанном режиме по умолчанию.-сброс флаг сбрасывает те