Linux / Unix команданың күтуі

Сценарий бойынша басқа интерактивті бағдарламалармен сөйлесетін бағдарлама. Сценарийден кейін «Күтілетін» бағдарламасы бағдарламадан не күтіле алатындығын және дұрыс жауап берудің не екенін біледі. Түсіндірілген тіл диалогты бағыттау үшін тармақталған және жоғары деңгейлі басқару құрылымдарын қамтамасыз етеді. Сонымен қатар, пайдаланушы басқаруды басқара алады және қалаған кезде тікелей өзара әрекеттеседі, содан кейін басқаруды сценарийге қайтарады.

Expectk - Expect және Tk қоспасы. Бұл «Expect» және «Tk» тілегі сияқты әрекет етеді. Күтілетін нәтиже тікелей C немесе C ++-де Tcl-мен пайдаланылмайды.

«Күте» деген атау uucp, kermit және модемді басқарудың басқа бағдарламалары арқылы таратылатын жіберу / күту дәйектерінің идеясынан келеді. Алайда uucp-ден айырмашылығы, Expect кез-келген бағдарлама мен тапсырманы ескере отырып, пайдаланушы деңгейіндегі пәрмен ретінде іске қосылуы үшін жалпыланады. Бір уақытта бірнеше бағдарламамен сөйлесуге болады.

Не күте алады?

Мысалға, команданың күтуі мүмкін кейбір нәрселер:

Қабықшаның осы тапсырмаларды орындай алмайтын бірнеше себептері бар. Барлық күту мүмкін.

Жалпы алғанда, Күтуші бағдарлама мен пайдаланушы арасындағы өзара әрекеттесуді қажет ететін кез келген бағдарламаны іске қосу үшін пайдалы. Қажет болғанның бәрі өзара әрекеттесуді бағдарламаланған түрде сипаттауға болады. Күтілетін бақыланатын бағдарламаны тоқтатпай пайдаланушыға бақылауды қайтаруға болады. Сол сияқты, пайдаланушы кез келген уақытта сценарийге бақылауды қайтара алады.

Пайдалану

Күтетін командалардың тізімі үшін cmdfile-ді оқиды. Күтілуде #! сценарийді орындалатын ретінде белгілеп, сценарийдегі бірінші жолды белгілеу арқылы белгілеу:

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

Әрине, бұл жолда өмірдің күткен орыны туралы нақты сипаттау керек. / usr / local / bin - тек мысал.

-c жалауы сценарийде бұрын орындалатын пәрменді көрсетеді. Команданың қабығы бұзылуына жол бермеу үшін котировкалау керек. Бұл опция бірнеше рет пайдаланылуы мүмкін. Көптеген пәрмендерді оларды нүктелі үтірмен бөлу арқылы жалғыз -c орындалуы мүмкін. Командалар пайда болған ретпен орындалады. Expectk пайдалану кезінде бұл опция -command ретінде көрсетіледі.

-d файлы кейбір диагностикалық шығуға мүмкіндік береді, ол ең алдымен күту және өзара әрекеттесу сияқты командалардың ішкі әрекеттерін хабарлайды. Бұл жалауша Expect сценарийінің басында «exp_internal 1» сияқты әсерге ие болады, сонымен бірге «Күтілетін» нұсқасы басып шығарылады.

-D жалауы интерактивті дескрипторды қосады. Толық құндылық керек. Отладчик келесі Tcl процедурасының алдында бақылауды алады, егер мән нөлден тыс болса немесе ^ C басылса немесе тоқтау нүктесі соққы берсе немесе сценарийде басқа тиісті отладчик пәрмені пайда болса. Expectk пайдалану кезінде бұл опция - Debug деп аталады.

-f жалауы пәрмендерді оқуға арналған файлды алдын ала көрсетеді. Тудың өзі міндетті емес, өйткені #! командалық жолда басқа дәлелдер болуы мүмкін. Expectk пайдалану кезінде бұл опция -файл ретінде көрсетіледі.

Әдепкі бойынша, командалық файл жадқа оқылады және толығымен орындалады. Кейде бір жолды файлдарды оқып шығу қажет. Еркін файлдарды осылай өңдей алу үшін, -b жалауын қолданыңыз. Expectk пайдалану кезінде бұл опция - буфер ретінде көрсетіледі.

Егер «-» жолы файл атауымен берілсе, оның орнына стандартты енгізу оқылады. «./-» деген сөзді шынымен «-» деп аталатын файлдан оқыңыз.

-i жалауы, оларды файлдан оқудың орнына командаларға интерактивті түрде сұрауды күтеді. Экспедициялау exit командасы арқылы немесе EOF арқылы тоқтатылады. Командалық файл да, -c де пайдаланылмаса, -i жалаушасы қабылданады. Expectk пайдалану кезінде, бұл опция -Interactive ретінде көрсетіледі.

- опциялардың соңын шектеу үшін пайдаланылуы мүмкін. Бұл оптимизациялық сценарийді «Күте тұрып» түсіндірместен өткізгіңіз келсе пайдалы. Бұл пайдалы! #! кез келген флагман түсіндірілуін болдырмау үшін жол. Мысалы, келесі аргументтерді, айнымалы 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-дағы тиісті жалау - вариант.

Қосымша арглар тізімге салынып, argv және айнымалыға сақталады. argc ұзындығы argv-ға бапталады.

Argv0 скриптің аты немесе екілік екені анықталмаса, ешқандай сценарий пайдаланылмайды. Мысалы, сценарий аты мен алғашқы үш дәлелді басып шығарады:

send_user «$ argv0 [lrange $ argv 0 2] \ n»

Командалар

Құралдың командалық тілін қолданады. Tcl бақылау ағынын қамтамасыз етеді (егер, үзіліс үшін, үзіліс болса), өрнектің бағалауы және рекурсия және процедура анықтамасы сияқты бірнеше басқа мүмкіндіктер. Мұнда пайдаланылатын, бірақ анықталмаған пәрмендер (set, if, exec) Tcl пәрмендері болып табылады. Қосымша командаларды қолдайды деп күтілуде. Егер басқаша көрсетілмесе, команда бос жолды қайтарады.

Командалар алфавиттік түрде тізімделеді, сонда олар тез орналасуы мүмкін. Дегенмен, жаңа пайдаланушылар бұйрықтың сипаттамаларын оқу, жіберу, күту және өзара әрекеттесуді осы тәртіпте оқу арқылы оңайырақ болуы мүмкін.

close [-save] [-onexec 0 | 1] [-i spawn_id]

ағымдағы процестің байланысын жабады. Көптеген интерактивті бағдарламалар EOF -ты өздерінің шабуылына және шығуына анықтайды; әдетте, бұл процесті жою үшін жеткілікті. -i-ту туындысы аталған spawn_id-ке сәйкес келетін процесті жариялайды.

Күтуі және өзара әрекеттесуі ағымдағы процестің қашан аяқталып жатқанын анықтайды, бірақ егер сіз «exec kill $ pid» деп айтсаңыз, процесті өлтірсеңіз, сізге жақын арада қоңырау шалу керек .

-onexec жалауы, spawn идентификаторы кез-келген жаңа нақышталған үрдістерде немесе процестің үстіңгі тақтасында жабылған-болмайтынын анықтайды. Ұрықтау идентификаторын ашық қалдыру үшін, 0 мәнін қолданыңыз. Нөлдік емес бүтін мән мағынада кез келген жаңа процестерде жабық болады.

Ұяшық жалаушасы spawn идентификаторымен байланысқан құлды жабады. Қосылым жабық болған кезде, құл әлі де ашық болғанда автоматты түрде жабылады.

Қосылым жабық немесе анық жабылғандығына қарамастан, тиісті ядро процесінің слотын тазарту үшін күте тұрыңыз. Жабу пәрмені күтуді талап етпейді, себебі процестің жабылуын тоқтату кепілдігі жоқ, себебі ол шығуына әкеледі.

debug [[-now] 0 | 1]

Tcl дескрипторды басқаруды басқарады және үзіліс нүктелерін орнатады.

Егер дәлелдер болмаса, 1 отладчик орындалмаса қайтарылады, әйтпесе 0 қайтарылады.

1 аргументпен отладчик іске қосылды. 0 дәлелімен отладчик тоқтайды. Егер 1 аргумент -now туы алдында болса, түзету құралы дереу іске қосылады. Әйтпесе, отладчик келесі Tcl мәлімдемесімен басталады.

Отладка пәрмені ешқандай тұзақты өзгертпейді. Мұны, -D жалауымен күтуді бастаңыз.

Ажырату пәрмені терминалды үзілген процестен ажыратады. Ол фондық режимде жұмысын жалғастырады. Процестің өз процесстері тобы беріледі. Стандартты I / O / dev / нөлге қайта бағытталады.

Келесі фрагмент сценарийді фонда іске қосуды жалғастыру үшін ажыратуды пайдаланады.

егер {(форк)! = 0} ажыратылса. . .

Келесі сценарий құпия сөзді оқып, әр сағат сайын бағдарламаны іске қосады, ол іске қосылған сайын құпия сөзді талап етеді. Сценарий парольді тек бір рет теру үшін ғана береді.

send_user «пароль?» expect_user -re «(. *) \ n» for {} 1 {} {if {[fork]! = 0} {Ұйқы 3600; жалғастыру} spawn priv_prog күтіңіз Пароль: жіберу «$ expect_out ( 1, жол) \ r «. . . Шығу }

Қабықшалы асинхронды процестің (&) ажыратылуын пайдалану артықшылығы, Күте тұрмағанша дейін терминал параметрлерін сақтай алады, содан кейін оларды жаңа ptys-ге қолдануға болады. With & Expect терезесінде терминалдың параметрлерін оқуға мүмкіндігі болмайды, себебі терминал күту уақытын ажыратып, басқаруды алады.

шығу [-оптар] [мәртебесі]

Себептерді шығару немесе күтуге дайын болу.

-onexit жалаушасы келесі аргументді exit handler ретінде пайдалану үшін тудырады. Аргументсіз ағымдағы шығыс өңдегіші қайтарылады.

-Noexit туы шығуды дайындауды күтеді , бірақ операциялық жүйеге іс жүзінде қайтаруды тоқтатуды тоқтатады. Пайдаланушы анықтаған exit handler, сондай-ақ, Expect өз ішкі өңдегіштерімен іске қосылады. Ешқандай күтіңіз командалар орындалуы тиіс. Егер сіз басқа Tcl кеңейтімдерімен күте тұрсаңыз, бұл пайдалы. Ағымдағы аудармашы (және Tk ортасындағы негізгі терезе) басқа Tcl кеңейтімдерін тазалау үшін қалады. Егер Күтушіні шығу қайта шақырылса (бірақ бұл орын алуы мүмкін болса), өңдегіштер қайта іске қосылмайды.

Шығарғаннан кейін жұлынатын процестерге барлық қосылыстар жабылады. Жабу процестері арқылы EOF ретінде анықталады. шығу қалыпты _exit (2) процедурасынан басқа ешқандай әрекет жасамайды. Осылайша, EOF-ті тексермейтін процедуралар жалғасуы мүмкін. (Әртүрлі жағдайлар, мысалы, бөлінген процесс қандай сигналдар жіберілетінін анықтау үшін маңызды, бірақ олар жүйеге тәуелді болып табылады, әдетте шығу кезінде құжатталған (3).) Орындалатын жалғастырылған процестер init арқылы мұраланған болады.

мәртебесі (немесе 0 егер көрсетілмесе) Expect шығу күйі ретінде қайтарылады. сценарийдің аяқталуына қол жеткізілгенде, шығу міндетті түрде орындалады.

exp_continue [-continue_timer]
Exp_continue командасы әдеттегідей қайтарудың орнына орындауды жалғастыруға мүмкіндік береді. Әдепкі бойынша, exp_continue күту уақытын таймерді қалпына келтіреді. -continue_timer жалауы таймерді қайта іске қосуды болдырмайды. (Қосымша ақпарат күтіңіз .)

exp_internal [-f file] мәні
мәнді нөлге тең болмаса, stderr деп күту үшін диагностикалық ақпаратты ішкі командаларға жібереді. Мән 0-де болса, бұл шығыс өшіріледі. Диагностика ақпараты алынған әр таңбаны қамтиды және барлық шығыс үлгілерге қарсы ағымдағы шығуды сәйкестендіру үшін жасалған.

Қосымша файл жеткізілсе, барлық қалыпты және отладка шығару шығысы сол файлға жазылады (мәннің мәніне қарамастан). Кез келген алдыңғы диагностикалық шығыс файлы жабық.

-info жалауы, соңғы берілген емес дәлелдердің дәлелін қайтару үшін exp_internal туғызады.

exp_open [args] [-i spawn_id]
бастапқы идентификатор идентификаторына сәйкес келетін Tcl файлының идентификаторын қайтарады. Файлдың идентификаторы оны Tcl ашық пәрменімен ашқан секілді қолдануға болады. (Ұяшық идентификаторы енді пайдаланылмауы тиіс.

The -leaveopen жалауы, күту пәрмендері арқылы кіруге арналған идентификатор идентификаторын қалдырады. Көйлек идентификаторында күту орындалуы керек.

exp_pid [-i spawn_id]
ағымдағы процестің сәйкес процесінің идентификаторын қайтарады. Егер -i жалауын қолданса, pid қайтарылған идентификатор идентификаторына сәйкес келеді.

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 қалпына қойылады.

« -exit» белгісімен , « Күте» қате басып шығарады және нұсқасы ескірген болса, шығады.

күтуге [[-opts] pat1 body1] ... [-opts] patn [bodyn]
бір үлгі өрнектелген процестің шығуына, белгілі бір уақыт кезеңі немесе файлдың соңы көрінгенше күтеді. Егер соңғы дене бос болса, оны шығарып тастауға болады.

Ең соңғы wait_before команданың үлгісі кез келген басқа үлгілердің алдында қолданылмайды. Ең соңғы wait_after команданың үлгісі кез-келген басқа үлгілерден кейін пайдаланылады.

Егер барлық күтуге арналған мәлімдемеге дәлелдер бірден көп сызықты талап етсе, барлық аргумент әр сызықты кері қиғаш сызықпен тоқтату үшін біреуіне «таралуы» мүмкін. Бұл жағдайда кәдімгі Tcl алмастырушылары қаңылтырға қарамастан пайда болады.

Егер үлгі кілт сөз болса, тиісті орган файлдың соңында орындалады. Егер үлгі кілт сөздің күту уақыты болса, тиісті орган уақытша тоқтатылғанда орындалады. Егер күту уақытының кілт сөзі пайдаланылмаса, күту уақытында нөлдік нөлдік әрекет орындалады. Әдепкі кідірту уақыты 10 секунд, бірақ «30 уақытты орнатыңыз» пәрмені арқылы 30-ға орнатуға болады. Шексіз күту уақыты -1 мәнімен тағайындалуы мүмкін. Егер үлгі кілт сөзді дефолт болып табылса, сәйкесінше орган кез-келген уақытта немесе файлдың соңында орындалады.

Егер үлгі сәйкес келсе, тиісті орган орындалады. күтуі дененің нәтижесін қайтарады (немесе ешқандай үлгі сәйкес болмаса, бос жол). Бірнеше үлгіні сәйкестендіретін болса, алдымен пайда болатын біреу денені таңдау үшін қолданылады.

Әрбір жаңа нәтиже келгенде, олар тізімде берілген тәртіпте әрбір үлгі бойынша салыстырылады. Осылайша, сіз матчтың жоқтығын тексере аласыз, мысалы, соңғы нұсқаны шығаруды кепілденген нәрсені жасау, мысалы, шақыру. Кездейсоқ болмаған жағдайда, күту уақытын пайдалануыңыз керек (сіз қолмен өзара әрекеттескен болсаңыз сияқты).

Үлгілер үш жолмен анықталады. Әдепкі бойынша, үлгілер Tcl-ның жолды сәйкестік пәрменінде көрсетіледі. (Мұндай үлгілер әдетте «Глоб» үлгілері деп аталатын C-қабығының қалыпты өрнектеріне ұқсас). -Gl-ті жалаушалардан күте алмайтын үлгілерді қорғау үшін пайдалануға болады. «-» басталатын кез келген үлгі осы жолмен қорғалуы тиіс. («-» басталатын барлық жолдар болашақ опциялар үшін сақталған.)

Мысалы, келесі үзінді табысты кіруді іздейді. ( Абортты сценарийде басқа жерде анықталған іс рәсімі деп қарастырыңыз).

күту {busy {puts busy \ n; exp_continue} сәтсіз аяқталды «жарамсыз пароль» үзіліс күту үзілген қосылды}

Төртінші үлгіде баға белгілеу қажет, себебі ол кеңістікті қамтиды, ол басқаша үлгіден әрекетті ажыратады. Бірдей әрекеті бар үлгілер (мысалы, 3-ші және 4-ші) әрекеттерді қайта тізімдеуді талап етеді. Бұл regexp стилінің үлгілерін пайдалану арқылы болдырмауға болады (төменде қараңыз). Glob-style үлгілерін жасау туралы қосымша ақпаратты Tcl нұсқаулығынан табуға болады.

Regexp стилінің үлгілері Tcl-ның regexp (қысқа «тұрақты өрнекті») үшін анықталған синтаксисті сақтайды. regexp үлгілері жалауша -re бірге енгізіледі. Алдыңғы мысал ретінде regexp көмегімен қайта жазылады:

күту {busy {puts busy \ n; exp_continue} -re «сәтсіз аяқталды | жарамсыз пароль» үзіліс күту үзілген}

Үлгілердің екеуі де «қолайсыз». Бұл үлгілердің бүкіл жолға сәйкес келмейтінін білдіреді, бірақ матчты жолдың кез келген жерінен бастауға және аяқтауға болады (барлық сәйкес келгенше). Жолдың басына сәйкестендіру үшін ^ және соңын сәйкестендіру үшін $ пайдаланыңыз. Жолдың аяқталуын күтуге болмасаңыз, жауаптарыңыз жолдың ортасында оңай аяқталуы мүмкін, себебі олар өрілген процестен шығарылады. Дұрыс нәтижелерді шығарып жатқанда, өнім қалыпты емес көрінуі мүмкін. Осылайша, егер сіз жолдың соңындағы таңбаларды нақты сипаттай алсаңыз, $ пайдалануға болады.

Айта кету керек, көптеген редакторларда ^ және $ тиісінше жолдың басы мен соңына сәйкес келеді. Дегенмен, күту сызыққа бағдарланған емес, себебі бұл таңбалар қазіргі уақытта күтілетін буферде күтілетін деректердің басында және соңында (сызықтарға қарағанда) сәйкес келеді. (Сондай-ақ, төмендегі ескертуді қараңыз «жүйке нашарлауы».)

-ex жалауы үлгісін «дәл» жол ретінде сәйкестендіреді. *, ^, Және т.б. түсіндірмелері жасалмаған (әдеттегі ТЛЛ конвенцияларының сақталуы керек). Нақты үлгілер әрдайым қабылданбайды.

-Nocase жалауы кіші әріп таңбалары секілді салыстыру үшін бас әріптің таңбаларын шығарады. Үлгі әсер етпейді.

Шығарған кезде 2000 байтты бұрынғы байттарды «ұмытып кету» мүмкін. Бұл match_max функциясымен өзгертілуі мүмкін. (Үлкен үлкен мәндер үлгіні салыстыруды баяулатуы мүмкін екендігін ескеріңіз.) Егер тізім толық тізімде болса, сәйкесінше match_max байт алынды және басқа үлгілер сәйкес болмаса орындалады. Full_buffer кілт сөзі пайдаланылған ба, жоқ па, ұмытылған таңбалар wait_out (буфер) үшін жазылған.

Егер тізім элементі null болып табылады және nulls ( команда remove_nulls арқылы), онда тиісті орган орындалады, егер бір ASCII 0 сәйкес келеді. 0 байтқа glob немесе regexp үлгілері арқылы сәйкестендіру мүмкін емес.

Үлгіні сәйкестендіргенде (немесе eof немесе full_buffer), кез келген сәйкесті және алдын-ала теңдесі жоқ шығыс expect_out (буфер) айнымалысында сақталады. Up to 9 regexp substring сәйкестігі expect_out (9, string) арқылы wait_out ( 1, string) айнымалыларында сақталады. Егер үлгіге дейін - индекстер жалауын қолданса , онда 10 жолдың бастапқы және аяқталу көрсеткіштері ( латентке лайықты пішінде ) күтілетін_та (X, бастау) және wait_out (X, end) айнымалы мәндерінде сақталады, мұндағы X - сандық, аралықта ішкі жолға сәйкес келеді. 0 - бүкіл үлгіге сәйкес келетін және glob үлгілері үшін жасалған, сондай-ақ, regexp үлгілеріне арналған жолдарды білдіреді. Мысалы, егер процесс «abcdefgh \ n» нәтижесін шығарса, нәтиже:

күту «cd»

келесідей мәлімдемелер орындалды:

set expect_out (0, жол) cd set expect_out (буфер) abcd

және «efgh \ n» шығыс буферінде қалды. Егер процесс «abbbcabkkkka \ n» нәтижесін шығарса, нәтиже:

(b +). (k +) «

келесідей мәлімдемелер орындалды:

set expect_out (0, start) 1 set expect_out (0, end) 10 set expect_out (0, string) bbbcabkkk set expect_out (1, start) 2 set expect_out (1, end) 3 set expect_out (1, string) bb set expect_out (2, бастау) 10 set expect_out (2, end) 10 set expect_out (2, string) k set_out (buffer) abbbcabkkkk

және «a \ n» шығыс буферінде қалады. «*» Үлгісі (және -re «. *») Процестен шыққан нәтижені оқымай шығыс буферін жояды.

Әдетте, сәйкес қойылған нәтиже Expect ішкі буферінен алынады. Бұл -notransfer жалаушасы бар үлгіні префикстеу арқылы болдырмауға болады. Бұл туын әсіресе эксперимент жүргізуде пайдалы (және эксперимент кезінде ыңғайлылық үшін «жоқ» деп қысқартылуы мүмкін).

Сәйкес шығумен (немесе eof немесе full_buffer) байланыстырылған идентификатор expect_out (spawn_id) ішінде сақталады.

Уақытша туы ағымдағы күту пәрменін келесі мәнді күту уақытының айнымалы мәнінің орнына күту уақыты реті ретінде пайдалануына әкеледі.

Әдепкі бойынша, үлгілер ағымдағы процестен шығып шыққанмен сәйкес келеді, бірақ -i жалаушасы аталған spawn_id тізімінен шығуды кез келген келесі үлгілерге (келесі -и дейін) салыстырады. Spawn_id тізімі spawn_ids немесе spawn_ids сияқты тізімге сілтеме жасайтын айнымалы бос орын болуы керек.

Мысалы, келесі мысал $ proc2 деп аталатын spawn_id ішінен ағымдағы процестен немесе «бос емес», «сәтсіз» немесе «жарамсыз парольден» қосылғанын күтеді.

күткен {-i $ proc2 бос емес {puts busy \ n; exp_continue} -re «сәтсіз аяқталды | жарамсыз пароль» үзіліс күту үзілген}

Any_spawn_id жаһандық айнымалы мәні ағымдағы күту пәрменіндегі басқа барлық -i жалауларымен аталатын spawn_ids үлгілеріне сәйкес келу үшін пайдаланылуы мүмкін. Spawn_id ешқандай байланысты емес үлгідегі (яғни, басқа бір -и) кейінгі -i жалауынан бастап, any_spawn_id-ке қатысты бірдей күту пәрменіндегі кез-келген басқа үлгілерге қол жетімді болады .

-i жалауының айнымалы идентификаторлар тізіміне оқылатыны жаһандық айнымалы деп аталуы мүмкін. Айнымалысы өзгерген кезде қайталанады. Бұл пәрмен орындалу кезінде енгізу / шығару көзін өзгерту әдісін ұсынады. Өсімдіктің идентификаторлары осы жолмен «жанама» ұрық идентификаторлары деп аталады.

Үзіліс және жалғастыру сияқты әрекеттер басқару құрылымдарын (яғни, proc үшін ) әдеттегідей әрекет етеді. Exp_continue командасы әдеттегідей қайтарудың орнына орындауды жалғастыруға мүмкіндік береді.

Бұл анық ілмектерді немесе қайталанатын болжамды мәлімдемелерді болдырмау үшін пайдалы. Төмендегі мысал рлогинді автоматтандыру үшін фрагменттің бөлігі болып табылады. Exp_continue рлогин құпия сөзді сұраса , екінші күту туралы өтініш жазудан аулақ болады .

күтуге болады {password: {stty-let_user -re «(. *) арналған $ user) пароль ($ user). \ n» send_user «\ n» жіберу «$ expect_out (1, string) \ r» echo exp_continue} қате} {send_user «invalid password немесе account \ n» exit} timeout {send_user «$ хостқа қосылуға уақыт \ n» exit} {host_user \ «host failed to connect = failed_out (buffer)» exit} $ $ шақыру}

Мысалы, келесі фрагменттер пайдаланушыға басшылыққа толықтай автоматтандырылған әрекеттесуге көмектесуі мүмкін. Бұл жағдайда терминал шикізат режиміне қойылады. Егер пайдаланушы «+» басылса, айнымалы мән артады. Егер «p» басылса, процеске бірнеше қайтарулар жіберіледі, мүмкін, оны қандай да бір жолмен толтыруға болады, ал «i» пайдаланушыға сценарийден басқаруды тиімді түрде ұрлауға мүмкіндік береді. Әрбір жағдайда exp_continue ағымдық әрекетті орындағаннан кейін үлгіні сәйкестендіруді жалғастыруға мүмкіндік береді.

күту мерзімі өткеннен кейін {-i $ user_spawn_id «p» {send «\ r \ r \ r»; exp_continue} «+» {incr foo; exp_continue} «i» {өзара әрекет; exp_continue} «шығу» exit}

Әдепкіде, exp_continue күту уақытын таймерін қалпына келтіреді. Exp_continue --continue_timer жалауымен шақырылса , таймер қайта іске қосылмайды .

күту_финансынан [expect_args]
expect_b алдында бірдей жұмыс істейді, сонымен қатар күтілетін күткеннен және болжамнан кейінгі үлгілер сәйкес келсе, күту үлгісі пайдаланылады. Қосымша ақпарат алу үшін wait_before командасын қараңыз.

expect_background [expect_args]
күткендей дәлелдерді қабылдайды, бірақ ол бірден қайтарылады. Жаңа кіріс келгенде үлгілер тестіленеді. Үлгінің күту уақыты мен әдепкі параметрі күтуге болмайды және үнсіз тасталады. Әйтпесе expect_background команда expect_before және expect_after үлгілерін күткендей пайдаланады .

Күтілетін кері бағытта әрекеттер бағаланған кезде, бірдей жұлын id үшін өңдік өңдеу бұғатталған. Әрекет аяқталғанда, өңді өңдеу бұғатталған. Фонды өңдеу бұғатталған кезде, бірдей масштабтау идентификаторында (алдыңғы) күтуге болады.

Expect_background бұғатталған кезде күтуді орындау мүмкін емес. expect_background нақты spawn идентификаторы үшін сол күңгірт идентификаторымен жаңа expect_background жариялау арқылы жойылады. Күту үлгісінің жоқтығы туралы мәлімдеме берілгенде, берілген spawn идентификаторы фондағы үлгіні сәйкестендіру мүмкіндігінен жойылады .

күту_быстары [күту_архтары]
күткендей дәлелдерді қабылдайды, бірақ ол бірден қайтарылады. Ең соңғы expect_b бұрынғы біріктіру идентификаторымен жасалған үлгі-әрекеттер жұптары кез-келген келесі күту пәрмендеріне жанама түрде қосылады. Егер үлгі сәйкес келсе, ол ол күткен командада көрсетілгендей қабылданады және байланысты орган күту командасының мәтінмәнінде орындалады. Егер күткендей expect_before және күту үлгісі сәйкес келуі мүмкін болса, expect_before үлгісі пайдаланылады.

Егер үлгі көрсетілмесе, spawn идентификаторы кез-келген үлгі үшін тексерілмейді.

A -i жалаушасы бойынша алдын-ала ескертілмейінше , expect_before командасы орындалған кезде (оның үлгісі сәйкестендірілмеген кезде) анықталған ұрық идентификаторына сәйкес келеді.

The -info жалаушасы сәйкес келетін қандай үлгілердің ағымдағы спецификациясын қайтаруға күтуге болады. Әдепкі бойынша, ағымдағы ағызу идентификаторы туралы хабарлайды. Бұл spawn идентификаторы туралы мәлімет үшін қосымша spawn id сипаттамасы берілуі мүмкін. Мысалға

expect_before -info -i $ proc

Көптеген бірде-бір спрейдің идентификаторы болуы мүмкін. Flag -indirect тек жанама сипаттамалардан келетін тікелей ұрық идентификаторларын басады.

Орнату идентификаторы сипаттамасының орнына «-all» жалауы «-info» барлық ұрық идентификаторлары туралы хабарлауға әкеледі.

-info жалауын шығару expect_before аргументі ретінде қайта пайдалануға болады.

күтуге тұрарлық [expect_args]
күтуге болады, бірақ ол / dev / tty (яғни пайдаланушыдан басу арқылы) таңбаларын оқиды. Әдепкі бойынша, оқу пісірілген режимде орындалады. Осылайша, сызықтар оларды көруді күту үшін қайтарумен аяқталуы керек. Бұл stty арқылы өзгертілуі мүмкін (төмендегі stty пәрменін қараңыз).

wait_user [expect_args]
күтуге болады, бірақ ол stdin-ден кейіпкерлерді оқиды (яғни, пайдаланушыдан басу арқылы). Әдепкі бойынша, оқу пісірілген режимде орындалады. Осылайша, сызықтар оларды көруді күту үшін қайтарумен аяқталуы керек. Бұл stty арқылы өзгертілуі мүмкін (төмендегі stty пәрменін қараңыз).

шанышқы
жаңа процесс жасайды. Жаңа үдеріс қазіргі күтілетін процестің дәл көшірмесі болып табылады. Сәттілік бойынша, фор 0 жаңа (бала) процесіне қайтарады және еншілес процестің процесінің идентификаторын қайтарады. Қате туралы (әрдайым ресурстың болмауы себебінен, мысалы, своп кеңістігі, жады), форма ата-аналар процесіне -1 қайтарады және ешқандай бала процесі жасалмайды.

Түпнұсқалық процестер , түпнұсқалық процесс сияқты, exit командасынан шығып кетеді . Журнал файлдарына жазылған процестерді жазуға рұқсат етіледі. Егер процестердің көпшілігінде отладтануды немесе тіркеуді ажыратпасаңыз, нәтиже шатастыруы мүмкін.

Кейбір pty бағдарламаларын бірнеше оқырмандар мен жазушылар тіпті бір сәтте шатастыруы мүмкін. Осылайша, уылдырық шашу үдерістерінен бұрынғыдан да қауіпсіз болуға болады.

өзара әрекет [string1 body1] ... [stringn [bodyn]]
ағымдағы процесті басқаруға мүмкіндік береді, сондықтан ағымдағы үрдіске басу пернелері жіберіледі және ағымдағы үрдістің stdout және stderr қайтарылады.

Сызық-денелі жұп дәлел ретінде көрсетілуі мүмкін, бұл жағдайда тиісті жол енгізілген кезде дене орындалады. (Әдепкі бойынша, жол ағымдық процесте жіберілмейді.) Егер түпкілікті дене жоқ болса, аудармашы пәрмені қабылданады.

Егер барлық өзара әрекеттесу туралы мәлімдемеге дәлелдер бірден көп жолды қажет етсе, онда әрбір аргумент кері қиғаш сызықпен аяқталмау үшін барлық аргументтерді «біріктіруге» болады. Бұл жағдайда кәдімгі Tcl алмастырушылары қаңылтырға қарамастан пайда болады.

Мысалы, төмендегі пәрмен анықтайтын төмендегі жолы-дене жұптарымен әрекеттеседі: ^ Z басылғанда, Күте тоқтатылады. (The -reset жалауы терминал режимдерін қалпына келтіреді.) ^ 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»}} ~~}

Жолдық-жұп жұптарда жолдар дәлел ретінде берілген тәртіпте сәйкес келеді. Ішінара сәйкестендірілетін жолдар қалған уақыттың күтілуіне байланысты ағымдағы үрдіске жіберілмейді. Егер кейіпкерлерді кейінірек сәйкестік болмаса, жолдың бөлігі ғана басқа матчты бастау мүмкін емес процесіне жіберіледі. Осылайша, сәйкестікке әрекет жасайтын түпнұсқалық жолдар ақырында сәтсіздікке ұшыраса, ішінара сәйкестіктердің қосындылары кейінірек сәйкес келеді.

Әдепкі бойынша жолды сәйкестендіру ешқандай жабайы карталармен дәл емес. (Керісінше, күту пәрмені әдепкі бойынша глоб стилінің үлгілерін қолданады.) -ex жалауы басқа әрекеттерден туындайтын жалаушалармен сәйкес келуі мүмкін үлгілерді қорғау үшін пайдаланылуы мүмкін. «-» басталатын кез келген үлгі осы жолмен қорғалуы тиіс. («-» басталатын барлық жолдар болашақ опциялар үшін сақталған.)

-re жалауы жолды regexp стилінің үлгісі ретінде түсіндіруге мәжбүр етеді. Бұл жағдайда сәйкес подстроков айнымалы interact_out- де сақталады, осылайша күтілетін нәтиже expect_out айнымалысында сақталады . Тудың жалауы ұқсас.

Eof үлгісі файлдың соңында орындалған әрекетті енгізеді. Сонымен қатар, eof үлгісі - шығыс жазу жалаушасын ұстануы мүмкін, бұл жағдайда eof жазу кезінде анықталады. Әдепкі eof әрекеті - «return», сондықтан өзара әрекеттесу кез келген EOF-ға қайтарылады.

Үлгінің күту уақыты күту уақытын (секундтармен) және белгілі бір уақыт ішінде ешқандай таңбалар оқылмағаннан кейін орындалатын әрекетті енгізеді. Тайм-аут үлгісі соңғы рет көрсетілген процесте қолданылады . Әдепкі тайм-аут жоқ. Арнайы айнымалы «timeout» ( күту командасы пайдаланатын) осы уақытша күту уақытына әсер етпейді.

Мысалы, келесі мәлімдеме бір сағат ішінде ештеңе термеген, бірақ жүйелік хабарлар жиі кездесетін пайдаланушыларды авторландыру үшін пайдаланылуы мүмкін:

өзара әрекет - $ user_spawn_id күту уақыты 3600 return -output \ $ spawn_id

Егер үлгі кілт сөзді нөлге тең болса және nulls рұқсат етілсе (команда remove_nulls арқылы), сәйкес ASCII 0 сәйкестігі сәйкес орган орындалады. 0 байтқа glob немесе regexp үлгілері арқылы сәйкестендіру мүмкін емес.

Flag -ywrite жалауымен алдын ала белгілеу interact_out (spawn_id) параметрін үлгіге (немесе eof) сәйкес келетін spawn_id мәніне орнатуға себеп болады.

Үзіліс және жалғастыру сияқты әрекеттер басқару құрылымдарын (яғни, proc үшін ) әдеттегідей әрекет етеді. Дегенмен, қайтару себептері шалушыға оралу үшін өзара әрекеттеседі, ал inter_return қоңырау шалушыда қайтару үшін өзара әрекеттеседі . Мысалы, егер «proc foo» деп аталатын интеракт , онда inter_return әрекетін орындайтын болса , proc foo қайтарылады. (Бұл интерактивті интерпретатор интерактивті түрде кері қайтару арқылы өзара әрекеттесуді жалғастырады, ал inter_return өзара әрекеттесуді шалушыға қайтаруға әкеледі дегенді білдіреді.)

Өзара қарым-қатынас кезінде шикізат режимі барлық таңбаларды ағымдағы үрдіске жіберуі үшін пайдаланылады. Ағымдағы үрдіс жұмыс бақылау сигналдарын ұстамаса, тоқтату сигналы жіберілген жағдайда тоқтатылады (əдепкі бойынша ^ Z). Оны қайта іске қосу үшін жалғастыру сигналын жіберіңіз («kill -CONT» сияқты). Егер сіз шынымен SIGSTOP-ты осындай процесті (Z ^ арқылы) жібергіңіз келсе, алдымен уылдырықтау csh деп қарастырыңыз, содан кейін бағдарламаны іске қосыңыз. Екінші жағынан, SIGSTOP-ды өзіңіз күтуге жібергіңіз келсе, алдымен аудармашыға қоңырау шалыңыз (мүмкін, құтқару таңбасын қолдану арқылы), содан кейін ^ Z түймесін басыңыз.

String-body жұбын интерпретаторға енуді болдырмау және командаларды интерактивті орындау үшін стенография ретінде пайдалануға болады. Алдыңғы терминал режимі жол-денелі жұптың корпусының орындалуында пайдаланылады.

Жылдамдық үшін, әрекеттер әдепкі бойынша шикізат режимінде орындалады. -жалпы жалауша терминал өзінің өзара әрекеті орындалмас бұрын күйге келтіреді (өзгеріссіз, пісірілген режим). Режимді қосқан кезде енгізілген таңбалар жоғалуы мүмкін екенін ескеріңіз (кейбір жүйелерде терминал драйверінің сәтсіз сипаты). Пайдаланудың жалғыз себебі - сіздің әрекетіңіз дайындалған күйде жұмыс істеуге байланысты болса.

The -echo жалаушасы келесі таңбаға сәйкес келетін таңбаларды әр таңба ретінде оқыған процессге қайта жібереді. Пайдаланушы ішінара терілген үлгілерден кері байланыс көруі керек болғанда пайдалы болуы мүмкін.

Егер үлгі қайталанса, бірақ сәйкес келмейтін болса, кейіпкерлер таңбаланған үдерісіне жіберіледі. Егер біткен процесс оларды жаңғыртса, пайдаланушы кейіпкерлерді екі рет көреді. -эко , пайдаланушы үлгіні толықтыра алмайтын жағдайда ғана мүмкін. Мысалы, келесі үзінді rftp-тан, рекурсивтік-ftp-сценарийден тұрады, онда пайдаланушыға ағымдағы каталогты рекурсивті түрде алу, қою немесе тізімдеу үшін ~ g, ~ p немесе ~ l енгізу сұралады. Олар әдеттегі FTP командаларынан алыс, бұл пайдаланушыға қателіктерден басқа ештеңе болмайды, бұл жағдайда олар кез-келген нәтижені елемейді.

{-echo ~ g {getcurdirectory 1} -эхо ~ l {getcurdirectory 0} -эхо ~ p {putcurdirectory}}

-таңбалар жалауы, таңбалар оқылғандай , шығыс процесіне келесі үлгіні сәйкес келетін таңбаларды жібереді.

Бұл бағдарламаны жаңғыртуға мүмкіндік беру үшін пайдалы. Мысалы, адам теруді бақылауға арналған (Hayes-стилі модемі) бақылау үшін пайдаланылуы мүмкін. Әр уақытта «атд» көрінеді, сценарий қалған бөліктерді тіркейді.

proc lognumber {interact -nobuffer -re «(. *) \ r» returns puts $ log «[clock format [clock clock]]: dialed $ interact_out (1, string)»} interaction -nobuffer «atd» lognumber

Өзара әрекеттесу кезінде log_user-дің бұрынғы қолданысы еленбейді. Атап айтқанда, өзара әрекеттесу оның шығуын тіркеуге мәжбүр етеді (стандартты өнімге жіберіледі), себебі ол соқырлармен өзара әрекеттесуді қаламайды деп болжанады.

-o-тегі ағымдық үрдістің шығуына кез келген келесі кілт-форманың жұптарын қолдануға әкеледі. Бұл, мысалы, telnet сеансында қажет емес таңбаларды жіберетін хосттармен жұмыс істеген кезде пайдалы болуы мүмкін.

Әдепкі бойынша, өзара әрекеттесіп , пайдаланушыға stdin жазуды және Күтіп тұрған процестің өзіндік stdout-ін оқуды күтеді . -u жалауы («пайдаланушы» үшін) пайдаланушыны оның аргументі (үтірленген идентификатор болуы керек) деп аталатын процесс ретінде өзара әрекеттесуді жасайды.

Бұл анық емес циклды пайдаланбай, екі байланысты емес процестерді біріктіруге мүмкіндік береді. Отладка келтіруге көмектесу үшін, Диагностиканы күту әрқашан stderr-ға (немесе белгілі бір журналға жазу және отладтау туралы ақпарат үшін stdout) өтіңіз. Сол себепті аудармашы командасы stdin-дан интерактивті түрде оқиды.

Мысалы, келесі фрагментке кіру процесі жасалады . Содан кейін ол пайдаланушыға (көрсетілмеген) теріп, соңында екеуін біріктіреді. Әрине, кез-келген процесс кіру үшін ауыстырылуы мүмкін. Мысалы, қабықша пайдаланушыға тіркелгі мен құпия сөзсіз жұмыс істеуге мүмкіндік береді.

spawn_id spawn tip модем # қолданушыны кері шақыру үшін # қолданушыны кіруге кірісу -u $ login

Бірнеше процестерге шығуды жіберу үшін, - әр өрнектің идентификатор тізімін - «жалауша» жалаушасы арқылы алдын ала көріңіз. Шығару идентификаторы идентификаторларының тобына кіру- input жалауымен алдын ала берілген spawn id тізімімен анықталуы мүмкін. (Екі кірістіру және кіру - тізімдерді күту пәрменінде -i туымен бірдей формада алуға болады , қоспағанда, кез келген_spawn_id өзара әрекеттесуінде маңызды емес.) Барлық келесі жалаушалар мен жолдар (немесе үлгілер) кіріс жалауы пайда болады. Егер ешбір нәтиже көрсетілмесе, -output білдіреді «-input $ user_spawn_id -output». (Сол сияқты, -негізгісі жоқ үлгілермен бірге ). Егер бір мән көрсетілсе, онда $ user_spawn_id жазылады. Егер екінші нәтиже көрсетілсе, онда $ spawn_id жазылады. Қосымша кіріс жалаулары көрсетілуі мүмкін.

Екі кірістірілген кіріс процестері өздерінің қорытындыларын $ spawn_id және $ user_spawn_id (керісінше) ретінде көрсетуге қалдырады. Егер - енгізу жалаушасы қол жетімді жалаумен көрсетілсе, сол процестегі таңбалар алынып тасталады.

-i- жалаушасы ағымдағы spawn_id-ді ауыстыруды енгізбесе, басқа ешқандай -not немесе -output жалаушалары пайдаланылмайды. A -i жалауы -o жалауын білдіреді.

Жіберілген идентификатор идентификаторларын пайдалану арқылы өзара әрекеттесетін процестерді өзгертуге болады. (Жанама идентификатор идентификаторлары күту пәрменіндегі бөлімде сипатталған.) Жанама идентификатор идентификаторлары -i, -u, -nput, немесе -output жалаушаларымен көрсетілуі мүмкін.

аудармашы [args]
Пайдаланушыны күту және Tcl пәрмендері үшін интерактивті түрде шақыруға әкеледі. Әрбір команда нәтижесі басып шығарылады.

Үзіліс және жалғастыру сияқты әрекеттер басқару құрылымдарын (яғни, proc үшін ) әдеттегідей әрекет етеді. Алайда, қайтару аудармашыға қоңырау шалушыға қайтаруға себеп болады, ал интерпретер интерпретаторды шақырушыда қайтаруды тудырады. Мысалы, егер «proc foo» интерпретер деп атайтын болса, онда inter_return әрекетін орындайтын болса , proc foo қайтарылады. Басқа командалар аудармашы жаңа командаларға сұрақ қоюды жалғастырады.

Әдепкіде, шақыруда екі бүтін сан бар. Бірінші бүтін санның бағалау тереңдігін сипаттайды (яғни, Tcl_Eval қанша рет шақырылған). Екінші бүтін сан - Tcl тарихының идентификаторы. Сұрауды «return1» деп аталатын рәсімді анықтау арқылы орнатуға болады, қайда қайтару мағынасы келесі шақыру болады. Егер өтініште ашық тырнақшалар, паренс, жақшалар немесе жақшалар болса, жаңа жолда (әдепкі бойынша «+>») қосымша нұсқа беріледі. Екінші шақыру «prompt2» деп аталатын рәсімді анықтау арқылы орнатылуы мүмкін.

Аудармашыда , қоңырау шалушы шикізат режимін пайдаланса да, пісірілген режим пайдаланылады.

Егер stdin жабық болса, интерпретатор жалауша пайдаланылмайынша қайтарылады, бұл жағдайда келесі аргумент қолданылады.

log_file [args] [[-a] файл]
Егер файл атауы берілсе, log_file файлда сеанстың транскрипциясын жазады (осы нүктеден бастап). log_file ешқандай дәлел берілмесе, жазуды тоқтатады. Кез-келген алдыңғы журнал файлы жабық.

Файл атауы орнына, Tcl файлының идентификаторы -open немесе -leaveopen жалаушаларын пайдалану арқылы қамтамасыз етілуі мүмкін. Бұл spawn командасына ұқсас. (Толық ақпарат алу үшін көкөністі қараңыз.)

-A жалау журналды log_user пәрменімен басып тастанды .

Әдепкі бойынша, log_file пәрмені оларды бір рет сеанста бірнеше рет өшіруге ыңғайлы болу үшін оларды қысқартуға емес, ескі файлдарға қосады . Файлдарды қысқарту үшін - белгісіз жалаушаны пайдаланыңыз.

-info туы лог_файлды берілген ең соңғы мәліметсіз аргументтердің сипаттамасын қайтаруға әкеледі.

log_user-info | 0 | 1
Әдепкі бойынша, жіберу / күту диалогы stdout-ға (және ашық болған жағдайда логфайлға) жазылады. Stdout тіркеуі «log_user 0» пәрмені арқылы өшіріледі және «log_user 1» арқылы қайта қосылады. Журнал файлына кіру өзгеріссіз.

-info туы log_user-ге берілген ең соңғы мәліметсіз аргументтердің сипаттамасын қайтаруға әкеледі.

match_max [-d] [-i spawn_id] [size]
күту арқылы ішкі пайдаланылатын буфердің өлшемін (байттармен) анықтайды. Өлшем дәлелсіз болса, ағымдық өлшем қайтарылады.

-d жалауымен әдепкі өлшем орнатылады. (Бастапқы әдепкі 2000). -i жалауымен өлшемі көрсетілген spawn идентификаторы үшін орнатылады, әйтпесе ол ағымдағы процесте орнатылады.

қабаттастыру [- # spawn_id] [- # spawn_id] [...] бағдарлама [args]
ағымдағы күтілу бағдарламасының орнына «бағдарлама аргаларын» орындайды, ол аяқталады. Жалаңаш сызық аргументі, сызықшаның кіру қабығы секілді команда атауының алдында сызықшаны күштейді. Барлық spawn_ids дәлелдер деп аталатындардан басқа, жабылады. Олар аталған файл идентификаторларына салыстырылады.

Spawn_ids мұрагердің жаңа бағдарламасына арналған идентификаторларды файлдармен салыстырылады. Мысалы, келесі сызба шахматпен айналысады және оны ағымдағы үдеріспен басқаруға мүмкіндік береді, мысалы, шахмат шебері.

қабаттастыру -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id шахмат

Бұл «өзара әрекеттесу» -ден әлдеқайда тиімді, дегенмен, « Күтілетін процесс» енді бақыланбайтындықтан, ол бағдарламаланған әрекеттесуді орындау мүмкіндігін құрбан етеді.

Ешбір бақылаушы терминал қарастырылмаған. Осылайша, стандартты енгізуді ажырату немесе қайта өңдеуді жүзеге асыратын болсаңыз, жұмыс орнын басқаратын бағдарламалар (қабықшалар, кіру және т.б.) дұрыс жұмыс істемейді.

parity [-d] [-i spawn_id] [мән]
тепе-теңдікті сақтап қалу немесе шығарылған процестердің шығуын анықтайды. Егер мән нөлге тең болса, онда парита алынып тасталады, әйтпесе ол жойылмайды. Мәнсіз аргументсіз ағымдағы мән қайтарылады.

-d жалауымен әдепкі теңдік мәні орнатылады. (Бастапқы әдепкі бойынша 1 тең, яғни теңдік жойылмайды.) -i жалауымен теңдестірілген мән аталған spawn идентификаторы үшін орнатылады, әйтпесе ол ағымдағы процесс үшін орнатылады.

remove_nulls [-d] [-i spawn_id] [value]
nulls сақталмаған немесе шығарылған процестердің шығуынан немесе күдікті немесе interact_out айнымалы мәндерін сақтау немесе сақтамас бұрын анықтайды . Мән 1 болса, бос мәндер жойылады. Егер мән 0 болса, бос мәндер жойылмайды. Мәнсіз аргументсіз ағымдағы мән қайтарылады.

-d жалауымен әдепкі мән орнатылады. (Бастапқы әдепкі 1 тең, яғни нөлдер алынып тасталады.) -i жалауымен мән аталатын spawn идентификаторы үшін орнатылады, әйтпесе ол ағымдағы үрдіске орнатылады.

Нөлдер алынып тасталса да, жоқ па, күту нөлдік байттарды журналға және stdout-ге жазады.

[-flags] жолын жіберіңіз
Ағымдағы жолға жол жібереді. Мысалы, команда

«hello world \ r» жіберіңіз

ағымдағы процестің кейіпкерлерін helloworld жібереді. (Tcl құрамында күрделі күрделі жолдарды құруға болатын printf- ұқсас пәрмен ( формат деп аталады) бар.)

Таңбалар дереу жіберіледі, бірақ жол-буферлік кірістері бар бағдарлама таңбаларды қайтару таңбасын жібермейінше оқымайды. Қайтару таңбасы «\ r» деп белгіленеді.

- Ту келесі аргументті жалауша емес, жол ретінде түсіндіреді. Кез келген жолды «-» алдында туға ұқсайды ма немесе жоқ ба? Бұл кездейсоқ тулар сияқты көрінетін айнымалы сызықтарды анықтаудың сенімді механизмін қамтамасыз етеді. («-» басталатын барлық жолдар болашақ опциялар үшін сақталған.)

-i- жалауы жолдың аталған spawn_id-ке жіберілуін жариялайды. Spawn_id - user_spawn_id болса және терминал шикізат режимінде болса, жолдағы жаңа сызықтар терминал жаңа піскен режимде болғандай болып көрінуі үшін жаңа жолды қайтарады. Бұл жалауша бұл аударманы өшіреді.

-Null жалау нөлдік таңбаларды (0 байт) жібереді. Әдепкі бойынша, бір нөл жіберіледі. Толық бүтін сан нөлдер жіберілетінін көрсету үшін -NULL- ды ұстануы мүмкін.

Жарық жалауы үзіліс шартын жасайды. Бұл спринг идентификаторы «spawn -open» арқылы ашылған tty құрылғысына қатысты болса ғана мағынасы бар. Ұшақ тәрізді үдерісті жасасаңыз, үзіліс жасау үшін кеңестердің конвенциясын пайдалануыңыз керек.

The -s flag шығаруды «баяу» жіберуге мәжбүрлейді, сондықтан компьютер бірдей буферді ешқашан алмайтын адамға арналған кіріс буферін шығарып тастайтын ортақ жағдайды болдырмайды. Бұл шығу екі элемент тізімін алатын «send_slow» айнымалы мәнімен бақыланады. Бірінші элемент атомды жіберу үшін байттар санын сипаттайтын бүтін сан. Екінші элемент - атомдық жіберулерді бөлу керек секундтар санын сипаттайтын нақты сан. Мысалы, «set send_slow {10 .001}» жіберілген әрбір 10 таңбадан 1 миллисекундпен жолдарды жіберу үшін «жіберуге» жібереді.

-h flag туындысы адамға шынымен теру сияқты жіберіледі (бірнеше). Таңбалар арасында адамға ұқсас кешігулер пайда болады. (Алгоритм Вейбулла үлестіріміне негізделген, бұл нақты қолданысқа сәйкес модификациясы бар.) Бұл шығыс бес элементтің тізімін алатын «send_human» айнымалы мәнімен басқарылады. Алғашқы екі элемент - секундтардағы орташа интерармердік кейіпкерлердің уақыты. Біріншісі әдепкі бойынша пайдаланылады. Екінші сөз сөздік соңында қолданылады, кейде мұндай өтулерде орын алған тыныш үзілістерді модельдеу үшін. Үшінші параметр - өзгермелілік шарасы, мұнда .1 өте айнымалы, 1 - негізді айнымалы және 10 - өзгеріссіз. Шексіздік - шексіздік 0. Соңғы екі параметр - тиісінше, ең аз және ең көп интервал уақыт. Ең аз және максимум соңғы пайдаланылады және соңғы уақытты «қысқарады». Егер ең төменгі және максималды мәндер жеткілікті мәндер болса, түпкі орта орташа мәннен мүлдем өзгеше болуы мүмкін.

Мысал ретінде, келесі пәрмен тез және дәйекті типографты эмульсиялайды:

set_human {.1 .3 1 .05 2} send -h «Мен аш болдық, түскі ас берейік».

ал асқынғаннан кейін келесілер қолайлы болуы мүмкін:

set_human {.4.4 .2 .5 100} send -h «Жақсы партия кешке түні!»

Қателерді модельдеуге болмайтынын ескеріңіз, бірақ қателер мен түзетулерді дәлелге жіберу арқылы қателерді түзету жағдайларын өзіңіз орнатуға болады.

Нөлдік таңбаларды жіберу, үзілістер жіберу, баяу өнімді шығару және адамдық стилі шығару үшін жалаулар бір-бірінен айрықша. Тек соңғы нұсқасы пайдаланылады. Сонымен қатар, нөлдік таңбаларды немесе үзілістерді жіберу үшін жалаумен ешқандай жол дәлелін белгілей алмайсыз.

Алдымен, процеске біреуді күту арқылы жіберудің жақсы идеясы. күту күтілуде процестің басталуын күтіп, жібере алмайды. Атап айтқанда, егер процесс басталмас бұрын бірінші жіберілсе, деректеріңізді елемеу қаупін тудырады. Интерактивті бағдарламалардың бастапқы сұранымын ұсынбаған жағдайларда, кешіктіру арқылы төменде көрсетілгендей болады:

# Хакерлердің бұзылу туралы кеңестерін бермеу үшін, # бұл жүйе сыртқы құпия сөзді сұрамайды. # Енгізу үшін 5 секунд күтіңіз telnet too.secure.gov ұйқы 5 парольді жіберу \ r

exp_send - жіберуге арналған бүркеншік ат . Егер Expectk немесе Tk ортасында Expect басқа нұсқасын пайдалансаңыз, жіберіңіз Tk арқылы мүлдем басқа мақсатта. exp_send орталар арасындағы үйлесімділікті қамтамасыз етеді. Осындай бүркеншік басқа күтулердің басқа жіберетін пәрмендеріне арналған.

send_error [-flags] жолына
жіберілімге ұқсас, тек өндіріс ағымдағы процестен гөрі stderr-ке жіберіледі.

send_log [-] жол
жолды журнал файлына ғана жібереді ( log_file қараңыз). Егер журнал файлы ашық болмаса, дәлелдер еленбейді.

send_tty [-flags] жол
жіберушіге ұқсас, тек ағымдағы процестен емес, шығыс / dev / tty- ге жіберіледі.

send_user [-flags] жолына
жіберілім сияқты, тек ағымдағы процестен емес, шығу stdout-ке жіберіледі.

ұйқы секундтары
сценарий бірнеше секундқа берілген ұйқыға себеп болады. Секундтар ондық сан болуы мүмкін. Үзіліс (егер Expectk қолдансаңыз Tk оқиғалары) күту ұйқы кезінде өңделеді.

spawn [args] бағдарламасы [args]
«program args» іске қосылған жаңа процесс жасайды. Оның stdin, stdout және stderr басқа күту командалары арқылы оқуға және жазуға болатындығына күтуге байланысты . Қосылым жабық немесе процестің өзі файлдың идентификаторларының кез келгенін жабады.

Process spawn арқылы басталғанда spawn_id айнымалысы осы процесті көрсететін дескрипторға орнатылады. Spawn_id арқылы сипатталған процесс «ағымдағы процесс » болып саналады. spawn_id оқуға немесе жазуға болады, іс жүзінде жұмысын бақылауды қамтамасыз етеді.

user_spawn_id - пайдаланушыға сілтеме жасайтын дескрипторы бар жаһандық айнымалы. Мысалы, spawn_id мәні осы мәнге орнатылса, expect_user сияқты әрекет етеді деп күтуге болады .

. Error_spawn_id - стандартты қатеге қатысты сипаттаушы бар ғаламдық айнымалы. Мысалы, spawn_id мәні осы мәнге орнатылса, send_error секілді жіберіңіз .

tty_spawn_id - / dev / tty деп аталатын дескрипторы бар жаһандық айнымалы. Егер / dev / tty жоқ болса (мысалы, cron, at немесе бума сценарийінде), онда tty_spawn_id анықталмаған. Бұл келесідей тексерілуі мүмкін:

Егер {[info vars tty_spawn_id]} {# / dev / tty бар болса} else {# / dev / tty жоқ # cron, пакетте немесе сценарийде болуы мүмкін}

spawn UNIX процесс идентификаторын қайтарады. Егер ешқандай процесс жасалмаса, 0 қайтарылады. Spawn_out айнымалысы (slave, name) pty slave құрылғысының атына орнатылады.

Әдепкіде, spawn команда атауын және дәлелдерін қайталайды. -Noecho жалаушасы мұны тоқтатады.

The -console жалаушасы консоль шығаруын шығарылған үрдіске қайта бағыттауға әкеледі. Бұл барлық жүйелерде қолдау көрсетілмейді.

Ішкі түрде, spawn пайдаланатын pty-ді пайдаланып, пайдаланушының тетігі сияқты теңшелген. Бұдан әрі барлық баптаулар «саналы» болуы үшін бапталады (stty (1) сәйкес). Егер stty_init айнымалысы анықталса, ол қосымша конфигурация ретінде stty аргументтерінің стилінде түсіндіріледі. Мысалы, «set stty_init raw» қосымша өңдеу процестерінің терминалдары шикізат режимінде бастауға әкеледі. -nottycopy пайдаланушының тегімен негізделген инициализацияны өткізіп жібереді. -nottyinit «sane» инициализациясын өткізіп жібереді.

Әдетте, майлануды орындау үшін аз уақыт кетеді. Егер сіз көп уақытты созғандығын байқасаңыз, онда кептеліп қалған ptys кездеседі. Қате үрдістерге ұшырамау үшін кейбір тестілер ptys арқылы орындалады. (Олар 10 разрядты уақытша қабылдайды). -d опциясымен жұмыс істемеуді күтіп, Күте тұрып, көптеген штрихты тақ жай күйде кездестіруге болады. Егер сіз бұл ptys тіркелген процестерді өлтіруге болмасаңыз, сіздің жалғыз ревизияңыз қайта жүктелуі мүмкін.

Егер бағдарлама exec (2) сәтсіз аяқталмаса (мысалы, бағдарлама жоқ болса), қате туралы хабар келесі әрекеттесу арқылы қайтарылады немесе бағдарлама іске қосылып, қате туралы хабарды шығыс ретінде шығарады. Бұл мінез-құлық ұрықтың іске асырылуының табиғи салдары болып табылады. Ішкі түрде, spawned үдерісі spawn_id арқылы байланысудан басқа түпнұсқалық күту үдерісімен байланысуға мүмкіндік бермейді.

- Тудың жалауы келесі аргументті Tcl файлының идентификаторы ретінде түсіндіруге әкеледі (яғни, ашық түрде қайтарылады). Ұрықтың идентификаторы содан кейін ол үсіп кеткен процесс ретінде қолданыла алады. (Файл идентификаторы бұдан былай пайдаланылмауы керек.) Бұл шикі құрылғыларды, файлдарды және құбырларды өңдеуді pty пайдаланудан тазартуға мүмкіндік береді. 0 байланысты процестің болмауын көрсету үшін қайтарылады. Өткізілген процесті қосу жабық болғанда, Tcl файлының идентификаторы да бар. -өлшемді туы жалаушаның ұқсастығын қоспағанда, -eaveopen , файлдың идентификаторы жабылған идентификатор жабылғаннан кейін де ашық қалуына себеп болады.

Бос жалаулар pty ашылуына әкеледі, бірақ ешқандай процесс жасалмайды. 0 байланысты процестің болмауын көрсету үшін қайтарылады. Spawn_id әдеттегідей орнатылған.

Spawn_out (slave, fd) айнымалысы pty slave-ға сәйкес келетін файл идентификаторына орнатылады. Ол «close -save» көмегімен жабық болуы мүмкін.

-жұмыс жалауы, өрілген процесте еленбейтін сигнал деп аталады. Әйтпесе, сигналдар әдепкі әрекетті алады. Әрбір сигналдың жеке жалауы қажет болғандықтан, сигналдар тұзақ пәрменінде аталады.

страздық деңгей
орындалмас бұрын басып шығарылатын келесі мәлімдемелер пайда болады. (Tcl's trace командасы айнымалы мәндерді іздейді.) Деңгей деңгейі қоңырау шегінен қаншалықты төмен түсетінін көрсетеді. Мысалы, төмендегі пәрмен қоңыраулардың алғашқы 4 деңгейін қадағалау кезінде күтеді , бірақ олардың ешқайсысы төмен.

күту -c «strace 4» script.exp

The -info жалаушасы Strace- ке берілген ең соңғы мәліметсіз аргументтердің сипаттамасын қайтарады.

stty args
сыртқы stty пәрменіне ұқсас терминал режимдерін өзгертеді.

Әдепкі бойынша, басқару терминалына қол жеткізіледі. Басқа терминалдарға командалардың нәтижесі ретінде статус күйін қайтару сұрауы арқылы қол жеткізуге болады, егер ешқандай мәртебе сұралмаса және бақылаушы терминалға қол жеткізілмесе, шикі және эхо атрибуттарының бұрынғы мәртебесі кейінірек бола алатын пішінде қайтарылады пәрмен арқылы пайдаланылады.

Мысалы, шикі немесе піскен дәлелдер терминалды шикізат режиміне қойды. Дәлелдер - пісірілген немесе дайындалған терминал терминалды пісірілген режимге қойды. Дәлелдер echo және - echo терминалға echo және noecho режиміне сәйкес келеді.

Төмендегі мысал эхоляцияны уақытша өшіруді суреттейді. Бұл басқаша пайдаланылуы мүмкін - оларда құпия сөздерді енгізуді болдырмау үшін автоматты сценарийлер. (Төменде EXPECT HINTS астында бұл туралы көбірек талқылаңыз.)

stty -echo send_user «Пароль:» expect_user -re «(. *) \ n» құпиясөзді орнату $ expect_out (1, string) stty echo

жүйелік арг
(1) терминалдан командалар ретінде терілген секілді кіріс ретінде аргс береді. Шаншу аяқталғанша күтеді. Sh-дан қайтару мәртебесі exec қайтару күйін өңдейтін әдіспен өңделеді.

Сценарийге stdin және stdout-ты бағыттайтын exec айырмашылығы жүйе қайта бағыттауды жүзеге асырмайды (жолдың өзі көрсететіннен басқа). Осылайша, / dev / tty-ге тікелей сөйлейтін бағдарламаларды пайдалануға болады. Сол себепті, жүйенің нәтижелері журналға жазылмайды.

уақыт белгісі [args]
уақыт белгісін қайтарады. Дәлелдер болмаса, дәуірден бері секундтар саны қайтарылады.

-format жалауы қайтарылатын жолды енгізеді, бірақ POSIX ережелеріне сәйкес жасалған strftime ережелеріне ауыстырылады. Мысалы,% a қысқа мерзімді күн атауы (яғни, Sat) ауыстырылады. Басқалары:

% қысқартылған апта күнінің аты% Толық аптаның аты% b қысқартылған ай атауы% B толық айдың атауы% c күн-уақыт: Wed Oct 6 11:45:56 1993% d айының күні (01-31% H сағат (00-23)% I сағат (01-12)% j күн (001-366)% м ай (01-12)% M минут (00-59)% p am немесе pm% S секунд (00-61) % u күн (1-7, дүйсенбі - аптаның бірінші күні)% U апта (00-53, бірінші жексенбісі - аптаның бірінші күні)% V апта (01-53, ISO 8601 стилі)% w күн (0- 6% W апта (00-53, бірінші дүйсенбі - бірінші аптаның бірінші күні)% x күн-уақыт: Wed Oct 6 1993% X time in: 23:59:59% year (00-99) % Y жылдағыдай: 1993% Z уақыт белдеуі (немесе анықталмаса, ештеңе болмайды) %% жалауша пайыз белгісі

Басқа% спецификациялар анықталмаған. Басқа таңбалар немқұрайлылық арқылы өтеді. Тек C тілге қолдау көрсетіледі.

Дәуірді форматта қайнар көз ретінде пайдаланғаннан кейінгі секундтар жалауы бірнеше секундты енгізеді. Әйтпесе, ағымдағы уақыт қолданылады.

-gmt жалауы GMT уақыт белдеуін пайдалану үшін уақыт белгісін шығарады. Тудың көмегімен жергілікті уақыт белдеуі пайдаланылады.

trap [[команда] сигналдары]
берілген команданың болашақ сигналдардың кез келгенін алғаннан кейін орындалуына әкеледі. Команда жаһандық ауқымда орындалады. Егер команда жоқ болса, сигнал әрекеті қайтарылады. Егер команда SIG_IGN жолы болса, сигналдар еленбейді. Егер команда SIG_DFL жолы болса, сигналдар жүйенің әдепкі мәніне әкеледі. сигналдар бір сигнал немесе сигналдар тізімі болып табылады. Сигналдар сигналдарға сандық немесе символикалық көрсетілуі мүмкін (3). «SIG» префиксі алынып тасталуы мүмкін.

Аргументсіз (немесе аргумент - сан) болмағанда, тұзақ орындалатын тұзақ пәрменінің сигнал нөмірін қайтарады.

Командалық код жалаушаның қайтару кодын командалар басталған кезде қайтаруға болатын кез келген кодтың орнына пайдаланады.

Түйіспесі жалауша жарияланғаннан гөрі, команда іске қосылған сәтте белсенді болған аудармашы арқылы командаларды бағалауға мәжбүр етеді.

Ат-туы жасалатын тұзақ пәрменінің сигнал атауын қайтару үшін trap пәрменін тудырады.

-max туы орнатуға болатын ең үлкен сигналдың нөмірін қайтару пәрменін береді.

Мысалы, «trap {send_user» Ouch! «SIGINT» командасы «Ouch!» әр пайдаланушы қашан басады ^ C.

Әдепкі бойынша, SIGINT (әдетте, ^ C түймесін басу арқылы жасалуы мүмкін) және SIGTERM шығуды күтуге мүмкіндік береді. Бұл күту басталған кезде әдепкі бойынша жасалған келесі тұзаққа байланысты.

тұзақ шығу {SIGINT SIGTERM}

Егер сіз отладчик іске қосу үшін -D жалауын қолдансаңыз, SIGINT интерактивті отладчик бастау үшін қайтадан анықталады. Бұл келесі тұзаққа байланысты:

trap {exp_debug 1} SIGINT

Отладчик тұзағын EXPECT_DEBUG_INIT айнымалы айнымалы мәнін жаңа trap пәрменіне орнату арқылы өзгертуге болады.

Сіз, әрине, сценарийге тұзақ пәрмендерін қосу арқылы олардың екеуін де баса аласыз. Атап айтқанда, егер сізде өзіңіздің «trap exit SIGINT» болса, бұл түзеткішті түзететін тұзақты қабылдамайды. Бұл пайдаланушыларға отладчикке мүлдем кірмеуді қаласаңыз пайдалы.

Егер сіз өзіңіздің SIGINT қондырғыңызды анықтағыңыз келсе, бірақ ол жұмыс істеп тұрған күйге келтірушіні әлі де ұстамаңыз:

егер {! [exp_debug]} {trap mystuff SIGINT}

Сонымен қатар, сіз басқа да сигналды пайдаланып, отладчикке тұйықтай аласыз.

Тұзақ SIGALRM үшін әрекетті елемеуге мүмкіндік бермейді, себебі бұл ішкі күту үшін пайдаланылады. Disconnect командасы SIGALRM мәнін SIG_IGN мәніне орнатады (ескермеу). Кейінгі ұрықтандыру пәрмендерінде оны өшіргеніңізге дейін оны қайтадан қосуға болады.

Қосымша ақпарат алу үшін сигнал (3) қараңыз.

күте [args]
кешіктірілу процесі аяқталмайынша (немесе егер ешкім аталмаған болса, ағымдағы процесс ) тоқтайды.

күту қалыпты төрт бүтін сандардың тізімін қайтарады. Бірінші бүтін сан - бұл процестің күткен кезеңі. Екінші бүтін сан - тиісті spawn id. Егер операциялық жүйе қатесі пайда болса, үшінші бүтін сан -1 немесе басқаша. Егер үшінші бүтін сан 0 болса, төртінші бүтін сан - бұл өрілген процестің күйі. Егер үшінші бүтін сан -1 болса, төртінші бүтін сан - операциялық жүйе арқылы орнатылған errno мәні. Жаһандық айнымалы қате коды да орнатылады.

Қосымша элементтер күте тұрудан кейін қайтарылатын мәннің соңында пайда болуы мүмкін. Қосымша бесінші элемент ақпарат класын анықтайды. Қазіргі кезде бұл элемент үшін жалғыз мүмкін мән CHILDKILLED, бұл жағдайда келесі екі мән C-стиліндегі сигнал атауы және қысқаша мәтіндік сипаттама болып табылады.

-i- ту туындысы аталған spawn_id-ке сәйкесінше күтеді ( процестің идентификаторы емес). SIGCHLD өңдегішінің ішінде, spawn-id-1-ні қолданып, кез-келген жұмыртқаны күте аласыз.

Тудың белгісі күту сәтті күтуді көрсетумен күтуді дереу қайтарады. Процесс шыққанда (кейінірек), ол нақты күтудің қажеті жоқ автоматты түрде жойылады.

Күту пәрмені «-i -1» аргументтерін пайдаланып, форсированный процесті күтуде де пайдаланылуы мүмкін. Бұйрықтарды қолданудан айырмашылығы, бұл команда кез келген уақытта орындалуы мүмкін. Қандай процестің орындалуына бақылау жоқ. Дегенмен, қайтару мәні процестің идентификаторы үшін тексерілуі мүмкін.

КІТАПХАНАЛАР

Күтетін сценарийлерді көру үшін екі кірістірілген кітапхананы автоматты түрде біледі. Олар exp_library және exp_exec_library айнымалыларында аталған каталогтармен анықталады. Екеуі де басқа сценарийлермен қолданылатын пайдалы файлдарды қамтуға арналған.

exp_library сәулетсіз тәуелсіз файлдарды қамтиды. exp_exec_library архитектура-тәуелді файлдарды қамтиды. Сіздің жүйеңізге қарай, екі каталогтар да толығымен бос болуы мүмкін. $ Exp_exec_library / cat-buffers файлының болуы әдепкі бойынша / bin / cat аралықтарын сипаттайды.

PRETTY-PRINTING

Әдемі басып шығару үшін скрипттерді күту үшін vgrind анықтамасы бар. Күтпеген таратуды қамтамасыз ететін vgrind анықтамасын дұрыс деп орнатылған жағдайда оны келесідей пайдалануға болады:

vgrind -lexpect файлы

МЫСАЛДАР

Көптеген адамдар адам бетінде сипатталғандай, бәрін бірге қалай қою керектігі анық емес. Сіздерді мысалға келтіріп, мысалға келтіріп көріңіз. Олардың кейбірі нақты бағдарламалар. Басқалары белгілі бір әдістерді түсіндіреді, және, әрине, жұптар тек қана тез бұзады. INSTALL файлында осы бағдарламалар туралы қысқаша шолу бар.

Сондай-ақ, күтілетін қағаздар (ақ қараңыз SEE). Кейбір құжаттарда Expect бағдарламасының бұрынғы нұсқаларына сәйкес келетін синтаксис қолданылғанымен, сүйемелдеуші ұтымдылықтар әлі де жарамды болып табылады және осы адам бетіне қарағанда әлдеқайда егжей-тегжейлі болады.

КЕВЕСТТЕР

Кеңестер Expect командасының атауларымен соқтыуы мүмкін. Мысалы, жіберу Tk арқылы мүлдем басқа мақсат үшін анықталады. Осы себепті Expect командаларының көбі «exp_XXXX» ретінде қол жетімді. «Exp», «inter», «spawn» және «timeout» дегендерден басталатын командалар мен айнымалыларда бүркеншік аттар жоқ. Егер орталар арасында осы сыйысымдылық қажет болса, кеңейтілген пәрмен атауларын пайдаланыңыз.

Күтілуде , қамтудың жеткілікті либералды көзқарасы. Атап айтқанда, « Expect» бағдарламасына тән пәрмендер арқылы оқылатын айнымалы мәндер, ең алдымен, жергілікті ауқымда және егер табылмаса, жаһандық көлемде ізделетін болады. Мысалы, бұл сіз күткендей жазатын әрбір рәсімде «ғаламдық күту уақыты» орнату қажеттілігін жояды. Екінші жағынан, жазылған айнымалылар әрдайым жергілікті көлемде («жаһандық» команда шығарылмаса). Бұл туындаған ең көп тараған мәселе - бұйрық рәсімде орындалған кезде. Процедурадан тыс, spawn_id енді жоқ, сондықтан көбею үрдісі қарап шығу себебінен жай емес. Мұндай процедураға «global spawn_id» қосыңыз.

Егер сіз мультисервистік мүмкіндіктерді іске қоспасаңыз (яғни сіздің жүйеңіз таңдамайды (BSD *. *), Сұрау (SVR> 2), не баламалы болса), Күте тек бір уақытта бір процесті басқара алады. Бұл жағдайда spawn_id параметрін орнатуға әрекет жасамаңыз, сондай-ақ, exec арқылы процестерді орындамасаңыз, қисық процедура іске қосылады. Сонымен қатар, бір уақытта бірнеше процестерден (соның ішінде пайдаланушы ретінде) күте алмайсыз.

Терминал параметрлері сценарийлерге үлкен әсер етуі мүмкін. Мысалы, сценарий жаңғыртуды іздеу үшін жазылса, жаңғырық өшірілсе, ол дұрыс істемейді. Осы себепті әдепкі бойынша әдепкі саналы терминал параметрлерін күтуге болады. Өкінішке орай, бұл басқа бағдарламалар үшін жағымсыз нәрселер жасай алады. Мысал ретінде emacs қабығы «әдеттегі» салыстыруларды өзгертуді қалайды: жаңа жолдар каретки-қайтаратын жолдардың орнына жаңа жолдармен салыстырылады және эхо-хабар өшіріледі. Бұл кіру жолын өңдеу үшін emacs-ты пайдалануға мүмкіндік береді. Өкінішке орай, Күте білу бұл мүмкін емес.

Бұл терминал параметрлерін әдепкі параметрлерін жоққа шығармауды сұрауға болады, бірақ мұндай орталарға сценарий жазғанда өте сақ болыңыз. Emacs жағдайда, echoing және end-of-line салыстырулар сияқты заттардан аулақ болыңыз.

Аргументтерді бірыңғай тізімге енгізген командалар ( күтілетін нұсқалар және өзара әрекеттесу ) тізім шын мәнінде бір дәлел немесе көпшілік болып табылатынын анықтау үшін эвристиканы пайдаланады. Эвристикалық тізбесі, шын мәнінде, тізімдер шынымен бір-бірімен дәлелденеді, олардың арасында бірнеше рет кірістірілген \ n олардың арасында бос емес таңбалар бар. Бұл жеткілікті түрде мүмкін емес сияқты, бірақ «нобра» дәлелі бір дәлелді жалғыз аргумент ретінде қарастыруға мәжбүрлеу үшін пайдаланылуы мүмкін. Бұл машина жасайтын Күтуші кодпен қолдануға болады. Сол сияқты, - жалғыз дәлелді бірнеше үлгілер / әрекеттер ретінде қолдануға мәжбүрлейді.

BUGS

Бағдарламаны «секс» деп атау өте қызық болды («Smart EXec» немесе «Send-Expect» үшін), бірақ жақсы мағынада (немесе, мүмкін, жай ғана Пуританизм) басым болды.

Кейбір жүйелерде, қабықшамен қапталғанда, ол tty-ге қол жеткізе алмай, бірақ бәрібір жұмыс істейді. Бұл дегеніміз, сіздің жүйеңізде күтпегенді білмейтін басқару элементін алу механизмі бар. Өтінемін, не екенін біліп, маған бұл ақпаратты жіберіңіз.

Ultrix 4.1 (кем дегенде, осы жердегі ең соңғы нұсқалар) 1000000-ден жоғары уақытша үзілістерді 0 деп есептейді.

Сандық UNIX 4.0A (және, бәлкім, басқа нұсқалар), SIGCHLD өңдегішін анықтаса, ptys бөлуден бас тартады. Қосымша ақпарат алу үшін грант беру бетін қараңыз.

IRIX 6.0 егер pty рұқсаттарын дұрыс пайдаланбаса, егер күте тұрса, бұрын басқа біреу пайдаланатын pty бөлуге әрекет жасалмаса. IRIX-ке жаңару 6.1.

Telnet (тек SunOS 4.1.2 астында тексерілген) TERM параметрі орнатылмаса, ол бекітіледі. Бұл TIME-ны анықтамайтын cron, cgi сценарийлерінде және проблемалары. Осылайша, оны анық түрде белгілеуіңіз керек - әдетте қандай түрге жатпайды. Бұл жай ғана нәрсе жасауға тиіс! Көптеген жағдайларда жеткілікті болуы мүмкін.

set env (TERM) vt100

SHELL және HOME орнатылмаған жағдайда Кеңес (BSDI BSD / OS 3.1 i386 астында ғана тексеріледі). Бұл қоршаған орта айнымалы мәндерін анықтамайтын cron , cgi сценарийлерінде және мәселе. Осылайша, сіз оларды айқын түрде анықтауыңыз керек - әдетте қандай түрге жатпайды. Бұл жай ғана нәрсе жасауға тиіс! Көптеген жағдайларда жеткілікті болуы мүмкін.

set env (SHELL) / bin / sh env (HOME) / usr / local / bin параметрін орнатыңыз

Ptys бағдарламасының кейбір нұсқалары ядро ​​файлдың дескрипторын жауып болғаннан кейін 10-15 секундтан кейін (нақты саны іске асыруға тәуелді) кейін оқылмаған шығуды тастайтын етіп жасалады. Осылайша, бағдарламаларды күтіңіз

ұйқы 20 жастан күтуге болады

істемейді. Бұған жол бермеу үшін интерференционды емес бағдарламаларды шығаруды емес, exec -ды шақырыңыз. Осындай жағдайлар орынды бола тұра, шын мәнінде интерактивті бағдарламаның түпкілікті нәтижесі осы мінез-құлыққа байланысты жоғалып кететін жағдайға тап болмады.

Екінші жағынан, Cray UNICOS ptys файлды дескрипторды жабудан кейін бірден оқылмаған шығуды тастайды. Мен бұл туралы Cray-ге хабарлады және олар түзету бойынша жұмыс істейді.

Кейде жылдамдық пен жауап арасындағы уақыт аралығы, мысалы, tty интерфейсі UART параметрлерін өзгерткенде немесе іске қосу / тоқтату биттерін іздестіру арқылы сəйкестендіру жылдамдығына байланысты қажет . Әдетте, мұның бәрі екінші немесе екіншісінде ұйықтау керек. Құрылғылар енгізуді қабылдауға дайын болғанша қайта сынақтан өткізудің күшті әдісі. Келесі мысал екі стратегияны да пайдаланады:

«жылдамдығы 9600 \ r» жіберіңіз; ұйқы 1 күту {күту уақыты} {жіберіңіз «\ r»; exp_continue} $ шақыру}

trap-code, Tcl оқиғалар циклінде орналасқан ұйқы сияқты кез келген командамен жұмыс істемейді. Мәселе мынада, оқиға циклінде Tcl қайталанатын оқиға өңдегіштерінен қайтару кодтарын алып тастайды. Ұстау - тұзақ кодында жалаушаны орнату. Содан соң, пәрменнен кейін бірден жалаушаны тексеріңіз (яғни ұйқы).

Wait_background командасы - уақытша аргументтерді елемейді және жалпы уақытша үзілістер тұжырымдамасына ие емес.

& # 34; КҮТІЛГЕН МӘНДЕР & # 34;

Күтпеген нәрсе туралы бірнеше нәрсе бар, олар интуитивті емес болуы мүмкін. Бұл бөлім бірнеше ұсыныста осы мәселелердің кейбірін шешуге тырысады.

Күтудегі жалпы проблема - бұл қабықтың кеңестерін білу. Олар әртүрлі адамдар мен әртүрлі қабықшалармен теңшелгендіктен, рлогинді автоматты түрде автоматтандыру жылдамдығын білместен қиын болуы мүмкін. Ақылға қонымды конвенция - пайдаланушыларға EXPECT_PROMPT айнымалы айнымалы мәніндегі (атап айтқанда, оның соңы) сипаттайтын тұрақты өрнекті сақтау болып табылады. Мынадай кодты қолдануға болады. EXPECT_PROMPT болмаса, кодтың дұрыс жұмыс істеу мүмкіндігі бар.

'(% | # | \\ $) $ «; # әдепкі шақыру пәрмені {set prompt $ env (EXPECT_PROMPT)} күтіңіз - $ prompt

Мен көргім келетін кез келген нәрсенің аяқталуын қамтитын күтулерді жазуды ұсынамын. Бұл барлық нәрсені көруден бұрын сұраққа жауап беру мүмкіндігін болдырмайды. Сонымен қатар, сіз оларды толығымен көрместен бұрын сұрақтарға жауап бере аласыз, ал егер сіз ерте жауап берсеңіз, сұрағыңыздың ортасында мәселенің қайталануы мүмкін. Басқаша айтқанда, алынған диалог дұрыс болады, бірақ шифрланған көрінеді.

Көптеген нұсқаулар соңында кеңістік сипатын қамтиды. Мысалы, ftp-дан шақыру 'f', 't', 'p', '>' және. Осы шақыруды сәйкестендіру үшін осы таңбалардың әрқайсысы үшін есеп беру керек. Бланкты қамтымайтын қате. Бетті таза түрде қойыңыз.

Егер сіз X * пішінінің үлгісін қолдансаңыз, * X соңынан алынған соңғы нәтижеге сәйкес келеді. Бұл интуитивті сезіледі, бірақ біраз шатасуы мүмкін, себебі «соңғы қабылданған нәрсе» сөзі компьютердің жылдамдығына және ядро ​​мен құрылғы драйверіне I / O өңдеуіне байланысты өзгеруі мүмкін.

Атап айтқанда, адамдар көбінесе бағдарламалардың бір уақытта бір сызық шығаратын кезде, бағдарламаның өнімділігі үлкен бөліктерге (атомдық) келетінін көреді. Мысалы, алдыңғы параграфтың * үлгісіндегі * ағымдағы сызықтың соңына ғана сәйкес келуі мүмкін, бірақ көп нәрсе бар көрінсе де, өйткені матч кезінде барлық нәтиже алынған болатын.

күтуге болмайды, егер сіздің үлгіңіз оны нақты есепке алмаса, қосымша шығыс келіп түседі.

Трафикке бағытталған буферлеуге байланысты, ақылсыз болып табылады. Бағдарламалар тек қана буферизация түрлеріне қатысты уәделерді жасамайды, бірақ жүйенің азықтандыруы шығатын сызықтарды үзуі мүмкін, сондықтан сызықтар көрінген кездейсоқ жерлерде үзіледі. Осылайша, егер сіз үлгілерді жазу кезінде сұраныстың соңғы бірнеше кейіпкерлерін білсеңіз, мұны дұрыс істеңіз.

Бағдарламаның соңғы шығарылымында үлгі күтсеңіз және бағдарлама орнына басқа нәрсе шығарса, сіз күту уақытының кілт сөзімен анықтай алмайсыз. Себебі, күту уақыты күтуге болмайды, керісінше, бұл көрсеткіштің пайда болуы. Оның орнына пайдаланыңыз. Тіпті жақсы, екеуін де пайдаланыңыз. Осылайша, егер бұл желі әрқашан қозғалады, сіз өзіңіздің түзетуіңіз қажет емес.

Жаңа жолдар, әдетте, терминал драйвері шығарған кезде жолдың қайтаруына, жолдың сапасын реттеуге түрлендіріледі. Мысалы, printf («foo \ nbar»), яғни, екі жолға сәйкес келетін үлгіні қаласаңыз, «foo \ r \ nbar» үлгісін қолданыңыз.

Осындай аударма пайдаланушыдан expect_user арқылы оқиды . Бұл жағдайда қайтаруды басқан кезде ол жаңа жолға аударылады. Егер Күте тұрса, оны терминалды шикізат режиміне (telnet сияқты) орнататын бағдарламаға жіберсе, бағдарлама шынайы қайтарымды күтетіндіктен проблема болады. (Кейбір бағдарламалар шынымен кешірімді, олар автоматты түрде жаңа жолдарды қайтаруға көмектеседі, бірақ көпшілігі жоқ.) Өкінішке орай, бағдарлама өз терминалын шикізат режиміне қойғанын білуге ​​болады.

Жаңа сызықтарды қайтарумен қолмен ауыстырудың орнына, шешім «stty raw» командасын қолдануға, ол аударманы тоқтатады. Дегенмен, бұл піскен сызықтық өңдеу мүмкіндіктері болмайтынын білдіреді.

өзара әрекеттесу терминалыңыз шикізат режиміне орнатады, сондықтан бұл мәселе сол кезде пайда болмайды.

Парольдерді (немесе басқа да жеке ақпаратты) күтілетін сценарийлерде сақтау пайдалы. Бұл ұсынылмайды, өйткені компьютерде сақталған нәрсе кез келген адамға қолжетімді болады. Осылайша, сценарийден құпия сөздерді интерактивті түрде енгізу - оларды жай ғана ендіруге қарағанда ақылға қонымды емес. Дегенмен, кейде осындай салу - жалғыз мүмкіндік.

Өкінішке орай, UNIX файлдық жүйесінде орындалатын, бірақ оқылмайтын сценарийлер жасаудың тікелей жолы жоқ. Қатты қабық сценарийлерін қолдайтын жүйелер жанама түрде оны төменде келтіре алады:

Әдеттегідей, күтілетін сценарийді (жасырын деректерді қамтитын) жасаңыз. Рұқсаттарын 750 (-rwxr-x ---) болуы керек және сенімді топқа тиесілі, яғни оны оқуға рұқсат етілген топ. Қажет болса, осы мақсат үшін жаңа топ жасаңыз. Бұдан бұрынғы топқа тиесілі 2751 (-rwxr-s - x) рұқсаттары бар / bin / sh сценарийін жасаңыз.

Нәтиже - кез келген адамның орындауына (оқуға) болатын сценарий. Қашан шақырылса, ол күтілетін сценарийді іске қосады.

& # 34; әрі қарай қараңыз & # 34;

Tcl (3), libexpect (3)
«Күтілетін нәтижелерді зерттеу: Интерактивті бағдарламаларды автоматтандыру үшін Tcl негізіндегі құралдар жиынтығы» , Дон Либз, 602 бет, ISBN 1-56592-090-2, O'Reilly және Associates, 1995.
«Күтпек: өзара әрекеттесудің бақыланбайтын бейнелерін емдеу» Дон Либестің жазғы еңбектері 1990 USENIX конференциясы, Анахайме, Калифорния, 1990 жылғы 11-15 маусым.
1990-1994 жж., Колорадо штаты, Колорадо Спрингс, 1990 ж. USENIX Large Installation Systems Administration Конференциясының материалдары. Дон Либестің «Жүйелік әкімшілік тапсырмаларын автоматтандыруды күту ».
1990 жылғы 22-26 қаңтардағы Вашингтон, АҚШ, 1990 жылғы Қысқы USENIX Конференциясының материалдары. Джон Оустерхуттың «Tcl: Embeddable Command Language». Дон Либз, Есептеу Жүйелері, «Интерактивті бағдарламаларды бақылау үшін сценарийлер» деп күтемін. , Vol. Калифорния Университетінің Баспа Журналдары, 1991 ж. Қараша. «Регрессиялық тестілеу және сәйкестікті тестілеудің интерактивті бағдарламалары», Дон Либестің 1992 жылғы жаздың материалдары USENIX конференциясы, с. 135-144, Сан Антонио, Техас, 12-15 маусым, 1992 жыл. «Кибиц - Бірнеше интерактивті бағдарламаларды біріктіру», Дон Ливз, Бағдарламалық қамтамасыз ету - Тәжірибе және тәжірибе, Джон Уилей & Сонс, Батыс Суссекс, Англия, Vol.

23, № 5, мамыр, 1993 ж. «Donald Libers» 1993 жылғы 10-11 маусымда Беркли, Калифорния штатындағы Tcl / Tk семинарының материалдары.

AUTHOR

Дон Либес, Ұлттық стандарттар және технологиялар институты

ЕСКЕРТУЛЕР

Tcl үшін Джон Оустерхоу мен шабыт үшін Скоу Паислиге рахмет. Роб Савойенің арқасында автоконфигурация кодының күтуі.

HISTORY файлы, күтудің эволюциясының көп бөлігін құжаттайды. Бұл қызықты оқуды жасайды және осы бағдарламалық жасақтамаға қосымша түсінік береді. Осында айтылған адамдарға қате түзетулер жіберіп, басқа да көмек көрсетті.

Күтушіні жобалау және іске асыру ішінара АҚШ үкіметі тарапынан төленді және сондықтан қоғамдық игілікке ие. Дегенмен, автор мен NIST осы бағдарлама мен құжаттама немесе олардың бөліктері пайдаланылған жағдайда кредитті алғысы келеді.