Линук / Уник наредба очекује

Очекује се програм који говори о другим интерактивним програмима према сценарију. Након сценарија, Екпецт зна шта се од програма може очекивати и какав би требао бити одговарајући одговор. Тумачени језик обезбеђује структуре контроле развода и структуре на високом нивоу за усмеравање дијалога. Осим тога, корисник може преузети контролу и интеракцију директно када то жели, након чега се враћа контрола на скрипту.

Екпецтк је мешавина Екпецт и Тк. Понаша се исто као жеља Очекивања и Тк. Екпецт се такође може користити директно у Ц или Ц ++ без Тцл.

Име "Екпецт" потиче од идеје о слању / оћекивању секвенци које популаризују ууцп, кермит и други програми за контролу модема. Међутим, за разлику од УУЦП-а, Екпецт је генерализован тако да се може покренути као кориснички ниво са било којим програмом и задацима. Очекује се да може разговарати са неколико програма истовремено.

Шта очекујете

На пример, ево неких ствари које команда оцеку мозе да уради:

Постоји много разлога зашто схелл не може извршити ове задатке. Све су могуће са Екпецт.

Генерално, Екпецт је корисно за покретање било ког програма који захтева интеракцију између програма и корисника. Све што је неопходно је да се интеракција може окарактерисати програмски. Очекује се да може и повратити контролу кориснику без заустављања програма који се контролише. Слично томе, корисник може вратити контролу у скрипту у било ком тренутку.

Употреба

Очекује читање цмдфилеа за листу команди за извршавање. Очекивање се може имплицитно позивати на системе који подржавају #! нотацију маркирањем сценарија као извршне и прављење прве линије у скрипти:

#! / уср / лоцал / бин / екпецт -ф

Наравно, пут мора прецизно описати где се очекује живи. / уср / лоцал / бин је само пример.

Застава -ц претставља команду која се извршава пре било ког у скрипти. Команду треба цитирати како би се спречило разбијање гранате. Ова опција се може користити више пута. Вишеструке команде могу се извршити са једним-ц тако што их раздваја са тачкама и тачкама. Команде се извршавају по редоследу који се појављују. Када користите Екпецтк, ова опција је наведена као -цомманд.

Застава -д омогућава одређени дијагностички излаз, који првенствено приказује унутрашњу активност команди као што су очекивани и интерактивни. Ова застава има исти ефекат као "екп_интернал 1" на почетку Екпецт скрипта, а штампана је и верзија Екпецт.

Застава -Д омогућава интерактивни дебагер. Треба да следи цела вредност. Дебуггер ће преузети контролу пре следеће процедуре Тцл ако је вредност нула или ако притиснете ^ Ц или је прекинута тачку или се у скрипту појављује друга одговарајућа команда за отклањање грешака. Када користите Екпецтк, ова опција је наведена као - Дебуг.

Застава -ф претвара датотеку из које чита команде. Сама застава је опциона јер је корисна само ако користите #! тако да се у командној линији могу набавити и други аргументи. Када користите Екпецтк, ова опција је специфицирана као -филе.

Подразумевано, командна датотека се чита у меморију и извршава у целини. Повремено је пожељно читати датотеке једне линије у исто вријеме. Да бисте применили произвољне фајлове са којима се поступа на овај начин, користите ознаку -б. Када користите Екпецтк, ова опција је наведена као -буффер.

Ако је стринг "-" испоручен као име датотеке, уместо тога се чита стандардни улаз. Користите "./-" за читање из датотеке која је заправо назива "-".

Застава -и узрокује очекивање да интерактивно затраже команде уместо да их читате из датотеке. Пажња се прекида путем команде за излаз или на ЕОФ-у. За -и застава се претпоставља ако се не користи командна датотека нити -ц. Када користите Екпецтк, ова опција је означена као -интерактивна.

- може се користити за ограничавање краја опција. Ово је корисно ако желите да прођете аргумент који се односи на опцију у вашу скрипту, а да га не тумачи Екпецт. Ово се може корисно ставити у #! линија како би се спријечило било какво тумачење попут Екпецт. На пример, следеће ће оставити изворне аргументе укључујући назив скрипте у варијабли аргв .

#! / уср / лоцал / бин / екпецт -

Имајте на уму да се уобичајене гетопт (3) и екецве (2) конвенције морају поштовати приликом додавања аргумената на #! лине.

Датотека $ екп_либрари / екпецт.рц се добија аутоматски ако је присутна, осим ако се користи ознака -Н. (Када користите Екпецтк, ова опција је назначена као -НОРЦ.) Одмах после тога, датотека ~ / .екпецт.рц се аутоматски добија, осим ако се не користи ознака -н. Ако је дефинирана променљива окружења ДОТДИР, она се третира као директориј и од ње се чита .екпецт.рц. Када користите Екпецтк, ова опција је наведена као -норц. Овај извор се јавља тек након извршења било којих -ц заставица.

-в узроци Очекујте да одштампате свој број верзије и изађите. Одговарајућа застава у Екпецтк, која користи имена дуга заставице, је -версион.

Опциони аргументи су конструисани у листу и смештени у варијаблу названа аргв и. аргц је иницијализован у дужини аргв.

Аргв0 је дефинисан као име сценарија или бинарног ако се не користи скрипта. На пример, следеће одштампа име скрипте и прве три аргументе:

сенд_усер "$ аргв0 [лангреј $ аргв 0 2] \ н"

Команде

Екпецт користи језик команде алата. Тцл обезбеђује контролни проток (ако, за, паузу), евалуацију израза и неколико других функција, као што је рекурзија и дефиниција процедуре. Команде које се овде користе, али нису дефинисане (сет, ако, екец) су Тцл наредбе. Екпецт подржава додатне команде. Ако није другачије назначено, команде враћају празан низ.

Команде су наведене по абецедном реду тако да се могу брзо лоцирати. Међутим, новим корисницима ће бити лакше почети читањем описа мамаца, слања, очекивања и интеракције у том редоследу.

затвори [-славе] [-онекец 0 | 1] [-и спавн_ид]

затвара везу са тренутним процесом . Већина интерактивних програма ће открити ЕОФ на њиховом стдину и излазу; Због тога је обично довољно да се убије процес . Застава -и декларише процес затварања који одговара именованом спавн_ид.

И очекивање и интеракција ће открити када тренутни процес излази и имплицитно заврши, али ако убијете процес , рецимо, "изврши убијање $ пид-а", морате експлицитно затражити затвори .

Застава -онекец одређује да ли је ид спавн-а затворен у било којем новом процесу или ако је процес прекривен. Да бисте отворили отворени извор, користите вредност 0. Нулта вриједност цијеле вриједности доводи до затварања у сваком новом процесу.

Застава -славе затвара робовласник повезан са ИД-ом спавн-а. Када је веза затворена, робот се аутоматски затвара, ако је и даље отворен.

Без обзира да ли је веза затворена имплицитно или експлицитно, требало би да позовете чекање да бисте избрисали одговарајући слот процесног језгра. Команда за затварање не позива чекање, јер нема гаранције да ће затварање процесне везе проузроковати излазак.

дебуг [[-нов] 0 | 1]

контролише Тцл дебуггер који вам омогућава да коригујете изјаве и поставите тачке прекида.

Без аргумената, 1 се враћа ако дебуггер не ради, иначе се враћа 0.

Са 1 аргументом, дебуггер је започео. Са аргументом 0, дебуггер је заустављен. Ако 1 аргументу претходи ознака -нов, дебуггер се покреће одмах. Иначе, дебуггер се започиње са следећом Тцл изразом.

Команда за дебаг не мења никакве замке. Упоредите то да започнете Екпецт са ознаком -Д.

Команда за прекидање искључује процес одвајања са терминала . Наставља се у позадини. Процесу се даје сопствена процесна група. Стандардни И / О се преусмерава на / дев / нулл .

Следећи фрагмент користи дисконект за наставак покретања скрипте у позадини.

ако {[форк]! = 0} искључите излаз. . .

Следећи скрипта чита лозинку и затим покреће програм сваког сата који захтева лозинку сваки пут када се покрене. Скрипта испоручује лозинку тако да је морате једном укуцати.

сенд_усер "лозинка? \" екпецт_усер -ре "(. *) \ н" за {} 1 {} {ако {[форк]! = 0} {спавање 3600; настави} искључи спавн прив_прог очекује Лозинка: пошаљи "$ екпецт_оут 1, стринг) \ р ". . . излаз}

Предност кориштења искључивања преко функције асинхроног процеса (&) схелл-а је да Екпецт може сачувати параметре терминала прије одвојења и касније их примијенити на нове птис. Са &, Екпецт нема шансе да прочита параметре терминала пошто је терминал већ искључен до тренутка када Екпецт прима контролу.

излаз [-оптс] [статус]

узрокује излазак или се на други начин припреми за то.

Застита -онкит узрокује да се следећи аргумент користи као излазни руковалац. Без аргумента, тренутни управљачки програм за излаз се враћа.

Непозната застава изазива очекивање да се припреми за излазак, али не престане са повратком контроле у ​​оперативни систем. Покреће се кориснички дефинисан излазни управљач као и сопствени интерни корисници Екпецт-а. Нема даљњих команди Екпецт треба извршити. Ово је корисно ако користите Екпецт са другим Тцл екстензијама. Тренутни тумач (и главни прозор ако је у Тк окружењу) остају тако да се остали Тцл екстензији могу очистити. Ако се Екпецтов излаз поново позове (иако се то може догодити), нећете се поновити.

Након изласка, све везе са покренутим процесима су затворене. Затварање ће бити откривено као ЕОФ по порастим процесима. излаз не предузима никакве друге акције изван нормалне процедуре _екит (2). Стога, процеси који не провјеравају ЕОФ могу и даље покренути. (Различити услови су важни за одређивање, на примјер, који сигнали ће бити послани процес, али они су системски зависни, обично документовани под излазом (3).) Постројени процеси који се настављају покренути ће бити наслеђени инитом.

статус (или 0 ако није наведен) се враћа као статус излаза Екпецт . излаз се имплицитно извршава ако се достигне крај скрипте.

екп_цонтинуе [-цонтинуе_тимер]
Команда екп_цонтинуе дозвољава да очекује да настави да се извршава, а не да се враћа, како то нормално. Подразумевано екп_цонтинуе ресетује тајмер тајмера. Застава -цонтинуе_тимер спречава поновно покретање тајмера. (Погледајте очекивати више информација.)

екп_интернал [-ф ​​филе] вредност
узрокује даље команде да шаљу дијагностичке информације унутарње да очекују стдерр ако је вредност нула. Овај излаз је онемогућен ако је вредност 0. Дијагностичке информације укључују сваки примљени карактер и сваки покушај да се подударају са тренутним излазом у односу на обрасце.

Ако је испоручена опционална датотека , све обичне и дебуггинг излазе су уписане у ту датотеку (без обзира на вриједност вриједности ). Било која претходна дијагностичка излазна датотека је затворена.

Застава -инфо узрокује екп_интернал да врати опис најновијих аргумената који нису наведени.

екп_опен [аргс] [-и спавн_ид]
враћа идентификатор Тцл фајла који одговара оригиналном ИД-у за спавн. Идентификатор датотеке се затим може користити као да је отвара Тцл-ова отворена команда. (Ид не треба више да се користи. Чекање не треба извршавати.

Застава -леавеопен оставља отворени ИД за приступ преко команди Екпецт . Чекање мора бити извршено на ИД-у.

екп_пид [-и спавн_ид]
враћа ид процеса који одговара тренутном процесу. Ако се користи ознака , повратни пид одговара оном датог ИД-а за спавн.

екп_сенд
је псеудоним за слање .

екп_сенд_еррор
је псеудоним за сенд_еррор .

екп_сенд_лог
је псеудоним за сенд_лог .

екп_сенд_тти
је алијас за сенд_тти .

екп_сенд_усер
је псеудоним за сенд_усер .

екп_версион [[-екит] верзија]
корисно је за осигурање да је скрипт компатибилан са тренутном верзијом Екпецт-а.

Без аргумената, враћа се тренутна верзија Екпецт- а. Ова верзија се онда може кодирати у вашој скрипти. Ако заправо знате да не користите функције најновијих верзија, можете одредити старију верзију.

Верзије се састоје од три броја раздвојених тачкама. Први је главни број. Скрипте написане за верзије Екпецт са другим великим бројем готово сигурно неће радити. екп_версион враћа грешку ако се главни бројеви не подударају.

Друго је мали број. Скрипте написане за верзију са већим малим бројем од тренутне верзије могу зависити од неке нове функције и можда неће бити покренута. екп_версион враћа грешку ако се главни бројеви подударају, али мањи број скрипте је већи од оног код Рун Екпецт .

Трећи је број који не учествује у поређењу са верзијом. Међутим, повећава се када се дистрибуција софтвера Екпецт мења на било који начин, на пример помоћу додатне документације или оптимизације. Она се ресетује на 0 по свакој новој мањи верзији.

Уз ознаку -екит, Екпецт отвара грешку и излази ако је верзија застарјела.

очекивати [[-оптс] пат1 боди1] ... [-оптс] патн [бодин]
чека један од образаца који се подударају са извором пораста процеса, одређени временски период је прошао или се види крај датотеке. Ако је завршно тело празно, може се изоставити.

Паттернс из најновије наредбе екпецт_бефоре се имплицитно користе пре било ког другог обрасца. Паттернс из најновије оријентације о наредби_афтер се имплицитно користе након било којих других обрасца.

Ако аргументи за читаву очекивану изјаву захтијевају више од једне линије, сви аргументи могу бити "урезани" у један како би се избјегло окончање сваке линије са косом саксијом. У овом слуцају, уобицајене Тцл замене це се десити упркос запрекама.

Ако је образац кључна реч еоф , одговарајуће тело се извршава на крају датотеке. Ако је образац кључни режим времена , одговарајуће тијело се извршава након истека времена. Ако се не користи кључна реч за прекид времена, имплицитна нулта акција се извршава након истека времена. Подразумевани временски период је 10 секунди, али се може поставити, на пример до 30, командом "сет тимеоут 30". Бесконачан тајмт може бити означен вриједношћу -1. Ако је образац кључна реч дефаулт , одговарајуће тијело се извршава након временског или крајњег фајла.

Ако се образац подудара, онда се извршава одговарајуће тело. очекује враћање резултата тела (или празног низа ако се не подудара с њим). У случају да се више обрасца подудара, онај који се први појављује користи се за одабир тела.

Сваки пут када нови излаз стигне, он се упоређује са сваким образцем у редоследу који су наведени. Дакле, можете тестирати за одсуство меча тако што ћете направити последњи образац нешто гарантовано да се појављује, као што је промпт. У ситуацијама када нема упутства, морате користити временски распоред (као што бисте и ви били, ако сте интерактивни ручно).

Обрасци су наведени на три начина. Подразумевано су обрасци наведени као у Тцл-овој команди стринг матцх . (Такви обрасци су такође слични регуларним изразима Ц-схелл обично названим "глоб"). Застава -гл се може користити за заштиту обрасца који би у противном могли одговарати очекиваним застава од тога. Било који образац који почиње са "-" треба заштитити на овај начин. (Сви стрингови који почињу са "-" резервисани су за будуће опције.)

На пример, следећи фрагмент тражи успјешно пријављивање. (Обратите пажњу на то да се аборт се сматра поступком дефинираним на другом месту у скрипти.)

очекујте {буси {ставља заузето \ н; екп_цонтинуе} није успело прекинути "неважећу лозинку" прекинути прекид временски прекорачења спојен}

Цитати су неопходни на четвртом образцу јер садржи простор, који би иначе одвојио образац из акције. Узорци са истом акцијом (као што су трећи и четврти) захтевају поновно навођење акција. Ово се може избјећи кориштењем шаблона регекп-стиле (види доље). Више информација о формирању глоб стилова можете пронаћи у приручнику Тцл.

Модели Регекп-стиле-а прате синтаксу дефинисану Тцл'с регекп (кратком за "регулар екпрессион") команду. регекп шаблони се уносе са заставом -ре . Претходни пример се може преписати помоћу регекп-а као:

очекујте {буси {ставља заузето \ н; екп_цонтинуе} -ре "неуспјела | неважећа лозинка" прекинут прекид временске везе прекинут повезан}

Обе врсте обрасца су "неисправне". То значи да обрасци не морају да одговарају читавом низу, али могу започети и завршити утакмицу било где у низу (све док се све остало подудара). Користите ^ да се подударају са почетком стринга, а $ да одговара крају. Имајте на уму да, ако не чекате на крај низа, ваши одговори се лако могу завршити у средини низа јер се одражавају из поријеклог процеса. Док још увијек производе исправне резултате, излаз може изгледати неприродно. Стога, кориштење $ подстиче се ако можете тачно описати знакове на крају низа.

Имајте у виду да у многим уредницима, ^ и $ одговарају почетку и крају линија. Међутим, пошто оцекивање није линијско оријентисано, ови знакови одговарају покривању и крају података (за разлику од линија) тренутно у оријентационом баферу. (Такође, погледајте напомену испод о "системској варијацији".)

Застава -ек узрокује да образац буде упарен као "тачан" стринг. Не постоји тумачење *, ^, итд. (Мада се уобичајене Тцл конвенције још увијек морају поштовати). Тачан обрасци су увек неисправни.

Флаг -ноцасе узрокује велике слова излаза да се упореде као да су мала слова. Образац није под утјецајем.

Док читате излаз, више од 2000 бајтова може приморати раније бајтове да буду "заборављени". Ово се може променити с функцијом матцх_мак . (Имајте на уму да прекомерно велике вриједности могу успорити узорковање узорка.) Ако је лист са пописом фулл_буффер , одговарајуће тијело се извршава ако су примљени матцх_мак бајтови и ниједан други образац се не поклапа. Без обзира да ли се користи кључна реч фулл_буффер или не, заборављени знаци су уписани у екпецт_оут (буффер).

Ако је патлист кључна ријеч нулл , а нуллс су дозвољени (преко ремове_нуллс наредбе), одговарајуће тијело се извршава ако се подудара с једним АСЦИИ 0. Није могуће подесити 0 бајтова помоћу глоб или регекп обрасца.

Након усклађивања шаблона (или еоф или фулл_буффер), било који одговарајући и претходно неизмирен излаз се чува у варијабли екпецт_оут (буффер) . До 9 подударања подразумеваних регекп-а се чувају у варијаблама екпецт_оут (1, стринг) кроз екпецт_оут (9, стринг) . Ако се ознака -индицес користи прије шаблона, почетни и завршни индекси (у облику погодном за лењинге ) од 10 жица се чувају у варијаблама екпецт_оут (Кс, старт) и екпецт_оут (Кс, крај) гдје је Кс цифре, одговара позицији супституције у баферу. 0 односи се на низове који су одговарали читавом шаблону и генерисани су за шаблоне глоба као и регекп шаблоне. На пример, ако је процес произвео оутпут из "абцдефгх \ н", резултат је:

очекивати "цд"

је као да су извршене следеће изјаве:

сет екпецт_оут (0, стринг) цд сет екпецт_оут (буффер) абцд

и "ефгх \ н" оставља у излазном баферу. Ако је процес произвео оутпут "абббцабкккка \ н", резултат:

очекивати -индицес -ре "б (б *). * (к +)"

је као да су извршене следеће изјаве:

сет ваит_оут (0, старт) 1 сет екпецт_оут (0, енд) 10 сет екпецт_оут (0, стринг) бб сетуп екпецт_оут (1, стринг) бб сетуп екпецт_оут (2, старт) 10 сет екпецт_оут (2, енд) 10 сет екпецт_оут (2, стринг) к сет екпецт_оут (буффер) абббцабкккк

и "а \ н" је остављено у излазном баферу. Шаблон "*" (и -ре ". *") Ће испразнити излазни бафер без читања више излаза из процеса.

Уобичајено се усклађени излаз одбацује из унутрашњих бафера Екпецт-а. Ово се може спречити префиксом шаблона са ознаком -нотрансфер . Ова застава је нарочито корисна у експериментисању (и може се скратити на "-нот" ради лакшег експериментисања).

Ид спавн повезан са одговарајућим излазом (или еоф или фулл_буффер) је сачуван у екпецт_оут (спавн_ид) .

Застава -тимеоут доводи тренутну команду очекивања да користи сљедећу вриједност као временски распоред уместо да користи вриједност временске варијабле.

Подразумевано, обрасци се подударају са излазом из тренутног процеса, међутим ознака декларише излаз из спавн_ид листе који се подудара са било којим следећим обрасцима (до следећег ). Листа спавн_ид-а би требало да буде или листа са спавн_идом која је одвојена са белим прозором или варијабла која се односи на такву листу спавн_идова.

На пример, следећи пример чека "повезан" са тренутним процесом, или "заузет", "неуспелим" или "неважећом лозинком" из спавн_ида названог $ проц2.

очекујте {-и $ проц2 заузет {ставља заузето \ н; екп_цонтинуе} -ре "неуспјела | неважећа лозинка" прекинут прекид временске везе прекинут повезан}

Вредност глобалне варијабле ани_спавн_ид може се користити за усклађивање образаца са било којим спавн_идима који су именовани са свим другим заставама у тренутној команди очекивања . Спавн_ид са ознаке без повезаног образца (тј. Одмах следи други ) ставља се на располагање било којем другом обрасцу у истој оћекивани наредби која је повезана са било којим_спавн_ид.

Застава може такође назвати глобалну варијаблу, у том случају се варијабла прочита за листу ИД-ова. Варијабла се поново прича кад год се промијени. Ово омогућава начин промјене И / О извора док је команда извршена. Спавн идс под овим путем се називају "индиректни" идр.

Акције као што су прекидање и наставак узрокују структуре контроле (тј. За , проц ) да се понашају на уобичајени начин. Команда екп_цонтинуе дозвољава да очекује да настави да се извршава, а не да се враћа, како то нормално.

Ово је корисно за избегавање експлицитних петљи или поновљених очекиваних изјава. Следећи пример је део фрагмента који аутоматизује рлогин. Екп_цонтинуе избегава да напише другу очекивану изјаву (да поново потражи позив) ако рлогин затражи лозинку.

очекујте {Пассворд: {стти -ецхо сенд_усер "лозинка (за $ усер) на $ хосту:" екпецт_усер -ре "(. *) \ н" сенд_усер "\ н" пошаљи "$ екпецт_оут (1, стринг) \ р" стти ецхо екп_цонтинуе} неисправна {сенд_усер "неважећа лозинка или рачун \ н" екит} веза са временом {сенд_усер "на временски распоред $ хост \ н" екит} еоф {сенд_усер \ "веза са хостом није успела: $ екпецт_оут (буффер)" екит} ре $ промпт}

На пример, следећи фрагмент може помоћи кориснику да води интеракцију која је већ потпуно аутоматизована. У овом случају, терминал се ставља у рав моде. Ако корисник притисне "+", варијабла се увећава. Ако је притиснуто "п", неколико повратака се шаљу у процес, можда да га поквари на неки начин, а "и" омогућава кориснику да интерактује са процесом, ефикасно украде контролу из скрипте. У сваком случају, екп_цонтинуе дозвољава тренутној оријентацији да настави са подударањем узорка након извршења тренутне акције.

стти рав -ецхо екпецт_афтер {-и $ усер_спавн_ид "п" {пошаљи "\ р \ р \ р"; екп_цонтинуе} "+" {инцр фоо; екп_цонтинуе} "и" {интерацт; екп_цонтинуе} "изађи" излаз}

Подразумевано, екп_цонтинуе ресетује тајмер тајмера. Тајмер се не рестартује, ако се екп_цонтинуе позива са ознаком -цонтинуе_тимер .

екпецт_афтер [екпецт_аргс]
ради идентично са екпецт_бефоре, осим ако се обрасци од очекиваних и очекиваних могу упарити , очекивани образац се користи. За више информација погледајте команду екпецт_бефоре .

екпецт_бацкгроунд [екпецт_аргс]
узима исте аргументе као што се очекивало , али се одмах враћа. Паттернс се тестирају кад год дође нови улаз. Временски распоред обрасца и подразумевана вредност су бесмислена да очекују повратно стање и тишина се одбаце. У супротном, команда екпецт_бацкгроунд користи екпецт_бефоре и екпецт_афтер обрасце баш као што то очекује .

Када се евалуирају поступци екпецт_бацкгроунд , обрада у позадини за исти ид спавн је блокирана. Обрада позадине се деблокира када се акција заврши. Док је обрада позадине блокирана, могуће је (предње) очекивати на истом ИД-у за спавн.

Није могуће извршити очекивати док се очекује_бацкгроунд деблокира. екпецт_бацкгроунд за одређени ид спавн- а се брише декларацијом нове екпецт_бацкгроунд-а са истим ИД-ом за спавн. Декларирање екпецт_бацкгроунд без шаблона уклања задани ид спавн из способности да се подударају са обрасцима у позадини.

екпецт_бефоре [екпецт_аргс]
узима исте аргументе као што се очекивало , али се одмах враћа. Параметри парова од најновијих очекиваних претходника са истим ИД-ом за спавн су имплицитно додати у следеће очекиване команде. Ако се шаблон подудара, третира се као да је наведен у самој команди очекивања , а придружено тело се извршава у контексту очекиване команде. Ако образци из очекиваних и очекиваних могу да се подударају, користи се модел очекивано од претходног .

Ако ниједан образац није наведен, ид матрице се не проверава за било који обрасци.

Осим ако није надређена са заставом, очекивани модели унапред се поклапају са ид-ом који је дефинисан у тренутку када је извршена команда екпецт_бефоре (не када се његов узорак подудара).

Застава -инфо узрокује екпецт_бефоре да врати тренутне спецификације оних образаца које ће се подударати. Подразумевано, она извештава о тренутном ИД-у за спавн. Могуће је дати опционо спецификацију ид-а за информацију о том ид-у. На пример

екпецт_бефоре -инфо-и $ проц

Највише се може дати једна спецификација за спавн. Застава-индикатор потискује директне ИД-ове креације које долазе само из индиректних спецификација.

Уместо спецификације ид-а за спавн, ознака "-алл" ће довести "-инфо" да извештава о свим ИД-има спавн-а.

Излаз од ознаке -инфо може се поново користити као аргумент за очекивање_напријед.

екпецт_тти [екпецт_аргс]
је као оцекивати, али цита карактере из / дев / тти (нпр. кеистрокес од корисника). По подразумеваној вредности, очитавање се врши у режиму кувања. Стога, линије морају да се заврше са повратком како би их оцекивали . Ово се може променити преко стти (видети команду стти испод).

екпецт_усер [екпецт_аргс]
је као оцекивати, али це цитати знаке из стдин-а (нпр. кеистрокес од корисника). По подразумеваној вредности, очитавање се врши у режиму кувања. Стога, линије морају да се заврше са повратком како би их оцекивали . Ово се може променити преко стти (видети команду стти испод).

вилица
ствара нови процес . Нови процес је тачна копија тренутног Екпецт процеса . На успех, виљушка враћа 0 у нови (детет) процес и враћа идентификацијски број процеса детета у родитељски процес . На неуспјели (увек због недостатка ресурса, нпр. Свап простора, меморије), виљушка враћа -1 у родитељски процес , а не креира се дечији процес .

Изостављени процеси излазе преко команде за излаз , баш као и оригинални процес . Отвореним процесима дозвољено је да пишу датотеке дневника. Ако не онемогућите дебаговање или пријављивање у већини процеса, резултат може бити збуњујући.

Неке имплементације пти могу збунити више читача и писаца, чак и тренутачно. Дакле, најсигурније је да се одврати пре мртвих процеса.

интеракција [стринг1 боди1] ... [стрингн [бодин]]
даје контролу над тренутним процесом кориснику, тако да се тастери притискају на тренутни процес , а стдоут и стдерр тренутног процеса се враћају.

Пари стринг-стринга могу бити наведени као аргументи, у ком случају се тело извршава када се унесе одговарајући стринг. (Подразумевано, стринг се не шаље тренутном процесу .) Превод команде преводиоца се претпоставља ако недостаје завршно тело.

Ако аргументи читавој интеракцији захтевају више од једне линије, сви аргументи могу бити "урезани" у један како би се избегло окончање сваке линије са косом саксијом. У овом слуцају, уобицајене Тцл замене це се десити упркос запрекама.

На пример, следећа команда покреће интеракцију са следећим паровима стринг-боди: Када притиснете ^ З, Екпецт је суспендован. ( Застита -ресет враћа терминалне режиме.) Када притиснете ^ А, корисник види "унели сте контролу-А" и процес се шаље ^ А. Када се притисне $, корисник види датум. Када притиснете ^ Ц, Екпецт излази. Ако се унесе "фоо", корисник види "бар". Када притиснете ~~, интерактор Екпецт ради интерактивно.

поставите ЦТРЛЗ \ 032 интерактивно {-ресет $ ЦТРЛЗ {екец килл -СТОП [пид]} \ 001 {сенд_усер "унели сте контролу-А \ н"; пошаљи "\ 001"} $ {сенд_усер "Датум је [формат сата [сат секунди]]."} \ 003 излаз фоо {сенд_усер "бар"} ~~}

У паровима тела стрингова, стрингови се подударају у редоследу који су наведени као аргументи. Низови који се делимично подударају не шаљу се у текући процес у очекивању остатка који долазе. Ако се знак унесе тако да више не може бити подударање, само ће део низа бити упућен у процес који не може започети другу утакмицу. Стога, стрингови који су подразумевани делимичног подударања могу се подударати касније, уколико оригинални низови који покушавају да се поклапају коначно не успевају.

Подразумевано је усклађивање стринга тачно без дивљих картица . (Насупрот томе, команда очекивања користи подразумеване шаблоне у облику глобуса .) -ек флаг се може користити за заштиту обрасца који би у супротном могли да одговарају подразумевајућим заступницима . Било који образац који почиње са "-" треба заштитити на овај начин. (Сви стрингови који почињу са "-" резервисани су за будуће опције.)

Застава -ре присиљава низ који се тумачи као шаблон стилског регекп -а. У овом случају, подударање подразумева се чува у варијабли интерацт_оуту слично начинима на који се очекује да чува свој излаз у варијаблу екпецт_оут . Подједнако је подржана и ознака -индицеса .

Шаблон еоф уводи акцију која се извршава на крају датотеке. Одвојени шаблон еофа такође може да прати ознаку -оутпут, у ком случају се одговара ако се открије еоф при писању излаза. Подразумевана еоф акција је "повратак", тако да се интеракција једноставно враћа на било који ЕОФ.

Временско ограничење узорка представља временско ограничење (у секундама) и акција која се извршава након што се у одређено вријеме не читају никакви знаци. Шаблон времена се примењује на најновији процес . Не постоји подразумевани временски размак. Посебна варијабла "тимеоут" (која користи команда оцекује ) нема утицаја на тај временски распоред.

На пример, следећа изјава би се могла користити за аутоматизацију корисника који нису ништа куцали сат времена, али који и даље добијају честе системске поруке:

интерацт -инпут $ усер_спавн_ид тимеоут 3600 ретурн -оутпут \ $ спавн_ид

Ако је образац кључна ријеч нулл , а нуллс су дозвољени (преко ремове_нуллс наредбе), одговарајуће тијело се извршава ако се подудара с једним АСЦИИ 0. Није могуће подесити 0 бајтова помоћу глоб или регекп обрасца.

Пребацивање шаблона са ознаком-уписом узрокује да варијабла интерацт_оут (спавн_ид) буде постављена на спавн_ид који одговара образцу (или еоф).

Акције као што су прекидање и наставак узрокују структуре контроле (тј. За , проц ) да се понашају на уобичајени начин. Међутим, повратак узрокује интеракцију како би се вратио на свог позиваоца, док интер_ретурн узрокује интеракцију да би изазвао повраћај свог позиваоца. На пример, ако се "проц фоо" назива интеракцијом која је затим извршила акцију интер_ретурн , проц фоо би се вратио. (То значи да ако интерактивни позив тумачи интерактивно куцање врати ће проузроковати интеракцију за наставак, док интер_ретурн ће довести до интеракције да се врати на свог позиваоца.)

Током интеракције , рав режим се користи тако да се сви ликови могу пренети на тренутни процес . Ако тренутни процес не прихвата сигнале контроле посла, он ће зауставити ако је послат сигнал за заустављање (подразумевано ^ З). Да га поново покренете, пошаљите сигнал за наставак (на пример "килл -ЦОНТ"). Ако стварно желите да пошаљете СИГСТОП на такав процес (помоћу ^ З), прво размислите о цстирању цсх-а, а затим покрените свој програм. С друге стране, ако желите да пошаљете СИГСТОП у Екпецт, примите првог позива тумача (можда користећи знак за избјегавање), а затим притисните ^ З.

Парови серијског тела могу се користити као скраћеница за избјегавање уношења интерпретера и извршавања команди интерактивно. Претходни термински режим се користи док се извршава тијело пара-тела.

За брзину, акције се подразумевано извршавају у рав режиму. Застита -ресет ресетује терминал на режим који је имао пре него што се изврши интеракција (увек, куван начин рада). Имајте на уму да се знакови који се уносе када се мод укључује могу изгубити (несретна функција управљачког програма на неким системима). Једини разлог за коришћење -ресет је ако ваша акција зависи од покретања у куваном режиму.

Застава -ецхо шаље знакове који одговарају следећем образцу назад процесу који их је генерисао пошто је сваки знак прочитан. Ово може бити корисно када корисник треба да види повратне информације од делимично откуцаних шаблона.

Ако се образац понавља, али се на крају не успе да се подудара, ликови се шаљу на покренут процес . Ако се процес који се развија онда их понавља, корисник ће два пута видети ликове. -ецхо је вероватно једино прикладан у ситуацијама када корисник вероватно неће испунити образац. На примјер, сљедећи одломак је из рфтп, рекурзивног-фтп скрипта, гдје се кориснику тражи да уђе ~ г, ~ п, или ~ л, да прикаже, ставља или пописује тренутни директориј рекурзивно. Ово су толико далеко од нормалне фтп наредбе, да је мало вероватно да ће корисник уписати ~ а затим ишта друго, осим погрешно, у ком случају ће вјероватно само игнорисати резултат.

интерактивно {-чо ~ г {гетцурдирецтори 1} -чо ~ л {гетцурдирецтори 0} -чо ~ п {путцурдирецтори}}

Застава -буфер шаље знакове који одговарају следећем образцу на излазном процесу пошто се читају знаци.

Ово је корисно када желите да програм пусти узорак. На пример, следеће може да се користи за праћење где се особа бира (модем Хаиесовог стила). Сваки пут када се види "атд" скрипта логира остатак линије.

проц логнумбер {} {интерацт -нобуффер -ре "(. *) \" ретурн путс $ лог "[цлоцк формат [цлоцк сецондс]]: биран $ интерацт_оут (1, стринг)"} интерактивни -буффер "атд" логнумбер

Током интеракције , претходна употреба лог_усер-а се занемарује. Конкретно, интеракција ће приморати свој излаз да се забележи (упућује на стандардни излаз) јер се претпоставља да корисник не жели слепо да интеракцију.

Застава узрокује било који од следећих парова кључева да се примене на излаз текућег процеса . Ово може бити корисно, на примјер, када се бавите хостовима који шаљу нежељене знакове током телнет сесије.

Подразумевано, интеракција очекује да корисник пише стдин и чита стдоут самог процеса Екпецт. Застава (за "корисник") чини интерактивни потражити корисника као процес назван по његовом аргументу (који мора бити ид спрјечавања).

Ово омогућава повезивање два неповезана процеса без употребе експлицитне петље. Да бисте помогли у отклањању грешака, Очекујте дијагностику увек идите на стдерр (или стдоут за одређене информације о евидентирању и дебагирању). Из истог разлога, интерпретер команда ће прочитати интерактивно из стдин-а.

На пример, следећи фрагмент креира процес пријављивања. Онда бира корисника (није приказан), и коначно их повезује заједно. Наравно, сваки процес може бити замењен за пријављивање. На пример, љуска би омогућила кориснику да ради без напајања рачуна и лозинке.

спавн логин логин логин $ спавн_ид спавн тип модем # диал бацк то усер # повезивање корисника да се пријавите интерактивни -у $ логин

Да бисте послали излаз у више процеса, наведите листу сваке спавн листе префацед би -оутпут флаг. Улаз за групу излазних ИД-ова могу бити одређени спавн ид листом префацед би -инпут флаг. (Оба -инпут и -оутпут могу узимати листе у истом облику са ознаком у команди очекивања , осим што било који_спавн_ид није битан за интеракцију .) Сви сљедећи заставе и стрингови (или обрасци) примјењују се на овај унос док не други - Појављује се знак за унос. Ако се не појави -инпут , -оутпут подразумева "-инпут $ усер_спавн_ид -оутпут". (Слично томе, са обрасцима који немају -инпут .) Ако је наведен један -инпут , преписује $ усер_спавн_ид. Ако је наведен други- улаз , преписује $ спавн_ид. Може се навести додатне- улазне заставице.

Оба имплицитна улазна процеса су подразумевана да имају своје излазе наведене као $ спавн_ид и $ усер_спавн_ид (у супротном смеру). Ако се појави ознака -инпут без ознаке -оутпут , знакови из тог процеса се одбацују.

Застава представља замену за тренутни спавн_ид када се не користе друге -инпутне или -оутпутске заставице. Застава А-и подразумева -о заставу.

Могуће је променити процесе са којима се интерактивно користи помоћу индиректних ИД-ова. (Индиректни ИД-ови за спавн су описани у одељку о команди очекивања.) ​​Индиректни ИД-и за спавн могу бити специфицирани са -и, -у, -инпутом или -оутпут заставама.

тумач [аргс]
узрокује да корисник интерактивно затражи команде Екпецт и Тцл. Одштампан је резултат сваке наредбе.

Акције као што су прекидање и наставак узрокују структуре контроле (тј. За , проц ) да се понашају на уобичајени начин. Међутим, повратак доводи до тога да се преводиоца врати позивнику , док интер_ретурн проузрокује да преводиоца узрокује повраћај позиваоца. На примјер, ако је "проц фоо" назвао тумач који је затим извршио акцију интер_ретурн , проц фоо би се вратио. Свака друга команда доводи до тога да тумач настави тражити нове команде.

Подразумевано, позив садржи два цела броја. Први цео број описује дубину евиденције (тј. Колико пута је позвана Тцл_Евал). Други број је Тцл историја идентитета. Позив се може поставити дефинисањем процедуре назване "промпт1" чија повратна вриједност постаје сљедећи позив. Ако изјава има отворене цитате, парене, грубе, или заграде, секундарни позив (подразумевано "+>") се издаје на новој линији. Секундарни упит се може поставити дефинисањем процедуре под називом "промпт2".

Током преводиоца користи се режим кухања, чак и ако је његов позивник користио сирови режим.

Ако је стдин затворен, преводиоц ће се вратити уколико се не користи -еоф , у ком случају се позива позадински аргумент.

лог_филе [аргс] [[-а] датотека]
Ако је име фајла дата, лог_филе ће снимити транскрипт сесије (почевши од те тачке) у датотеци. лог_филе ће престати снимања ако није дат аргумент. Било која претходна датотека дневника је затворена.

Уместо имена датотеке, идентификатор Тцл датотеке може се добити помоћу ознака -опен или -леавеопен . Ово је слично команди спавн . (За информације потражите више информација).

За заустављање сигнала застави излаз лога који је потискивао команда лог_усер .

Подразумевано, наредба лог_филе прилаже старе старе датотеке уместо да их скраћује, ради лакшег отварања логовања и више пута у једној сесији. Да бисте урезали датотеке, користите ознаку -ноаппенд .

Застава -инфо узрокује лог_филе да врати опис најновијих аргумената који нису наведени.

лог_усер -инфо | 0 | 1
Подразумевано, дијалог за слање / очекивање је пријављен у стдоут (и логфиле ако је отворен). Логирање на стдоут је онемогућено командом "лог_усер 0" и поново је омогућено од стране "лог_усер 1". Логирање у лог фајл је непромењено.

Застава -инфо узрокује лог_усер да врати опис најновијих аргумената за не-инфо.

матцх_мак [-д] [-и спавн_ид] [величина]
дефинише величину бафера (у бајтовима) које се користе интерно од очекивања . Без аргумента величине , тренутна величина се враћа.

Са ознаком -д , подразумевана величина је подешена. (Иницијално подразумевано је 2000.) Са ознаком -и , величина је подешена за именовани ИД спавн-а, иначе је постављен за тренутни процес .

оверлаи [- # спавн_ид] [- # спавн_ид] [...] програм [аргс]
извршава "програм аргс" уместо тренутног програма Екпецт , који се завршава. Губичан аргумент везан за везивање црта цртицу испред имена команде као да је то схелл схелл. Сви спавн_идс су затворени, осим оних који се називају аргументима. Ови су мапирани на идентификоване датотеке датотека.

Спавн_идс се мапирају у идентификаторе датотека за нови програм који ће наследити. На пример, следећа линија покреће шах и омогућава га да се контролише тренутним процесом - рецимо, шаховским мајстором.

оверлаи -0 $ спавн_ид -1 $ спавн_ид -2 $ спавн_ид цхесс

Ово је ефикасније од "интеракције -у", међутим, жртвује могућност да се програмира интеракција, пошто процес Екпецт више не контролише.

Имајте на уму да нема контролног терминала. Стога, ако искључите или ремапирате стандардни улаз, програми који врше контролу рада (схеллс, логин, итд.) Неће функционисати исправно.

паритет [-д] [-и спавн_ид] [вредност]
дефинише да ли паритет треба задржати или уклонити из производње поријеклих процеса. Ако је вредност нула, паритет се одузима, иначе се не уклања. Без аргумента вриједности , тренутна вриједност се враћа.

Уз ознаку , подразумева се подразумевана вредност паритета. (Иницијално подразумевано је 1, тј. Паритет се не уклања.) ​​Са заставом , вредност паритета је постављена за именовани спавн ид, иначе је постављен за тренутни процес .

ремове_нуллс [-д] [-и спавн_ид] [вредност]
дефинише да ли се нули задржавају или уклањају из излаза насталих процеса пре него што се узорак подударају или чувају у варијабли екпецт_оут или интерацт_оут . Ако је вредност 1, нуллс се уклањају. Ако је вредност 0, нуллс се не уклањају. Без аргумента вриједности , тренутна вриједност се враћа.

Са ознаком -д , подразумевана је вредност. (Иницијално подразумевано је 1, тј. Нуллс се уклањају.) Са ознаком , вредност је постављена за именовани спавн ид, иначе је постављен за тренутни процес .

Без обзира да ли су уклоњени нуллови или не, Очекује записати нулл бајтове у дневник и стдоут.

пошаљи [-флагс] стринг
Шаље низ на тренутни процес . На пример, команда

пошаљите "хелло ворлд \ р"

шаље знакове, хелловорлд у тренутни процес . (Тцл укључује команду принтф- лике (назива се формат ) која може направити произвољно сложене стрингове.)

Карактери се шаљу одмах, иако програми са линковним пуферним уносом неће прочитати знакове док се не пошаље повратни знак. Повратни знак означен је "\ р".

Застава даје следећи аргумент да се тумачи као стринг а не застава. Сваком низу може претходити "-" без обзира да ли или не изгледа као застава. Ово обезбеђује поуздан механизам за навођење варијабилних жица, а да их не заустављају они који случајно изгледају као заставе. (Сви стрингови који почињу са "-" резервисани су за будуће опције.)

Застава изјављује да се стринг шаље у именовани спавн_ид. Ако је спавн_ид усер_спавн_ид , а терминал је у рав режиму, нови редови у низу се преведу у секвенце повратне-нове линије тако да се појављују као да је терминал у режиму кувања. Застава -рав искључује овај превод.

-нулл флаг шаље нулл знакове (0 бајтова). По дефаулту се шаље један нулл. Цел број може да следи -нулл да би се назначило колико је нула за слање.

Застита заставе генерише стање паузе. Ово има смисла само ако се ид спавн односи на тти уређај који се отвара преко "спавн -опен". Ако сте покренули поступак као што је врх, требало би да користите конвенцију конице за генерисање паузе.

Застава подстиче излаз да се пошаље "полако", чиме се избјегава уобичајена ситуација у којој рачунар одрише улазни бафер који је дизајниран за човека који никада неће истиснути исти бафер . Овај резултат је контролисан вриједношћу променљиве "сенд_слов" који узима двије елементе. Први елемент је цијели број који описује број бајтова који се шаљу атомски. Други елемент је прави број који описује број секунди од којих се атомска пошиљака морају раздвојити. На примјер, "сет сенд_слов {10 .001}" би приморао "слање" за слање стрингова са 1 милисекундом између сваких 10 знакова послатих.

Застава подстиче излазак (донекле) као људско куцање. Појављују се људска одлагања између знакова. (Алгоритам се заснива на Веибулловој дистрибуцији, са модификацијама које одговарају овој конкретној апликацији.) Овај резултат је контролисан вриједношћу променљиве "сенд_хуман" који узима пет листова елемената. Прва два елемента су просечно време интеракција карактера у секундама. Први се користи подразумевано. Други се користи код завршетка речи, да би се симулирале суптилне паузе који се повремено појављују при таквим прелазима. Трећи параметар је мерило варијабилности где је .1 прилично променљива, 1 је разумљиво променљива, а 10 је прилично неизбрисиво. Екстреми су 0 до бесконачности. Последња два параметра су минимално и максимално време интеракција. Најмањи и максимални су последњи и "клип" последње време. Крајњи просек може бити сасвим другачији од датог просјека ако су минимални и максимални клип довољно вриједни.

Као пример, следећа команда емулира брзу и досљедну дактилографију:

сет сенд_хуман {.1 .3 1 .05 2} пошаљи -х "Гладан сам. Хајде да ручамо."

док би следеће могло бити погодније након мамурлука:

сет сенд_хуман {.4 .4 .2 .5 100} пошаљи -х "Гоодд парти ласх нигхт!"

Имајте на уму да грешке нису симулиране, мада можете сами поставити ситуације исправљања грешака уграђивањем грешака и исправки у аргументу за слање.

Заставе за слање нул карактера, за слање пауза, за успоравање изласка и излаз у људском стилу међусобно се искључују. Користи се само онај који је претходно наведен. Штавише, ниједан аргумент стринг се не може специфицирати са заставама за слање нул карактера или пауза.

Добро је да претходи првом пошаљу процесу оцекујем . Оцекује да це поцети процес , а слање не мозе. Конкретно, ако се први слање заврши пре него што процес почне да се покреће, ризикујете да ваши подаци буду игнорисани. У ситуацијама када интерактивни програми нуде почетни позив, можете прећи послати са одлагањем као у:

# Да избегавате да хакери наговештавају како да се пробије, # овај систем не тражи вањску лозинку. # Сачекајте 5 секунди за Екец да заврши спавн телнет вери.сецуре.гов спавања 5 пошаљите лозинку \ р

екп_сенд је псеудоним за слање. Ако користите Екпецтк или неку другу варијанту Екпецт у окружењу Тк, слање је дефинисано од стране Тк за потпуно другачију сврху. екп_сенд је обезбеђен за компатибилност између окружења. Слични алијаси су предвиђени за друге команде за слање Екпецт-а.

сенд_еррор [-флагс] стринг
је као послати , осим што је излаз послат на стдерр умјесто тренутни процес .

сенд_лог [-] стринг
је као слање , осим што се стринг шаље само у датотеку дневника (погледајте лог_филе .) Аргументи су игнорисани ако ниједна датотека дневника није отворена.

сенд_тти [-флагс] стринг
је као послати , осим што се излаз послати на / дев / тти умјесто тренутног процеса .

сенд_усер [-флагс] стринг
је као послати , осим што се излаз пошаље на стдоут уместо тренутног процеса .

спавај секунде
узрокује да скрипта споји у задатом броју секунди. Секунди могу бити децимални број. Интерруптс (и Тк догађаји ако користите Екпецтк) обрађују се док очекујете спавање.

спавн [аргс] програм [аргс]
креира нови процес који покреће "програм аргс". Стдин, стдоут и стдерр су повезани са Екпецт-ом, тако да их могу читати и писати друге Екпецт команде. Веза је прекинута близу или ако сам процес затвара било који од идентификатора датотеке.

Када се процес покреће помоћу спавн-а , варијабла спавн_ид је постављена на дескриптор који се односи на тај процес . Процес описан од стране спавн_ид сматра се "тренутним процесом ". спавн_ид се може читати или писати, што уствари омогућава контролу посла.

усер_спавн_ид је глобална варијабла која садржи дескриптор који се односи на корисника. На примјер, када је спавн_ид постављен на ову вриједност, очекујте се понашати као екпецт_усер .

еррор_спавн_ид је глобална варијабла која садржи дескриптор који се односи на стандардну грешку. На примјер, када је спавн_ид постављен на ову вриједност, шаље се понашање као сенд_еррор .

тти_спавн_ид је глобална варијабла која садржи дескриптор који се односи на / дев / тти. Ако / дев / тти не постоји (као у скрипти црон, ат или сцрипт), тти_спавн_ид није дефинисан. Ово се може тестирати на следећи начин:

ако {[инфо варс тти_спавн_ид]} {# / дев / тти екистс} елсе {# / дев / тти не постоји # вероватно у црон, серији или по скрипту}

спавн враћа ИД процеса УНИКС-а. Ако ниједан процес није покренут, 0 се враћа. Променљива спавн_оут (славе, име) је постављена на име пти славе уређаја.

По подразумеваној вредности, поремецај понавља име и аргументе команде. Застава -ноо престаје да ствара ово.

Застава -цонсоле доводи до тога да се конзолни излаз преусмерава на процес који се покреће. Ово није подржано на свим системима.

Интерно, спавн користи пти, иницијализован на исти начин као и кориснички тти. Ово је иницијализовано тако да су све поставке "нормалне" (према стти (1)). Ако је променљива стти_инит дефинисана, она се тумачи у стти стти аргументима као даља конфигурација. На пример, "сет стти_инит рав" ће довести до тога да се терминали спавед процеса покрећу у рав моду. -нотичка копија прескочи иницијализацију на основу корисничког тти-а. - не прелази "иницијалну" иницијализацију.

Нормално, подмазивање траје мало времена за извршење. Ако приметите да мамац узима значајно време, вероватно се сусреће са птис који су заглављени. Бројни тестови се покрећу на птис-има како би избегли преплитање са погрешним процесима. (Ово траје 10 секунди по заглављеном пти.) Руннинг Екпецт са опцијом ће показати да ли Екпецт сусреће многе птис у непарним стањима. Ако не можете да убијете процесе на које су ове пти-ови повезани, ваш једини повратак може бити рестартовање.

Ако се програм не може успјешно успјети јер екец (2) не успије (нпр. Када програм не постоји), наредна интеракција или очекивана наредба враћаће поруку грешке као да је програм покренуо и произвела поруку о грешци као излаз. Ово понашање је природна последица примене мртвих . Интерно, секају се виљушке, након чега процес који се креће нема начин да комуницира са првобитним Екпецт процесом, осим путем комуникације преко спавн_ид-а.

Застава -опен узрокује следећи аргумент да се тумачи као идентификатор Тцл фајла (тј. Вратити се отвореним .) Ид спавн-а се онда може користити као да је то постао процес . (Идентификатор датотеке више не треба користити.) Ово вам омогућава да третирате сирове уређаје, датотеке и цевоводе као покренути процес без коришћења пти-а. 0 се враћа да указује да нема придруженог процеса . Када је веза са пораслим процесом затворена, такође је идентификатор Тцл датотеке. Застава -леавеопен је слична као -опен осим што -леавеопен узрокује да се идентификатор датотеке остави отворен чак и када је ид затворен.

Празна ознака узрокује отварање пти- а, али ниједан процес се није појавио. 0 се враћа да указује да нема придруженог процеса . Спавн_ид је постављен као и обично.

Променљива спавн_оут (славе, фд) је подешена на идентификатор датотеке који одговара пти слави . Може се затворити помоћу "цлосе -славе".

Застава -игре означава сигнал који треба игнорисати у процесу који је настао. Иначе, сигнали добијају подразумевано понашање. Сигнали су именовани као у команди за замућивање , осим што сваки сигнал захтева посебну заставу.

страце ниво
узрокује следеће изјаве да се одштампају пре извршења. (Тцл трагова команди трагова трагова.) Ниво показује колико је доле у ​​стацку позива да трагају. На пример, следећа команда покреће Екпецт док тражи првих 4 нивоа позива, али ништа испод ње.

очекивати -ц "страце 4" сцрипт.екп

Застава -инфо узрокује страће да врати опис најновијих аргумената који нису наведени.

стти аргс
мења терминалне режиме слично спољној команди стти.

Подразумевано се приступа контролном терминалу. Други терминали се могу приступити додавањем "Захтјеви за статус вратити га као резултат команде. Ако се не тражи статус и приступ контролном терминалу, претходни статус сирових и ецхо атрибута се враћа у облику која касније може бити које користи команда.

На примјер, аргументи сирови или -учени, ставите терминал у рав мод. Аргументи -развучени или кувани стављају терминал у кувани начин. Аргументи ецхо и -ецхо стављају терминал у ецхо и ноецхо мод, респективно.

Следећи пример илуструје како привремено онемогућити одјекивање. Ово би се могло користити у иначе-аутоматским скриптама како би се избјегло уграђивање лозинки у њих. (Погледајте више дискусија о томе испод ЕКСПЕЦТ ХИНТС испод).

стти -ецхо сенд_усер "Лозинка:" екпецт_усер -ре "(. *) \ н" поставити лозинку $ екпецт_оут (1, стринг) стти ецхо

систем аргс
даје аргументе сх (1) као улаз, баш као да је укуцано као команда са терминала. Очекује да чека завршетак шкољке. Повратни статус из сх се обрађује на исти начин на који екец обрађује свој повратни статус.

За разлику од екец-а који преусмерава стдин и стдоут у скрипту, систем не извршава преусмеравање (осим оног којег означава самим низом). Стога је могуће користити програме који морају директно разговарати са / дев / тти. Из истог разлога, резултати система нису евидентирани у дневнику.

временски знак [аргс]
враћа временски жиг. Без аргумената, број секунди од времена враћања епохе.

Флаг -формат уноси низ који се враћа, али са замјенама направљеним према ПОСИКС правилима за стрфтиме. На пример,% а се замењује скраћеним називом дана у недељи (нпр. Сат). Остали су:

% скраћен назив дана у недељи% Пуни назив дана у недељи% б скраћени назив месеца% Б назив цјелог месеца% ц датум-датум као у: сри лис 6 11:45:56 1993% д дан у мјесецу (01-31% Х сат (00-23)% И сат (01-12)% ј дан (001-366)% м месец (01-12)% М минута (00-59)% п ам или пм% С секунда (00-61) % у дан (1-7, понедељак је први дан у недељи)% У недељно (00-53, прва недеља је први дан седмице један)% В недељно (01-53, ИСО 8601 стил)% в дан (0- 6)% В недељно (00-53, први понедељак је први дан седмице један)% к датум-време као у: ср окт 6 1993% Кс време као у: 23:59:59% година (00-99) % И година као у: 1993% З временском зоном (или ништа ако није одређено) %% знак одсто процентуално

Друге% спецификације су недефинисане. Други знакови ће бити пропуштени кроз нетакнуте. Подржано је само Ц локале.

Застава -сецондс уводи неколико секунди од епохе која ће се користити као извор за форматирање. У супротном, користи се тренутно време.

Застава -гмт сили временску ознаку како би користила ГМТ временску зону. Без заставе, користи се локални временски зон.

трап [[цомманд] сигнала]
узрокује да се задана команда изврши након будућег пријема било ког од датих сигнала. Команда се извршава у глобалном опсегу. Ако је команда одсутна, акција сигнала се враћа. Ако је наредба стринг СИГ_ИГН, сигнали се игноришу. Ако је наредба стринг СИГ_ДФЛ, сигнали су резултат подразумијевања система. сигнали су или један сигнал или списак сигнала. Сигнали се могу нумерички или симболично навести по сигналу (3). Префикс "СИГ" се може изоставити.

Без аргумената (или аргумента - број), трап враћа број сигнала команде за трап који се тренутно извршава.

Застава -цоде користи повратни код команде уместо било ког кода на који ће се Тцл вратити када се команда првобитно покренула.

Застава -интерп доводи до процене команде користећи интерпретер који је активан у тренутку када је команда почела да ради, а не када је проглашен проглашењем.

Застава -наме узрокује команду замке да врати назив сигнала команде за трап који се тренутно извршава.

Ова ознака -мак узрокује команду замке да врати највећи број сигнала који се може подесити.

На примјер, наредба "трап {сенд_усер" Оуцх! "} СИГИНТ" ће одштампати "Оуцх!" сваки пут када корисник притисне ^ Ц.

Подразумевано, СИГИНТ (који се обично може генерисати притиском на типку ^ Ц) и СИГТЕРМ узрокују очекивање да изађете. Ово је последица следеће замке, која се креира подразумевано када се појави Екпецт.

излаз из замке {СИГИНТ СИГТЕРМ}

Ако користите ознаку -Д да започнете дебуггер, СИГИНТ је редефинисан да покреће интерактивни дебугер. То је због следеће замке:

трап {екп_дебуг 1} СИГИНТ

Замка за грешке може се променити постављањем променљиве окружења ЕКСПЕЦТ_ДЕБУГ_ИНИТ у нову команду за замену.

Можете, наравно, да преклапате обоје само додавањем команди замке у вашу скрипту. Конкретно, ако имате свој "излаз из замке СИГИНТ", ово ће превазићи замку за откривање грешака. Ово је корисно ако желите да спречите кориснике да дођу до грешке.

Ако желите да дефинишете сопствени замка на СИГИНТ-у, али и даље замућите дебугеру када ради, користите:

ако {! [екп_дебуг]} {трап мистуфф СИГИНТ}

Алтернативно, можете се заменити на дебугеру помоћу неког другог сигнала.

замка вам не дозвољава превладати акцију за СИГАЛРМ јер се ово интерно користи за Очекивање . Команда за искључивање поставља СИГАЛРМ на СИГ_ИГН (игнорише). То можете поново учитати све док га онемогућите током наредних наредби за спавн.

Погледајте сигнал (3) за више информација.

чекати [аргс]
закашњења до постизања процеса (или тренутног процеса ако ниједан није именован) престаје.

чекај нормално враћа листу од цетири цела броја. Први број је пид процеса који је био чекан. Други број је одговарајући ид. Трећи интегер је -1 ако се десила грешка оперативног система или 0 иначе. Ако је трећи целобројник био 0, четврти број је статус који се вратио постројењем. Ако је трећи цијели број био -1, четврти број је вриједност еррно коју је поставио оперативни систем. Такође је подешена глобална променљива еррорЦоде.

Додатни елементи могу се појавити на крају повратне вриједности од чекања . Опциони пети елемент идентификује класу информација. Тренутно је једина могућа вриједност за овај елемент ЦХИЛДКИЛЛЕД у којем случају сљедеће двије вриједности су име Ц-стиле сигнала и кратки текстуални опис.

Застава декларише процес да сачека одговарајући именованом спавн_ид (НЕ ИД ид). Унутар СИГЦХЛД руковаоца, могуће је сачекати било који постројен процес користећи спавн ид -1.

Непрекидна застава изазива чекање да се одмах врати са индикацијом успешног чекања. Када процес изађе (касније), аутоматски ће нестати без потребе за експлицитним чекањем.

Команда чекања се такође може користити и сачекајте поступак са рачвањем помоћу аргумената "-и -1". За разлику од његове употребе са креираним процесима, ова команда се може извршити у било ком тренутку. Нема контроле над којим процесом се запошљава. Међутим, повратна вриједност се може провјерити за ИД процеса .

ЛИБРАРИЕС

Очекује аутоматски да зна о две уграђене библиотеке за Екпецт скрипте. Ови су дефинисани именицима наведеним у варијаблама екп_либрари и екп_екец_либрари. Оба треба да садрже датотеке помоћних програма које могу користити друге скрипте.

екп_либрари садржи датотеке независне од архитектуре. екп_екец_либрари садржи датотеке зависне од архитектуре. Зависно од вашег система, оба директорија могу бити потпуно празна. Постојање датотеке $ екп_екец_либрари / цат-буфферс описује да ли ваш / бин / цат подразумева подразумевано.

ПРЕТТИ-ПРИНТИНГ

Дефиниција вгринд доступна је за прилично штампање Екпецт скрипте. Под претпоставком да је дефиниција грешке која се испоручује са дистрибуцијом Екпецт исправно инсталирана, можете га користити као:

вгринд -слепе датотека

ПРИМЕРИ

Многи не би били очигледни како све ставити на све што описује човјек . Подржавам вас да прочитате и испробате примере у примерном именику дистрибуције Екпецт . Неки од њих су стварни програми. Други једноставно илуструју одређене технике, и наравно, пар су само брзи хацкови. ИНСТАЛЛ датотека има брзи преглед ових програма.

Такође су корисни и Екпецт паперс (види СЕЕ ТАКО). Док неки радови користе синтаксу која одговара ранијим верзијама Екпецт-а, пратећа образложења и даље важе и прелазе у много више детаља од ове странице човека.

ЦАВЕАТС

Додаци се могу судити са именима Екпецт-а. На пример, пошиљање је дефинисано од стране Тк-а за потпуно другачију сврху. Из тог разлога, већина команди Екпецт је доступна и као "екп_КСКСКСКС". Команде и варијабле које почињу са "екп", "интер", "спавн" и "тимеоут" немају псеудонимије. Користите проширена имена наредбе ако вам је потребна ова компатибилност између окружења.

Очекује се прилично либералан поглед на опсег. Конкретно, варијабле које прочитају команде специфичне за програм Екпецт ће се прво тражити из локалног подручја, а ако их не пронађе, у глобалном опсегу. На пример, то спречава потребу за постављањем "глобалног временског ограничења" у свакој процедури коју пишете користећи очекивања . Са друге стране, променљиве писане су увек у локалном опсегу (осим ако није издата "глобална" наредба). Најчешћи проблем који ово узрокује је када се спавн извршава у процедури. Изван процедуре, спавн_ид више не постоји, тако да порасли процес више није доступан једноставно због опсега. Додајте "глобални спавн_ид" у такав поступак.

Ако не можете омогућити могућност мултиспавнинг-а (тј. Ваш систем не подржава ни одабир (БСД *. *), Анкета (СВР> 2), нити нешто еквивалентно), Екпецт ће моћи контролисати само један процес истовремено. У овом случају не покушавајте да поставите спавн_ид , нити извршите процесе преко екец-а док се покреће процес . Осим тога, нећете моћи очекивати од више процеса (укључујући и корисника као једног) у исто вријеме.

Параметри терминала могу имати велики ефекат на скрипте. На пример, ако је скрипт написан да потражи одјекивање, он ће се лоше понашати ако је одјек искључен. Из тог разлога, подразумевано подразумевајте параметре термичног терминала. Нажалост, ово може учинити ствари непријатним за друге програме. Као пример, схелл емацс жели да промени "уобичајене" мапе: нове линије се мапирају на нове линије уместо на нове линије враћања, а одјекивање је онемогућено. Овим се омогућава емацима да уреде улазну линију. Нажалост, Очекивање не може погађати ово.

Можете тражити да Очекује да не надмаши своје подразумеване поставке параметара терминала, али онда морате бити веома пажљиви приликом писања скрипти за таква окружења. У случају емака избегавајте зависно од ствари као што су одјекивање и крајње линије мапирања.

Команде које су прихватиле аргументе убацене у једну листу ( очекиване варијанте и интеракције ) користе хеуристичку одлуку да ли је списак заправо један аргумент или многи. Хеуристички може да пропадне само у случају када листа заправо представља један аргумент који има више умножених \ н са не-белим карактерима између њих. Ово се чини довољно невероватним, међутим, аргумент "-нобраце" се може користити да би се појединачни аргумент применио као један аргумент. Ово би се могло користити са машинским Екпецт кодом. Слично томе, -брејк сили јединствени аргумент који треба руковати као више образаца / акција.

БУГС

Било је стварно примамљиво назвати програм "секс" (било за "Смарт ЕКСец" или "Сенд-Екпецт"), али превладао је добар смисао (или можда само пуританизам).

На неким системима, када се граната поквари, жали се што не може приступити тти-у, али у сваком случају ради. То значи да ваш систем има механизам за добијање контролне јединице за коју Екпецт не зна. Молим вас, сазнајте шта је и пошаљите ми ове информације.

Ултрик 4.1 (бар најновије верзије овде) разматра временска ограничења изнад 1000000 да буду еквивалентна 0.

Дигитални УНИКС 4.0А (и вероватно друге верзије) одбија да додели птис ако дефинишете СИГЦХЛД уређивач. Погледајте страницу Грант за више информација.

ИРИКС 6.0 не управља правилно исправама за Пти, тако да ако Екпецт покуша да додели пти који је претходно користио неко други, то не успе. Надоградите на ИРИКС 6.1.

Телнет (верификован само под СунОС 4.1.2) виси ако ТЕРМ није подешен. Ово је проблем под црон-ом, на и у цги скриптама, који не дефинишу ТЕРМ. Дакле, морате га експлицитно поставити - до које врсте је обично ирелевантно. То мора само бити подешено на нешто! Следеће вероватно је довољно за већину случајева.

сет енв (ТЕРМ) вт100

Савет (верификован само под БСДИ БСД / ОС 3.1 и386) виси ако СХЕЛЛ и ХОМЕ нису постављени. Ово је проблем под црон-ом , на и у цги скриптама, који не дефинишу ове променљиве окружења. Дакле, морате их експлицитно поставити - до ког типа је обично ирелевантно. То мора само бити подешено на нешто! Следеће вероватно је довољно за већину случајева.

сет енв (СХЕЛЛ) / бин / сх сет енв (ХОМЕ) / уср / лоцал / бин

Неке имплементације пти-ова су дизајниране тако да кернел баца све непрочитане излазе након 10 до 15 секунди (стварни број зависи од имплементације) након што је процес затворио дескриптор датотеке. Тако очекујте програме као што су

спавн дате слееп 20 очекује

ће пасти. Да би се то избегло, позовите неинтерактивне програме са извором, а не спавн . Иако су такве ситуације могуће, у пракси никада нисам срео ситуацију у којој би последњи резултат истинског интерактивног програма био изгубљен због оваквог понашања.

С друге стране, Цраи УНИЦОС птис одбацује све непрочитане излазе одмах након што је процес затворио дескриптор датотеке. Ја сам то пријавио Цраи и они раде на поправци.

Понекад је потребан кашњење између позива и одговора, као што је када тти интерфејс мења УАРТ поставке или подударање брзина преноса података тако што тражи почетне / заустављене битове. Обично је све ово потребно за спавање на секунду или два. Још робустнија техника је покушати поново док хардвер није спреман да прими улаз. Следећи пример користи обе стратегије:

пошаљите "брзину 9600 \ р"; спавање 1 оцекује {тимеоут {сенд "\ р"; екп_цонтинуе} $ промпт}

трап -цоде неће радити са било којом командом која се налази у Тцл-овој петљи догађаја, као што је спавање. Проблем је у томе што у циклусу догађаја Тцл одбацује повратне кодове из асинц хандлер-ова. Решење је постављање заставе у код замке. Затим проверите заставицу одмах након команде (нпр. Спавање).

Команда екпецт_бацкгроунд игнорише -тимеоут аргументе и нема појам временских ограничења уопште.

& # 34; ЕКСПЕЦТ ХИНТС & # 34;

Постоји неколико ствари о Екпецт-у које можда нису интуитивне. Овај одељак покушава да реши неке од ових ствари са неколико сугестија.

Уобичајени проблем очекивања је како препознати шалтерске упуте. Пошто их различито прилагођавају различити људи и различите гранате, преносно аутоматизовање рлогина може бити тешко без познавања промпта. Уобичајена конвенција је да корисници чувају регуларни израз који описује њихов позив (посебно његов крај) у варијабли околине ЕКСПЕЦТ_ПРОМПТ. Може се користити код као што следи. Ако ЕКСПЕЦТ_ПРОМПТ не постоји, код и даље има добре шансе да исправно функционише.

поставити промпт "(% | # | \\ $) $"; # # подразумевано промпт цатцх {поставити промпт $ енв (ЕКСПЕЦТ_ПРОМПТ)} очекивати -ре $ промпт

Подстичем вас да пишете очекиване обрасце који укључују крај онога што очекујете да видите. Тиме се избјегава могућност одговора на питање пре него што се види читава ствар. Поред тога, иако бисте можда могли одговорити на питања пре него што сте их у потпуности видели, ако одговорите рано, ваш одговор може се појавити поново у средини питања. Другим ријечима, резултујући дијалог ће бити тачан, али изгледати умешан.

Већина подзаконских захтева укључује просторни знак на крају. На примјер, позив од фтп је 'ф', 'т', 'п', '>' и. Да бисте подесили овај позив, морате да пријавите сваки од ових знакова. Честа је грешка да се не укључи празно. Ставите празно у експлицитно.

Ако користите образац облика Кс *, * ће се подударати са свим резултатима примљеним од краја Кс до последње примљене ствари. Ово звучи интуитивно, али може бити донекле збуњујуће јер фраза "последња примљена" може варирати у зависности од брзине рачунара и обраде И / О и од стране кернела и управљачког програма уређаја.

Конкретно, људи имају тенденцију да виде програмски излаз који долази у огромне комаде (атомски) када у стварности већина програма производи истовремено излаз из једне линије. Под претпоставком да је то случај, * у образцу из претходног става може да се подудара само са завршетком тренутне линије, иако се чини да је више, јер у време меча то је био резултат који је примљен.

Очекује се да нема начина да сазнају да ће доћи до даљих резултата, осим ако ваш образац то посебно не рачуна.

Чак иу зависности од линијско оријентисаног пуферовања, није паметно. Програми не само да ријетко дају обећања о врсти пуферовања који они раде, али системско пробијање може прекинути излазне линије тако да линије раскидају на наизглед случајним местима. Дакле, ако можете да изразите последњих неколико карактера у писању обрасца, паметно је то учинити.

Ако чекате узорак у последњем излазу програма и програм емитује нешто друго уместо тога, нећете моћи да га детектујете тимеоут кључном ријечју. Разлог је тај што очекивање неће трајати - умјесто тога ће добити индикацију еофа . Користите то уместо тога. Још боље, користите обе. На тај начин, ако се ова линија икада помера, нећете морати сами да уређујете.

Нови редови се обично претварају у повратак кретања, секвенци линија у току када излази терминалски управљачки програм. Дакле, ако желите образац који се експлицитно поклапа са две линије, од, рецимо, принтф ("фоо \ нбар"), требало би да користите образац "фоо \ р \ нбар".

Сличан превод се јавља када читате од корисника, преко очекивача . У овом случају, када притиснете повратак, биће преведено на нови ред. Ако Екпецт затим прође у програм који поставља свој терминал у сирови мод (као што је телнет), постојаће проблем, јер програм очекује прави повратак. (Неки програми стварно опраштају у томе што ће аутоматски превођити нове линије на повратак, али већина их не.) Нажалост, не постоји начин да се утврди да ли је програм ставио свој терминал у рав мод.

Уместо ручног замењивања нових линија са повратком, решење је да се користи команда "стти рав", која ће зауставити превод. Међутим, обратите пажњу да то значи да више нећете добити куване функције за уређивање линија.

интерактивно имплицитно поставља свој терминал у сирови мод, тако да овај проблем неће настати.

Често је корисно чувати лозинке (или друге приватне информације) у Екпецт скриптама. Ово се не препоручује јер је било чему што је сачувано на рачунару подложно приступу било коме. Стога, интерактивно тражење лозинки из сценарија је паметнија идеја него што их буквално уграђује. Без обзира на то, понекад је таква уградња једина могућност.

Нажалост, УНИКС датотечни систем нема директан начин креирања скрипти који су извршни, али нечитљиви. Системи који подржавају сетгидне скрипте могу индиректно симулирати ово на следећи начин:

Креирајте Екпецт скрипту (која садржи тајне податке) као и обично. Направите његове дозволе 750 (-рвкр-к ---) и власништво је поуздане групе, односно групе којој је дозвољено читање. Ако је потребно, креирајте нову групу за ову сврху. Затим креирајте скрипту / бин / сх са дозволама 2751 (-рвкр-с - к) у власништву исте групе као и раније.

Резултат је сценарио који се може извршити (и прочитати) од стране било кога. Када се позове, покреће сценарио Екпецт .

& # 34; ПОГЛЕДАЈ ТАКО & # 34;

Тцл (3), либекпецт (3)
" Екплоринг Екпецт : Тцл-Басед Тоолкит фор Аутоматинг Интерацтиве Програмс" , Дон Либес, стр. 602, ИСБН 1-56592-090-2, О'Реилли анд Ассоциатес, 1995.
"очекивати: лечити оне неконтролисане прилике интерактивности" Дон Либеса, Процеедингс оф тхе Суммер УСЕНИКС Цонференце, Анахеим, Цалифорниа, 11-15.
. "Коришћење очекивања за аутоматизацију задатака администрације система" Дон Либеса, Зборник конференције администрације система великих инсталација система УСЕНИКС из Цолорадо Спрингса, Цолорадо, 17-19. Октобар 1990.
. И "Тцл: Ембеддабле Цомманд Лангуаге", Јохн Оустерхоут, Зборник зимске 1990 УСЕНИКС конференције, Васхингтон, ДЦ, 22-26. Јануара 1990. године. "Очекујем: скрипте за контролу интерактивних програма" Дон Либеса, рачунарски системи , Вол. 4, бр. 2, часописи часописа Универзитета у Калифорнији, новембар 1991. године. "Тестирање регресије и испитивање интерактивних програма", Дон Либес, Процеедингс оф тхе УСЕНИКС Цонференце 1992, стр. 135-144, Сан Антонио, ТКС, 12. и 15. јуна 1992. године. И "Кибитз - повезивање више интерактивних програма заједно", Дон Либес, Софтвер - пракса и искуство, Јохн Вилеи & Сонс, Вест Суссек, Енглеска, Вол.

23, Но. 5, Маи, 1993. И "Дебугер за апликације Тцл", Дон Либес, Зборник радионице Тцл / Тк 1993, Беркелеи, ЦА, 10-11. Јуна 1993.

АУТОР

Дон Либес, Национални институт за стандарде и технологију

ПРИЗНАЊА

Захваљујући Јохн Оустерхоут за Тцл, и Сцотт Паислеи за инспирацију. Захваљујући Роб Савоие за Екпецтов код за аутоконфигурацију.

Датотека ИСТОРИЈА документује велики део еволуције оцекивања . То чини занимљиво читање и може вам дати додатни увид у овај софтвер. Захваљујући људима који су поменути у њему, који су ми послали поправке грешака и пружили другу помоћ.

Дизајн и имплементацију Екпецта делимично је плаћена од стране америчке владе и стога је у јавном домену. Међутим, аутор и НИСТ желе кредит ако се користи овај програм и документација или њихови дијелови.