Linux / Unix հրամանատարությունը ակնկալում է

Ակնկալում է մի ծրագիր, որը զրուցում է այլ ինտերակտիվ ծրագրերի հետ, ըստ սցենարի: Սցենարի հետեւում, «Ակնկալում» գիտի, թե ինչ կարելի է սպասել ծրագրից եւ ինչ ճիշտ պատասխան պետք է լինի: Թարգմանված լեզուն ապահովում է երկխոսությունը ուղղորդելու եւ բարձրաստիճան վերահսկող կառույցներ: Բացի այդ, օգտագործողը կարող է վերահսկել եւ փոխազդեցել ուղղակիորեն, երբ ցանկալի է, հետագայում վերահսկողություն վերադարձնելու համար:

Expectk- ը Ակնկալ եւ Tk- ի խառնուրդն է: Այն պահպանում է ինչպես ակնկալիքները եւ Tk- ի ցանկությունները: Ակնկալումը կարող է օգտագործվել ուղղակիորեն C կամ C ++ առանց Tcl:

«Սպասում» անունը գալիս է uucp, kermit- ի եւ մոդեմի կառավարման այլ ծրագրերի կողմից տարածվող / ակնկալվող հաջորդականությունների գաղափարից: Այնուամենայնիվ, ի տարբերություն uucp- ի, Ակնկալվում է ընդհանրացված, այնպես որ այն կարող է վարվել որպես օգտագործողի մակարդակի հրաման, ցանկացած ծրագրով եւ խնդիրով: Ակնկալվում է, որ միաժամանակ մի քանի ծրագրեր կարող են խոսել:

Ինչ կարելի է ակնկալել

Օրինակ, այստեղ ինչ-որ բան ակնկալում են հրամանը:

Կան մի շարք պատճառներ, թե ինչու այդ շելլը չի կարող կատարել այդ խնդիրները: Բոլորը հնարավոր է ակնկալել:

Ընդհանուր առմամբ, ակնկալիքը օգտակար է ցանկացած ծրագրի համար, որը պահանջում է ծրագրի եւ օգտագործողի միջեւ փոխգործակցություն: Այն ամենը, ինչ անհրաժեշտ է, այն է, որ փոխգործակցությունը կարող է բնութագրվել ծրագրային առումով: Ակնկալվում է նաեւ, որ օգտագործողը կարող է վերահսկել վերահսկողությունը, առանց վերահսկելու ծրագիրը: Նմանապես, օգտագործողը ցանկացած պահի կարող է վերահսկողություն վերադարձնել սցենարին:

Օգտագործումը

Ակնկալում է կարդալ cmdfile կատարելու հրահանգների ցուցակի համար: Ակնկալվում է, որ կարող է անուղղակիորեն կիրառվել այն համակարգերի վրա, որոնք աջակցում են #! նշումը սցենարը որպես գործարկված նշելու եւ սցենարի մեջ առաջին գիծը դնելով `

#! / usr / local / bin / ակնկալիք -f

Իհարկե, ճանապարհը պետք է ճշգրիտ նկարագրվի, որտեղ ակնկալում է կյանքը: / usr / local / bin- ը պարզապես օրինակ է:

The -c flag նախօրոք ներկայացնում է հրամանը, որը պետք է իրականացվի նախքան սցենարի մեջ: Հրամանագիրը պետք է մեջբերվի, որպեսզի խեղաթյուրված լինի: Այս տարբերակը կարող է օգտագործվել բազմակի անգամ: Բազմակի հրամանները կարող են կատարվել մեկ-ի հետ, բաժանելով դրանք կետային վահանակներով: Հրամանները կատարվում են իրենց հրամանով: Expectk- ից օգտվելիս այս տարբերակը նշվում է որպես -command:

The -d դրոշը թույլ է տալիս որոշակի ախտորոշիչ արտադրանք, որը հիմնականում ներկայացնում է հրամանների ներքին գործունեությունը, ակնկալվում եւ փոխազդում է: Այս դրոշը նույն ազդեցությունն ունի, ինչպիսին է «exp_internal 1» ակնկալիքի սկրիպտի սկզբում, իսկ ակնկալվող տարբերակը տպագրվում է:

-D դրոշը հնարավորություն է տալիս ինտերակտիվ կարգաբերիչին: Հետեւյալ արժեքը պետք է հետեւի: Ձայնագրիչը վերահսկողություն կկատարի հաջորդ Tcl կարգի համար, եթե արժեքը զրոյական չէ կամ եթե սեղմեք սեղմված կամ breakpoint- ը կամ այլ համապատասխան կարգաբերիչ հրամանագիր է հայտնվում սցենարի մեջ: Expectk- ից օգտվելիս այս տարբերակը նշվում է որպես Debug- ը:

-f- ի դրոշը նախօրինակում է մի ֆայլ, որը կարդացեք հրամանները: Դրոշը ինքնին պարտադիր է, քանի որ այն օգտակար է միայն #! նշում, այնպես որ հրամանատարական գծում կարող են տրամադրվել այլ փաստարկներ: Expectk- ից օգտվելիս այս տարբերակը նշված է որպես ֆայլ:

Լռելյայնորեն, հրամանի ֆայլը կարդացվում է հիշողության մեջ եւ կատարվում է ամբողջությամբ: Երբեմն ցանկալի է կարդալ ֆայլերը մեկ անգամ: Որպեսզի այս կամ այն ​​ձեւով գործածվի կամայական ֆայլերը ստիպված լինեն օգտվել «-բ» դրոշից: Expectk- ից օգտվելիս այս տարբերակը նշվում է որպես «թուփ»:

Եթե ​​«-» տողը մատակարարվում է որպես ֆայլի անվան, ստանդարտ մուտքագրված է փոխարենը: Օգտագործեք «./-« կարդալու համար, որը փաստորեն անվանվում է «-»:

The -i դրոշը առաջացնում է ակնկալել ինտերակտիվ հրամանները հրամանների փոխարեն `դրանք կարդալուց մի ֆայլից: Խթանումը դադարեցվում է ելքի հրամանով կամ EOF- ի միջոցով: The -i դրոշը ենթադրվում է, եթե ոչ հրամանի ֆայլ կամ ոչ -c- ը չի օգտագործվում: Expectk- ի օգտագործման դեպքում այս տարբերակը նշված է որպես «interactive»:

- կարող են օգտագործվել տարբերակների վերջը սահմանելու համար: Սա օգտակար է, եթե ցանկանում եք ընթերցանության նման փաստարկը փոխանցել ձեր սցենարին, առանց ակնկալելով Expect- ը: Սա կարող է օգտակար լինել տեղադրվել #! գիծը կանխելու համար ցանկացած դրոշմային մեկնաբանություն կանխելու համար: Օրինակ, հետեւյալը թողնելու է սկզբնական փաստարկները, ներառյալ սցենարի անունը փոփոխական argv- ում :

#! / usr / local / bin / ակնկալիք -

Նշենք, որ սովորական getopt (3) եւ execve (2) կոնվենցիաները պետք է դիտարկել, երբ փաստարկներ ավելացնել #! գիծը:

$ Exp_library / expect.rc ֆայլը ավտոմատ կերպով օգտագործվում է, եթե առկա է, եթե -N դրոշը օգտագործվի: (Expectk- ի օգտագործման դեպքում այս տարբերակը նշված է որպես -NORC): Անմիջապես դրանից հետո ~ / .expect.rc ֆայլը ինքնաբերաբար կախված է, եթե այն օգտագործվում է -n դրոշի վրա: Եթե ​​DOTDIR- ի շրջակա միջավայրի փոփոխականությունը սահմանվում է, այն վերաբերվում է որպես գրացուցակ եւ այնտեղից կարդացվում է .expect.rc: Expectk- ի օգտագործման ժամանակ այս տարբերակը նշվում է որպես -norc: Այս աղբյուրը տեղի է ունենում միայն ցանկացած դրոշի կատարումից հետո:

-v պատճառները ակնկալում են տպել իր տարբերակի համարը եւ ելքը: Համապատասխան դրոշը Expectk- ում, որը օգտագործում է երկար դրոշի անուններ, տարբերակ է:

Լրացուցիչ args կառուցված են ցանկի մեջ եւ պահվում են փոփոխական argv եւ փոփոխական. argc- ը սկզբնավորվում է argv- ի երկարությամբ:

Argv0- ը սահմանվում է որպես սցենարի կամ երկուական անուն, եթե ոչ սցենար չի օգտագործվում: Օրինակ, սցենարի անունը եւ առաջին երեք փաստարկները տպագրում են հետեւյալը.

send_user "$ argv0 [lrange $ argv 0 2] \ n"

Հրամաններ

Ակնկալում է գործիքի հրամանատարության լեզուն: Tcl- ն ապահովում է հսկողության հոսքը (եթե, ընդմիջման համար), արտահայտության գնահատումը եւ մի քանի այլ առանձնահատկություններ, ինչպիսիք են ռեկուրսիոնի եւ ընթացակարգի սահմանումը: Այստեղ օգտագործված հրամաններ, սակայն սահմանված չեն (set, if, exec) են Tcl հրահանգները: Ակնկալում է աջակցել լրացուցիչ հրահանգներ: Եթե ​​այլ բան նշված չէ, հրամանները վերադարձնում են դատարկ տողը:

Հրամանները նշված են այբբենական կարգով, որպեսզի նրանք կարողանան արագ տեղակայվել: Այնուամենայնիվ, նոր օգտվողները կարող են ավելի հեշտ դիմանալ ծառի նկարագրությունը, ուղարկել, ակնկալել եւ փոխազդել այդ կարգին:

փակել [-slave] [-onexec 0 | 1] [-i spawn_id]

փակում է ընթացիկ գործընթացին կապը: Ինտերակտիվ ծրագրերի մեծ մասը կստեղծի EOF- ն իրենց stdin եւ exit; Այսպիսով, ընդհուպ մոտենում է նաեւ, որ գործընթացը սպանեն: The -i դրոշը հայտարարում է գործընթացը փակելու համար համապատասխան spawn_id- ին:

Երկուսն էլ ակնկալում եւ շփում կգտնեն, երբ ընթացիկ գործընթացն ավարտվում է եւ անուղղակիորեն փակվում է, բայց եթե դուք սպանեք գործընթացը , ասենք, «exec kill $ pid», ապա ձեզ հարկավոր է ակնհայտորեն զանգահարել :

The -onexec դրոշը որոշում է, թե արդյոք spawn ID- ն փակ է ցանկացած նոր spawned գործընթացներում, կամ եթե գործընթացը overlayed. Բաց թողնել բաց կոճակը, օգտագործեք 0 արժեքը: Ոչ զրո ամբողջական արժեքը ծածկում է ցանկացած նոր գործընթացում փակված:

The -Slave դրոշը ծածկում է ծղոտի ID- ի հետ կապված ստրուկը: Երբ կապը փակ է, ապա ստրուկը ավտոմատ կերպով փակվում է, եթե այն դեռեւս բաց է:

Անկախ նրանից, կապն անուղղակիորեն կամ հստակորեն փակ է, դուք պետք է զանգահարեք սպասեք, որպեսզի համապատասխան քնջել գործընթացի բնիկը մաքրեք: Մնացած հրամանը չի սպասում սպասելուն, քանի որ չկա որեւէ երաշխիք, որ գործընթացի փակումը փակվելու է:

debug [[-now] 0 | 1]

վերահսկում է Tcl կարգաբերիչ, որը թույլ է տալիս քայլեր անել եւ սահմանել կետեր:

Առանց փաստարկներ, 1-ը վերադարձվում է, եթե կարգաբերիչը չի աշխատում, հակառակ դեպքում 0-ը վերադարձվում է:

1 փաստարկով, կարգաբերիչը սկսվում է: 0 փաստարկով, կարգաբերողը դադարում է: Եթե ​​1 փաստարկը նախորդում է -now դրոշի կողմից, ապա կարգաբերիչը անմիջապես սկսվում է: Հակառակ դեպքում, կարգաբերիչը սկսվում է հաջորդ Tcl հայտարարության հետ:

Debug հրամանը չի փոխում որեւէ թակարդը: Համեմատեք սա `սկսելու ակնկալիքով -D դրոշի հետ:

Անջատված հրամանը անջատում է տարանջատված պատնեշը: Այն շարունակվում է ֆոնին: Գործընթացը տրվում է սեփական գործընթացի խմբին: Ստանդարտ I / O- ը վերափոխվում է / dev / null :

Հետեւյալ ֆորման օգտագործում է անջատել շարունակել սկրիպտը հետին պլանում:

եթե {[fork]! = 0} ելք անջատել: . .

Հետեւյալ սցենարը կարդում է գաղտնաբառ եւ ապա ամեն անգամ ծրագիր է անցնում, որը ամեն անգամ պահանջում է գաղտնաբառ: Սցենարը պարունակում է գաղտնաբառ, այնպես որ դուք միայն պետք է մուտքագրեք այն մեկ անգամ:

{} {{{fork]! = 0} {sleep 3600; շարունակել} անջատել spawn priv_prog ակնկալիք Գաղտնաբառ: ուղարկել "$ expect_out ( 1, string) \ r ": . . ելք}

Առավելությունն այն է, որ օգտագործվում է անջատելու ռելեինային սինխրոն գործընթացի առանձնահատկությունը (&) այն է, որ Ակնկալվում է մինչեւ տարանջատման պարամետրերը փրկել նախքան անջատումը եւ այնուհետեւ դրանք կիրառել նոր ptys- ին: With & Expect- ը չունի տերմինալի պարամետրերը կարդալու հնարավորություն, քանի որ տերմինալն արդեն անջատված է, ակնկալվում է վերահսկում:

[ելք] [կարգավիճակ]

անհանգստացնում է դուրս գալու կամ այլ կերպ պատրաստվելու համար:

The -onexit դրոշը առաջացնում է հաջորդ փաստարկը `որպես ելքային աշխատող: Առանց փաստարկ, ներկայիս ելքի կարգավորիչը վերադարձվում է:

The -noexit դրոշը ակնկալում է, որ պատրաստվում է դուրս գալ, բայց դադարեցնել գործառնական համակարգին հսկողությունը վերադարձնելը: Օգտագործողի կողմից սահմանված exit handler- ը, ինչպես նաեւ Expect- ի սեփական ներքին կարգավորիչները: Ոչ մի ակնկալիք չկա, որ հրամանները չկատարվեն: Սա օգտակար է, եթե սպասում եք այլ Tcl ընդլայնման հետ: Ներկա թարգմանիչը (եւ հիմնական պատուհանը, եթե Tk- ի միջավայրում) մնում է այնպես, որ մյուս Tcl ընդլայնումները կարող են մաքրել: Եթե ​​ակնկալվող ելքը կրկին կոչվի (բայց դա կարող է տեղի ունենալ), գործարկողները չեն վերադառնում:

Դուրս գալուց հետո փակված գործընթացների բոլոր կապերը փակ են: Փակումը կհասցվի որպես EOF- ի կողմից հալածված գործընթացների: ելքը ոչ մի այլ գործողություն չի կատարում այն ​​բանից հետո, երբ սովորական _exit (2) ընթացակարգը: Այսպիսով, EOF- ի համար չպահանջող փորված գործընթացները կարող են շարունակվել: (Տարբեր պայմանները կարեւոր են որոշելու համար, օրինակ, ինչ ազդանշաններ են ուղարկվում ծալված գործընթաց, բայց դրանք համակարգային կախված են, սովորաբար փաստաթղթավորվում են ելքի տակ (3):) Ծալված գործընթացները, որոնք շարունակում են գործել, ժառանգվում են նախաձեռնությամբ:

կարգավիճակը (կամ 0 եթե նշված չէ) վերադարձվում է որպես ակնկալվող ելքի կարգավիճակ: ելքը ակնհայտորեն կատարվում է, եթե սցենարի վերջը հասնի:

exp_continue [-continue_timer]
Հանձնարարությունը exp_continue- ն թույլ է տալիս ակնկալել , որ շարունակում է գործել, այլ ոչ թե վերադարձնելը, ինչպես դա սովորաբար կլիներ: Լռելյայն ` exp_continue- ը վերականգնում է ժամանակի ժամանակացույցը: The -continue_timer դրոշը խոչընդոտում է ժմչփի վերսկսումը : (Տես հավելյալ տեղեկությունների համար:)

exp_internal [-f ֆայլ] արժեքը
առաջացնում է հետագա հրամաններ, որպեսզի ուղարկեն ախտորոշիչ տեղեկատվության ներքին, ակնկալելու stderr, եթե արժեքը զրոյական չէ: Այս արտադրանքը անջատված է, եթե արժեքը 0 է: ախտորոշիչ տեղեկատվությունը ներառում է ստացված յուրաքանչյուր բնույթ, եւ յուրաքանչյուր փորձ, որը կատարվել է ընթացիկ արտադրանքի համադրությամբ:

Եթե ​​ընտրովի ֆայլը մատակարարվում է, բոլոր նորմալ եւ կարգաբերիչ արտադրանքը գրվում է այդ ֆայլին (անկախ արժեքի արժեքից ): Ցանկացած նախորդ ախտորոշիչ արտադրանքի ֆայլը փակ է:

The -info դրոշը առաջացնում է exp_internal- ն վերադարձնելու համար տրված վերջին ոչ-տեղեկատվական փաստարկների նկարագրությունը:

exp_open [args] [-i spawn_id]
վերադարձնում է Tcl ֆայլի նույնացուցիչ, որը համապատասխանում է սկզբնական ծղոտի ID- ին: Ֆայլի նույնացուցիչը կարող է օգտագործվել այն դեպքում, երբ այն բացվել է Tcl- ի բաց հրամանով: (The spawn id- ը այլեւս չի օգտագործվի: Սպասումը չպետք է կատարվի:

The -leaveopen դրոշը թողնում է spawn id- ը, բացվելու հասանելիության հասանելիության միջոցով: Սպանդի id- ում պետք է սպասել :

exp_pid [-i spawn_id]
վերադարձնում է ներկայիս ծալված գործընթացին համապատասխանող գործընթացը: Եթե-ի դրոշը օգտագործվում է, ապա pid- ը վերադառնում է համապատասխանում տվյալ spawn ID- ին:

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] տարբերակը]
օգտակար է, որ սցենարը համապատասխանի Ակնկալվող ընթացիկ տարբերակի հետ:

Առանց փաստարկների, ակնկալվող ընթացիկ տարբերակը վերադարձվում է: Այս տարբերակը կարող է կոդավորված լինել ձեր սցենարում: Եթե ​​դուք իրականում իմանաք, որ դուք չեք օգտագործում վերջին տարբերակների հնարավորությունները, դուք կարող եք նշել ավելի վաղ տարբերակը:

Տարբերակները բաղկացած են երեք կետերից, որոնք առանձնացված են կետերով: Առաջինը հիմնական թիվն է: Ակնկալվող տարբերակների համար գրված սցենարներ գրեթե անշուշտ չեն աշխատում: exp_version վերադարձնում է սխալ, եթե հիմնական թվերը չեն համապատասխանում:

Երկրորդը փոքր թիվն է: Սցենարները, որոնք գրված են տարբերակի համար, ավելի փոքր թվով, քան ներկա տարբերակը, կարող է կախված լինել որոշ նոր առանձնահատկությունից եւ չի կարող գործարկել: exp_version վերադարձնում է սխալը, եթե հիմնական թիվը համապատասխանում է, բայց սցենարի անչափահասների թիվը ավելի մեծ է, քան ընթացիկ ակնկալիքը :

Երրորդը համարը, որը չի մասնակցում տարբերակի համեմատությանը: Այնուամենայնիվ, այն ավելանում է, երբ Expect ծրագրային բաշխումը ցանկացած ձեւով փոխվում է, ինչպես օրինակ, լրացուցիչ փաստաթղթերի կամ օպտիմալացման միջոցով: Այն վերացվում է 0-ի յուրաքանչյուր նոր տարբերակի վրա:

With -exit դրոշով, Ակնկալում է սխալ տպել եւ դուրս է գալիս, եթե տարբերակը հնացած է:

ակնկալում [[-pts] pat1 body1] ... [-opts] patn [bodyn]
սպասում է մինչեւ օրինաչափությունների մեկը համապատասխանում է ծալված գործընթացի արդյունքներին, որոշակի ժամանակահատված է անցել կամ դիտվում է վերջնական ֆայլ: Եթե ​​վերջնական մարմինը դատարկ է, ապա դա կարող է բաց թողնել:

Նախատեսված ակնկալիքներից առաջ հրամանները հստակորեն օգտագործվում են նախքան որեւէ այլ օրինակ: Վերջին ակնկալիքներից հետո հրամանները անուղղակիորեն օգտագործվում են ցանկացած այլ օրինակից հետո:

Եթե ​​ամբողջ ակնկալվող հայտարարության մեջ բերված փաստարկները պահանջում են մեկից ավելի գիծ, ​​ապա բոլոր փաստարկները կարող են «շպրտել» մեկի մեջ, որպեսզի խուսափեն յուրաքանչյուր տողից վերադառնալուց: Այս դեպքում, սովորական Tcl փոխարինումներ տեղի կունենան, չնայած braces.

Եթե ​​օրինակը հիմնական բառն է , ապա համապատասխան մարմինը կատարվում է վերջնական արդյունքի վրա: Եթե ​​օրինակները հիմնական բառապաշարն է, ապա համապատասխան մարմինը կատարվում է ժամանակի ընթացքում: Եթե ​​ոչ մի ժամանակահատվածի բանալի բառ չի օգտագործվում, ապա անսպասելի անգործություն է կատարվում ժամանակի ընթացքում: Կանխավճարային տեւողությունը 10 վայրկյան է, բայց կարող է սահմանվել, օրինակ `30,« սահմանված ժամանակահատվածը 30 »հրամանով: Անսահման ժամանակավորումը կարող է նշանակվել արժեքի -1-ով: Եթե ​​նիշը ստեղնաշարի լռելյայն է , ապա համապատասխան մարմինը կատարվում է ցանկացած timeout- ի կամ վերջի վերջի վրա:

Եթե ​​օրինակ համընկնում է, ապա համապատասխան մարմինը կատարվում է: ակնկալում է մարմնի արդյունքը (կամ դատարկ տողը, եթե ոչ մի օրինակ չի համապատասխանում): Այն դեպքում, երբ բազմակի նախշերը համապատասխանում են, առաջինը հայտնվում է մարմնի ընտրության համար:

Ամեն անգամ, երբ նոր արտադրանքը հասնում է, այն համեմատվում է յուրաքանչյուր օրինակին, որոնք նշված են կարգի մեջ: Այսպիսով, դուք կարող եք ստուգել խաղադաշտի բացակայությունը `վերջին օրինակին ներկայացնելով երաշխավորված ինչ-որ բան, ինչպես արագ: Այն դեպքերում, երբ չկա հուշում, դուք պետք է օգտագործեք ժամանակի տեւողություն (ճիշտ այնպես, ինչպես դուք կխնդրեիք ձեռքով փոխել):

Պատկերները նշված են երեք ձեւով: Լռելյայնորեն, օրինակները նշվում են ինչպես Tcl- ի լարային խաղի հրամանով: (Նման օրինակները նույնպես նման են C-shell կանոնավոր արտահայտություններին, որոնք սովորաբար կոչվում են «գլոբ» ձեւեր): The -gl դրոշը կարող է օգտագործվել պաշտպանելու նախշերով, որոնք կարող են հակառակ դեպքում ակնկալել դրոշներ, որպեսզի դա կատարվի: Ցանկացած օրինակ, որը սկսվում է «-» - ից, պետք է պաշտպանված լինի այս ձեւով: ("-" սկսած բոլոր տողերը պահվում են ապագա տարբերակների համար):

Օրինակ, հաջորդ հատվածը փնտրում է հաջող մուտքի համար: (Նշենք, որ աբորտը ենթադրվում է սցենարի այլ վայրում սահմանված կարգով):

սպասում {busy {puts busy \ n; exp_continue} չհաջողվեց չեղարկել «անվավեր գաղտնաբառ» անջատված timeout- ը չեղյալացված կապակցված}

Գնանշումները անհրաժեշտ են չորրորդ օրինակում, քանի որ այն պարունակում է մի տարածք, որը այլ կերպ կցուցաբերի գործողության օրինակ: Նույն ակցիայի հետ կապված օրինակները (օրինակ `3-րդ եւ 4-րդ) պահանջում են կրկին գործողությունների ցուցակագրում: Սա կարող է խուսափել regexp ոճի ձեւերի օգտագործմամբ (տես ստորեւ): Glob style ոճերի ձեւավորման մասին լրացուցիչ տեղեկություններ կարելի է գտնել Tcl- ի ձեռնարկում:

Regexp- ի ոճերի օրինակները հետեւում են Tcl- ի regexp- ի (կարճ համար «կանոնավոր արտահայտության») հրամանով սահմանված շարահյուսությանը: regexp patterns- ը ներկայացվում է դրոշի հետ: Նախորդ օրինակը կարող է կրկնօրինակվել, օգտագործելով regexp- ի, ինչպես:

սպասում {busy {puts busy \ n; exp_continue} -re "չհաջողվեց | անվավեր գաղտնաբառ" անջատված timeout ընդհատված է}

Երկու տիպի օրինակները «չհաստատված» են: Սա նշանակում է, որ օրինաչափությունները չեն համապատասխանում ամբողջ տողը, բայց կարող են սկսվել եւ վերջ տալ խաղը ցանկացած տողում (քանի դեռ ամեն ինչ համապատասխանում է): Օգտագործեք ^ `համընկնում տողերի սկիզբի եւ $ վերջի համընկնելու հետ: Նշենք, որ եթե չեք սպասում լարերի ավարտին, ձեր պատասխանները կարող են հեշտությամբ ավարտվել լարերի կեսին, քանի որ դրանք echoed է spawned գործընթացից: Մինչդեռ ճիշտ արդյունքներ արտադրելով, արտադրանքը կարող է անբնական տեսք ունենալ: Այսպիսով, օգտագործման $ խրախուսվում է, եթե դուք կարող եք նկարագրել նիշերը վերջում լարային.

Նշենք, որ շատ խմբագիրներում ^ եւ $ համապատասխանում են գծերի սկիզբը եւ վերջը: Այնուամենայնիվ, քանի որ ակնկալվում է, ոչ գծային կողմնորոշվածություն, այդ կերպարները համապատասխանում են տվյալ տվյալների սկիզբը եւ վերջը (ի տարբերություն գծերի), ներկայումս սպասում են համապատասխան բուֆեր: (Նաեւ տես ստորեւ բերված նշումը «համակարգային նեղության» մասին):

The -ex դրոշը առաջացնում է օրինակ, որը համապատասխանում է որպես «ճշգրիտ» տող: Ոչ մի մեկնաբանություն չի կատարվում (չնայած սովորական Tcl կոնվենցիաները պետք է պահպանվեն): Ճիշտ նախշերը միշտ անընթեռնելի են:

The -nocase դրոշը արտադրության մեծատառերի համար առաջացնում է համեմատություն, կարծես դրանք փոքրատառեր են: Դիզայնը չի ազդում:

Ընթերցման արդյունքում, ավելի քան 2000 բայտը կարող է ստիպել ավելի վաղ բայթ լինել «մոռանալ»: Սա կարող է փոխվել match_max ֆունկցիայի հետ : (Նշենք, որ չափազանց մեծ արժեքները կարող են դանդաղեցնել օրինակին համապատասխանողը): Եթե ցանկը ամբողջական է , ապա համապատասխան մարմինը կատարվում է, եթե match_max բայթ են ստացվել եւ ոչ մի այլ օրինակ չի համապատասխանում: Անկախ նրանից, թե ամբողջովին օգտագործվում է ամբողջ բառակապակցությունը , մոռացված նիշերը գրված են սպասելու համար (բուֆեր):

Եթե որոնիչը հիմնական բառն է, ապա nulls թույլատրվում են ( remove_nulls հրամանով), համապատասխան մարմինը կատարվում է, եթե մեկ ASCII 0- ը համապատասխանում է: Հնարավոր չէ համընկնել 0 bytes- ի glob կամ regexp նախշերով:

Մի օրինակ (կամ eof կամ full_buffer) համընկնումից հետո, համընկնող եւ նախկինում աննման արդյունքը պահպանվում է փոփոխական expect_out (բուֆեր) պարունակության մեջ : Մինչեւ 9 regexp substring համընկնումները պահպանվում են սպասվող_տ (1, տող) փոփոխականներում ` expect_out (9, string) : Եթե նրբաթիթեղի դրոշը օգտագործվում է նախքան օրինակ, ապա 10 տողերի սկզբնական եւ ավարտական ​​ցուցանիշները (ձեւի համար հարմար է) պահվում են ակնկալվող (X, սկիզբ) եւ ակնկալվող (X, վերջ) փոփոխականների մեջ , որտեղ X- ը նիշը համապատասխանում է բուֆերի մեջ ենթատող դիրքին: 0- ը վերաբերում է տողերի ամբողջին, որը համապատասխանում է ամբողջ օրինակին եւ ստեղծվում է գլոբի նախշերով, ինչպես նաեւ regexp նախշերով: Օրինակ, եթե գործընթացը թողարկեց «abcdefgh \ n» արտադրանքը, արդյունքը.

ակնկալում "cd"

կարծես հետեւյալ հայտարարությունները կատարվեցին.

set expect_out (0, string) cd սահմանել expect_out (buffer) abcd

եւ "efgh \ n" - ն թողարկվում է արտադրանքի բուֆերի մեջ: Եթե ​​գործընթացը արտադրում է "abbbcabkkkka \ n" արտադրանքը, արդյունքը.

ակնկալում են -indices-b "b (b *) * (k +)"

կարծես հետեւյալ հայտարարությունները կատարվեցին.

set expect_out (0, start) 1 set expect_out (0, end) 10 set expect_out (0, string) bbbcabkkkk սահմանել 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 expect_out (buffer) abbbcabkkkk

եւ արտադրանքի բուֆերի մեջ մնացել է "a \ n": «*» (Եւ -re "* *) ձեւը կհեռացնի արտադրանքի բուֆերը` առանց գործընթացի որեւէ այլ արդյունքի չի կարդում:

Սովորաբար, համընկնող արտադրանքը հեռացվում է ակնկալվող ներքին բուֆերներից: Սա կարող է կանխվել, նախադրյալով նախատիպը , առանց փոխանցման դրոշի: Այս դրոշը հատկապես օգտակար է փորձի մեջ (եւ կարող է կրճատվել «փորձելու համար» «հարմար» համար):

Ծածկանունը, որը կապված է համապատասխան արտադրանքի հետ (կամ eof կամ full_buffer), պահվում է expect_out (spawn_id) :

The -timeout դրոշը առաջացնում է ընթացիկ ակնկալվող հրամանը, օգտագործելով հետեւյալ արժեքը, որպես timeout փոփոխական, օգտագործելով timeout փոփոխականի արժեքը:

Նախաձեռնությամբ, օրինակները համապատասխանում են ընթացիկ գործընթացի արդյունքին, սակայն -i դրոշը հայտարարում է նշված spawn_id ցուցակից ելքագրումը համընկնում ցանկացած հաջորդ նմուշների հետ (մինչեւ հաջորդը): Spawn_id ցուցակը պետք է կամ լինի spaming_ids- ի առանձին ցուցակ կամ փոփոխական հղում պարունակող spawn_ids- ի ցուցակ:

Օրինակ, այս պրոցեսը սպասում է ընթացիկ գործընթացից, կամ «proc2» անվանումով spawn_id- ից «զբաղված», «չհաջողվեց» կամ «անվավեր գաղտնաբառ»:

ակնկալում {-i $ proc2 զբաղված {puts busy \ n; exp_continue} -re "չհաջողվեց | անվավեր գաղտնաբառ" անջատված timeout ընդհատված է}

Any_spawn_id- ի գլոբալ փոփոխականի արժեքը կարող է օգտագործվել ցանկացած spawn_ids- ի օրինակներին համապատասխանելու համար, որոնք նշված են բոլոր մյուս դրոշներով, որոնք ակնկալվում են ընթացիկ ակնկալիքով : The spawn_id- ը դրոշի հետ կապված ոչ մի հետագծով (այսինքն, անմիջապես հաջորդում է մեկ այլ), մատչելի է ցանկացած այլ օրինակների համար, որոնք ակնկալվում են ցանկացած ակնթարթային հրամանով, որը կապված է any_spawn_id- ի հետ:

The -i դրոշը կարող է նաեւ անվանել գլոբալ փոփոխական, որի դեպքում փոփոխականն ընթերցվում է ծղոտի ID- ների ցանկի համար: Տարբերությունը վերափոխվում է այն ժամանակ, երբ այն փոխվում է: Սա թույլ է տալիս փոփոխել I / O աղբյուրը, իսկ հրամանը կատարվում է: Spawn ID- ները, այս եղանակով տրամադրված են, կոչվում են «անուղղակի» ծաղկող ID- ներ:

Գործողություններ, ինչպիսիք են ընդմիջումը եւ շարունակելը, վերահսկողության կառույցներ են ստեղծում (այսինքն ` proc )` սովորական կերպով վարվել: Հանձնարարությունը exp_continue- ն թույլ է տալիս ակնկալել , որ շարունակում է գործել, այլ ոչ թե վերադարձնելը, ինչպես դա սովորաբար կլիներ:

Սա օգտակար է ակնհայտ loops- ից կամ ակնկալվող ակնկալվող հայտարարություններից խուսափելու համար: Հետեւյալ օրինակը մասնաճյուղի մասնիկի մասն է կազմում: The exp_continue- ը խուսափում է գրել երկրորդ ակնկալվող հայտարարություն (կրկին փնտրելու համար), եթե ռոգնին հուշում է գաղտնաբառը:

սպասեք {Password: {stty-echo send_user} գաղտնաբառ ($ օգտվողին) $ host- ում: "expect_user -re" (. *) \ n "send_user" \ n "ուղարկել" $ expect_out (1, string) \ r "stty echo exp_continue} սխալ {send_user} անվավեր գաղտնաբառ կամ հաշիվ \ n "exit} timeout {send_user" կապի համար $ host- ի ժամանած \ n "exit} eof {send_user \" կապակցված հյուրընկալողը չի հաջողվել: $ expect_out (buffer) "exit} վերստին հուշում}

Օրինակ, հետեւյալ հատվածը կարող է օգնել օգտվողին ուղղել փոխազդեցությունը, որն արդեն ամբողջովին ավտոմատացված է: Այս դեպքում տերմինը տեղադրվում է հումքի ռեժիմում: Եթե ​​օգտագործողը սեղմում է «+», փոփոխությունը ավելացվում է: Եթե ​​«p» սեղմված է, մի քանի վերադարձներ ուղարկվում են գործընթացին, հնարավոր է, ինչ-որ կերպ խմել, եւ «i» - ն թույլ է տալիս օգտագործողին փոխգործակցել գործընթացով `արդյունավետորեն գողանալով վերահսկողությունը սցենարից: Յուրաքանչյուր դեպքում, exp_continue թույլ է տալիս ներկայիս ընթացիկ գործողությունը կատարելուց հետո ակնկալել շարունակել նկարագրությունը :

stty raw -echo expect_after {-i $ user_spawn_id "p" {ուղարկել "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" ելք}

Լռելյայնորեն, exp_continue- ը վերականգնում է ժամանակի տուփը : Ժամաչափը չի վերսկսվում, եթե exp_continue- ը կոչվում է -continue_timer դրոշի:

ակնկալիք [expect_args]
աշխատում է նույնը կանխատեսելուց առաջ, բացառությամբ, որ եթե ակնկալվող եւ ակնկալվող օրինաչափությունները կարողանան համապատասխանել, ակնկալվող օրինակն օգտագործվում է: Լրացուցիչ տեղեկությունների համար տեսեք ակնկալվող նախագիծը :

ակնկալիքը [expect_args]
ակնկալում է նույն փաստարկները, սակայն ակնկալվում է անմիջապես: Նմուշները փորձարկվում են, երբ նոր մուտք է գործում: Օրինակի տեւողության եւ դեֆոլտը անիմաստ են սպասել անցյալին եւ լուռ հեռացվում են: Հակառակ դեպքում, expect_background հրամանը օգտագործում է expect_before եւ expect_after նախշերով, ինչպես ակնկալում է:

Երբ ակնկալվում են հետճգնաժամային գործողություններ, գնահատվում են նույն արածեցման ID- ի ֆոնային մշակումը արգելափակված է: Ֆոնային վերամշակումը արգելափակում է, երբ ակցիան ավարտվում է: Ֆոնային մշակումն արգելափակված է, հնարավոր է, որ նախեւառաջ ակնկալես միեւնույն ծղոտի ID- ով:

Անհնար է իրականացնել ակնկալվող ակնկալիքը : expect_background որոշակի ծղոտի ID- ի համար ջնջվում է `հայտարարելով նոր expect_background նույն ծղոտի ID- ով: Հայտարարելով ակնկալիքը `առանց նախշազարդի հեռացնում է տվյալ ծաղկակաղացը ֆոնային ձեւերով համապատասխանելու ունակությունից:

սպասվող [expect_args]
ակնկալում է նույն փաստարկները, սակայն ակնկալվում է անմիջապես: Նախագծի գործողությունների զույգերը, որոնք ակնկալում են վերջին ակնկալիքները , նույն ծնկադիր id- ի հետ անուղղակիորեն ավելացվում են հետեւյալ ակնկալվող հրամաններին: Եթե ​​օրինակները համապատասխանում են, ապա այն վերաբերվում է ինչպես ակնկալվում է հրամանատարության մեջ, եւ համապատասխան մարմինը կատարվում է ակնկալվող հրամանագրի համատեքստում: Եթե ​​երկուսն էլ ակնկալում են նախորդից եւ սպասում են, ապա ակնկալվում է նախքան նախշը:

Եթե ​​ոչ մի օրինակ չի նշվում, ծալքի ID- ն չի ստուգվում որեւէ նախշերով:

Եթե ​​մինչեւ a -i դրոշը չգերազանցի , ակնկալեք նախքան նախշերով նախշերը համընկնում են ծղոտի ID- ի հետ, որը սահմանված է այն ժամանակ, երբ ակնկալվող նախագիծը կատարվել է (ոչ այն դեպքում, երբ նրա մոդելը համապատասխանում է):

The -info դրոշը առաջացնում է ակնկալել մինչեւ նախադեպը վերադարձնելու համար, թե ինչ մոդելներ կհամապատասխանեն: Լռելյայնորեն, այն հաղորդում է ներկայիս ծղոտի ID- ի մասին: Ձկնամթերքի օպտիմալացման մասին տեղեկատվության համար կարող է տրվել օպցիոնի կրկնօրինակը: Օրինակ

ակնկալվող նախագիծը -i $ proc

Առավելագույնը կարող է տրվել մեկ ծղոտի ID- ի ճշգրտում: Դրոշը, բջջային կապը, ճնշում է ուղիղ ծաղկման տերմինները, որոնք գալիս են միայն անուղղակի բնութագրերից:

Ծղոտի ID- ի ճշգրտման փոխարեն, «-all» դրոշը «-info» -ին կհաղորդի բոլոր ծաղկող ID- ների մասին:

The -info դրոշի արտադրանքը կարող է օգտագործվել որպես expect_before փաստարկ:

սպասելի [expect_args]
նման է ակնկալել, բայց կարդում է / dev / tty (այսինքն `ստեղնաշարի օգտագործողից) նիշերը: Նախապես, ընթերցումը կատարվում է եփած ռեժիմում: Այսպիսով, գծերը պետք է վերադառնան, որպեսզի ակնկալեն տեսնել դրանք: Սա կարող է փոխվել stty- ի միջոցով (տես ներքեւում ստի հրամանը):

ակնկալիք [expect_args]
նման է ակնկալել, բայց կարդում է ստիններից նիշերը (այսինքն, օգտագործողի ստեղնաշարերը): Նախապես, ընթերցումը կատարվում է եփած ռեժիմում: Այսպիսով, գծերը պետք է վերադառնան, որպեսզի ակնկալեն տեսնել դրանք: Սա կարող է փոխվել stty- ի միջոցով (տես ներքեւում ստի հրամանը):

պատառաքաղ
ստեղծում է նոր գործընթաց : Նոր գործընթացը ընթացիկ ակնկալվող գործընթացի ճշգրիտ պատճենն է: Հաջողության դեպքում, պատառիկը վերադառնում է նոր (երեխայի) գործընթացին եւ վերադարձնում է երեխայի գործընթացի գործընթացի IDը ծնողի գործընթացին : Անհաջողության դեպքում (անխուսափելիորեն ռեսուրսների պակասի պատճառով, օրինակ `փոխանակման տեղը, հիշողություն), պատառաքաղը վերադառնում է -1 ծնողի գործընթացին եւ ոչ մի երեխայի գործընթաց չի ստեղծվում:

Կատարված գործընթացները ելքային հրամանի միջոցով դուրս են գալիս , ճիշտ այնպես, ինչպես բուն գործընթացը : Պատկառելի գործընթացները թույլ են տալիս գրել տեղեկամատյան ֆայլերը: Եթե ​​դուք չեք ջնջում գործընթացների մեծ մասում խափանումները կամ անտեսումը, արդյունքը կարող է շփոթեցնել:

Որոշ pty իրականացումները կարող են շփոթվել մի քանի ընթերցողների եւ գրողների կողմից, նույնիսկ մի պահ: Այսպիսով, ամենավտանգավորն այն է, որ հալման գործընթացի առաջացումը:

փոխազդել [string1 body1] ... [stringn [bodyn]]
թույլ է տալիս վերահսկել ընթացիկ գործընթացը օգտագործողին, այնպես, որ ստեղնաշարերը ուղարկվեն ընթացիկ գործընթացին , եւ ընթացիկ գործընթացի stdout եւ stderr վերադարձվում են:

String-body զույգերը կարող են սահմանվել որպես փաստարկներ, որոնց դեպքում մարմինը կատարվում է համապատասխան տողը մուտքագրելու դեպքում: (Լռելյայն `լարերը չեն ուղարկվում ընթացիկ գործընթացին ): Թարգմանչի հրամանը ենթադրվում է, եթե վերջնական մարմինը բացակայում է:

Եթե ​​ամբողջ փոխազդեցության հայտարարության փաստարկները պահանջում են մեկից ավելի գիծ, ​​ապա բոլոր փաստարկները կարող են «շպրտել» մեկի մեջ, որպեսզի խուսափեն յուրաքանչյուր տողից վերադառնալուց: Այս դեպքում, սովորական Tcl փոխարինումներ տեղի կունենան, չնայած braces.

Օրինակ, հետեւյալ հրամանը անցնում է փոխգործակցելով հետեւյալ string-body զույգերի հետ. Երբ Z Z սեղմված է, Ակնկալը կասեցված է: (The -release flag- ը վերականգնում է տերմինալների ռեժիմները:) Երբ A ^ սեղմված է, օգտագործողը տեսնում է, «Դուք տպել եք վերահսկիչ-A» եւ գործընթացը ուղարկվում է ^ A: Երբ սեղմվում է $, օգտվողը տեսնում է ամսաթիվը: Երբ C սեղմված է, Սպասեք ելքերը: Եթե ​​«foo» մուտքագրվի, օգտվողը տեսնում է «բար»: Երբ ~~ սեղմված է, ակնկալվող թարգմանիչն ինտերակտիվորեն անցնում է:

set CTRLZ \ 032 interact {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "Դուք մուտքագրել եք վերահսկողություն-A \ n"; ուղարկեք "\ 001"} $ {send_user "Ամսաթիվը [ժամացույցի ձեւաչափը [ժամացույցի վայրեր]]."} \ 003 exit foo {send_user "bar"} ~~}

Լարային մարմնի զույգերի մեջ տողերը համապատասխանում են այն փաստին, որ դրանք նշված են որպես փաստարկներ: Մասնակի համընկնումները, որոնք ընթացիկ գործընթացին չեն ուղարկվում, սպասվում են մնացորդի սպասում: Եթե ​​նիշերը մուտքագրվեն այնպիսին, որ այլեւս չի կարող լինել համընկնում, ապա միայն լարային մասը կուղարկվի այն գործընթացին, որը հնարավոր չէ այլ մեկնարկել: Այսպիսով, տողերը, որոնք մասնակի համընկնումների ենթատեքստ են, կարող են հետագայում համապատասխանել, եթե վերջնականապես ձախողված բնօրինակ տողերը ձախողվեն:

Ըստ լռելյայն, string համընկնումը ճշգրիտ է, առանց վայրի քարտերի : (Ի հակադրություն, ակնկալվող հրամանատարությունը օգտագործում է գլոբի ոճը նախշերով): -ex դրոշը կարող է օգտագործվել պաշտպանելու նախշերով, որոնք կարող են հակառակ դեպքում համապատասխանեցնել դրոշները: Ցանկացած օրինակ, որը սկսվում է «-» - ից, պետք է պաշտպանված լինի այս ձեւով: ("-" սկսած բոլոր տողերը պահվում են ապագա տարբերակների համար):

The դրոշը դրոշը ստիպում է տողը մեկնաբանել որպես regexp ոճի ձեւ: Այս դեպքում, համընկնող տողերը պահվում են փոխազդող interact_out- ում , ակնկալվում է, որ իր արտադրանքը կախված է փոփոխական փոփոխությունից : Նմանատիպ դրսեւորումներն ամրապնդվում են :

Eof- ի օրինակը ներկայացում է գործողություն, որը կատարվում է վերջի վրա: Առանձին eof նմուշը կարող է հետեւել նաեւ դրոշի դրոշին, որի դեպքում այն ​​համապատասխանում է, եթե eof հայտնաբերվում է արտադրության մասին: Լռակյաց գործողությունը «վերադառնում է», որպեսզի փոխազդեցությունը պարզապես վերադառնա ցանկացած EOF- ի վրա:

Օրինակի տեւողության ժամանակահատվածը ներկայացնում է տեւողության (վայրկյանում) եւ գործողություն, որը կատարվում է տվյալ ժամանակի համար ոչ մի կերպար չի ընթերցվելուց հետո: Ժամանակը տրված ժամանակահատվածը վերաբերում է ամենավերջին ընթացակարգին : Չկա լռելյայն ժամանակահատված: Հատուկ փոփոխական "timeout" (օգտագործվող ակնկալվող հրամանով) չի ազդում այս ժամանակի ընթացքում:

Օրինակ, հետեւյալ հայտարարությունը կարող է օգտագործվել autologout օգտագործողների համար, ովքեր մեկ ժամով ոչինչ չեն գրել, բայց դեռեւս հաճախակի են ստանում համակարգային հաղորդագրություններ:

փոխազդել - թողարկել $ user_spawn_id timeout 3600 return -output \ $ spawn_id

Եթե ​​օրինակը հիմնական բառն է , ապա nulls թույլատրվում է ( remove_nulls հրամանով), համապատասխան մարմինը կատարվում է, եթե մեկ ASCII 0- ը համապատասխանում է: Հնարավոր չէ համընկնել 0 bytes- ի glob կամ regexp նախշերով:

Դրոշի տառով նախապատմություն նախադրելու համար ` գրագիրն առաջացնում է interact_out (spawn_id) փոփոխականը, որը սահմանում է spawn_id, որը համապատասխանում է օրինակին (կամ eof):

Գործողություններ, ինչպիսիք են ընդմիջումը եւ շարունակելը, վերահսկողության կառույցներ են ստեղծում (այսինքն ` proc )` սովորական կերպով վարվել: Այնուամենայնիվ, վերադարձի պատճառները փոխազդում են վերադառնալու իր զանգողին, իսկ inter_return- ն առաջացնում է փոխազդեցություն `զանգահարողին վերադարձնելու համար: Օրինակ, եթե «proc foo» - ը կոչ է անում փոխազդել, որը հետագայում իրականացրել է inter_return գործողությունը, proc foo- ը կվերադառնա: (Սա նշանակում է, որ եթե փոխազդեցությունը թարգմանիչներին ինտերակտիվ կերպով մուտքագրելը վերադառնա , ապա փոխազդեցությունը կշարունակվի, իսկ inter_return- ը փոխազդեցության կհանգեցնի իր զանգահարողին:

Փոխազդեցության ընթացքում հում ռեժիմն օգտագործվում է այնպես, որ բոլոր նիշերը կարող են փոխանցվել ընթացիկ գործընթացին : Եթե ​​ներկայիս գործընթացը չի վերահսկում աշխատանքի հսկողության ազդանշանները, այն կդադարի, եթե ուղարկի կանգառ ազդանշան (ըստ լռելյայն ^ Z): Վերագործարկեք այն, ուղարկեք շարունակական ազդանշան (օրինակ, «kill -CONT»): Եթե ​​դուք իսկապես ուզում եք ուղարկել SIGSTOP- ին նման գործընթացին (ըստ Z- ի), ապա առաջինը դիտեք csh- ի հալման եւ ապա վարեք ձեր ծրագիրը: Մյուս կողմից, եթե ցանկանում եք ուղարկել SIGSTOP- ին, ակնկալելու համար, առաջին հերթին զանգահարեք թարգմանիչ (գուցե փախուստի բնույթ օգտագործելով), ապա սեղմեք ^ Z:

String-body զույգերը կարող են օգտագործվել որպես ստեղնաշար, խուսափելու համար թարգմանիչ ներս մտնելուց եւ հրամանները գործել միջամտորեն: Նախորդ տերմինալ ռեժիմն օգտագործվում է, երբ կատարվում է լարային մարմնի զույգի մարմինը:

Արագության համար գործողությունները կատարվում են հումքի ռեժիմում `լռելյայնորեն: The ծածկույթը դրոշը վերափոխում է տերմինալը այն ռեժիմին, որը նախկինում փոխազդեցություն էր կատարվել (անխափան, պատրաստված ռեժիմ): Նշենք, որ նիշերը մուտքագրվում են, երբ ռեժիմն անջատված է, կարող է կորցնել (որոշ համակարգերում տերմինալի վարորդի դժբախտությունը): Օգտագործման միակ պատճառը, եթե ձեր գործողությունը կախված է պատրաստի ռեժիմում վազումից :

The -echo դրոշը ուղարկում է հետեւյալ կերպարներին համապատասխանող նիշերը, որոնք առաջացնում են դրանք, քանի որ յուրաքանչյուր բնույթ է ընթերցվում: Սա կարող է օգտակար լինել, երբ օգտվողը պետք է դիտի հետադարձ կապի մասամբ տպագրված օրինակներից:

Եթե ​​մի օրինակ է հնչում, բայց ի վերջո չի համապատասխանում, ապա սիմվոլները ուղարկվում են աճեցված գործընթացին : Եթե ​​փշրված գործընթացը նրանց արձագանքում է, ապա օգտագործողը երկու անգամ կտեսնի կերպարները: -Եխո , հավանաբար, միայն հարմար է այն դեպքերում, երբ օգտագործողը հավանական չէ, որ չի ավարտի օրինակին: Օրինակ, հետեւյալ հատվածը rftp- ից, recursive-ftp- ի սցենարից է, որտեղ օգտագործողը հուշում է ~ g, ~ p կամ ~ l, մուտքագրելու ընթացիկ գրացուցակը recursively. Սրանք այնքան հեռու են նորմալ ftp հրամաններից, որ օգտագործողը հավանական չէ գրել ~ հետեւել որեւէ այլ բան, բացառությամբ սխալմամբ, որի դեպքում նրանք, հավանաբար, պարզապես անտեսում են արդյունքը:

interact {-cho ~ g {getcurdirectory 1} -exo ~ l {getcurdirectory 0} -exo ~ p {putcurdirectory}}

The -numbering flag- ն ուղարկում է հոդեր, որոնք համապատասխանում են հետեւյալ օրինակին, հոդերի ընթերցման գործընթացին :

Սա օգտակար է, երբ ցանկանում եք ծրագրին արձագանքել օրինակին: Օրինակ, կարելի է հետեւել, թե որտեղ է մարդը հավաքում (Hayes ոճով մոդեմ): Ամեն անգամ, երբ «atd» - ը տեսնում է, սցենարը գրառում է մնացած տողը:

{ներդիրը} {interact -nobuffer -re "(. *) \ r" returns put $ log "[ժամացույցի ձեւաչափը [ժամացույցը վայրկյաններ]]: հավաքված $ interact_out (1, string)"} interact -nobuffer "atd" lognumber

Փոխազդեցության ընթացքում log_user- ի նախորդ օգտագործումը անտեսվում է: Մասնավորապես, փոխազդեցությունը ստիպելու է իր արտադրանքի մուտքագրումը (ուղարկված ստանդարտ արտադրանքի), քանի որ ենթադրվում է, որ օգտվողը չի ցանկանում փոխազդել կուրորեն:

The -o- ի դրոշը առաջացնում է հետեւյալ հիմնական-մարմնի զույգերը, որոնք կիրառվում են ընթացիկ գործընթացի արդյունքում : Սա կարող է օգտակար լինել, օրինակ, երբ տեղի է ունենում տանտերերի հետ, որոնք հեռահաղորդակցման ժամանակաշրջանում անցանկալի նիշ են ուղարկել:

Լռելյայնորեն, փոխազդեցությունը ակնկալում է օգտվողին գրել stdin եւ stdout ակնկալել գործընթացը ինքնին. The -u դրոշը («օգտագործողի» համար) ստիպում է փոխազդել օգտվողին որպես իր փաստարկի (որը պետք է լինի spawned id) անվանել գործընթացը :

Սա թույլ է տալիս երկու անընդմեջ գործընթացները միավորել միմյանց, առանց բացական հանգույց օգտագործելու: Խախտելու համար օգնելու համար Ակնկալել ախտորոշումները միշտ էլ գնում են stderr (կամ stdout որոշակի անտառահատումների եւ կարգաբերման տեղեկատվության համար): Նույն պատճառով, թարգմանիչի հրամանները կարդացվում են ինտերակտիվորեն stdin- ից:

Օրինակ, հաջորդ հատվածը ստեղծում է մուտքի գործընթաց : Այնուհետեւ այն հավաքում է օգտագործողը (չի ցուցադրվում), եւ վերջապես կապում է երկուսը: Անշուշտ, ցանկացած գործընթաց կարող է փոխարինել մուտքի համար: Օրինակ, ռոբոտը թույլ է տալիս օգտվողին աշխատել առանց հաշվի եւ գաղտնաբառի տրամադրման:

spawn_id spawn tip մոդեմ # հավաքեք վերադարձնել օգտագործողին # միացնել օգտվողին մուտք գործելու համար, -u $ login

Արդյունքները բազմակի գործընթացների ուղարկելու համար նշեք յուրաքանչյուր ծալովի ID ցուցակ, նախադիտված դրոշով: Արդյունքների ծավալի միավորների համար մուտքագրվելը կարող է որոշվել ծածկի id ցուցակով, որը նախադրվում է ` դրոշի կողմից: (Երկուսն էլ ` թողարկումը եւ թողարկումը կարող է ցուցակները վերցնել միեւնույն ձեւով, ինչպես, օրինակ, -i դրոշը ակնկալվող հրամանով, բացառությամբ, որ ցանկացած_spawn_id- ը փոխազդեցության մեջ իմաստալից չէ): Այս մուտքի համար կիրառվում են հետեւյալ դրոշներն ու տողերը (կամ օրինակները) մուտքի դրոշը հայտնվում է: Եթե ​​ոչ - նշում է հայտնվում, ապա ելույթը ենթադրում է, «- $ user_spawn_id -output»: (Նմանապես, օրինակները, որոնք չունեն, -հաշվեկշիռ ): Եթե մեկ նշում է նշվում, ապա այն $ over_drays է user_spawn_id: Եթե ​​երկրորդ նշումը նշված է, ապա այն $ overrides $ spawn_id- ը: Լրացուցիչ դրույթները կարող են սահմանվել:

Երկու ենթադրվող մուտքային գործընթացները կանխորոշված ​​են, որ իրենց արդյունքները թողարկվեն որպես $ spawn_id եւ $ user_spawn_id (հակառակ): Եթե ​​դրոշի դրոշը հայտնվում է դրոշի դրոշի հետ, այդ գործընթացից նիշերը վերացվում են:

The -i դրոշը ներկայացնում է ընթացիկ spawn_id- ի փոխարինումը, երբ ոչ մի այլ -put կամ -output դրոշներ չեն օգտագործվում: A -i դրոշը նշանակում է -o դրոշ:

Հնարավոր է փոխել գործընթացները, որոնք շփվում են անուղղակի ծաղկումային ID- ների միջոցով: (Անուղղակի ծաղկաբույլ ID- ները նկարագրված են ակնկալվող հրամանատարության բաժնում): Անուղղակի ծղրիդ ID- ն կարող է սահմանվել -i, -u, -input, կամ -output flags:

թարգմանիչ [args]
պատճառը օգտվողին ինտերակտիվորեն հուշում է ակնկալել եւ Tcl հրամանների համար: Յուրաքանչյուր հրամանի արդյունքը տպագրվում է:

Գործողություններ, ինչպիսիք են ընդմիջումը եւ շարունակելը, վերահսկողության կառույցներ են ստեղծում (այսինքն ` proc )` սովորական կերպով վարվել: Այնուամենայնիվ, վերադարձը առաջացնում է թարգմանչի վերադարձը իր զանգողը , իսկ inter_return- ը թարգմանչի առաջացնում է վերադարձ դեպի իր զանգահարողը: Օրինակ, եթե «proc foo» - ը թարգմանիչ է կոչում, որը հետագայում իրականացրել է inter_return գործողությունը, proc foo- ը կվերադառնա: Ցանկացած այլ հրաման առաջացնում է թարգմանչի շարունակել հրամցնել նոր հրամանները:

Լռելյայն, հուշում պարունակում է երկու ամբողջական թվեր: Առաջին թվերը նկարագրում են գնահատման բլոկի խորությունը (այսինքն, քանի անգամ Tcl_Eval- ը կոչվել է): Երկրորդ ամբողջը հանդիսանում է Tcl պատմության նույնացուցիչը: Հուշը կարող է սահմանվել `սահմանելով« prompt1 »կարգը, որի վերադարձի արժեքը դառնում է հաջորդ հրամանը: Եթե ​​հայտարարության մեջ կա բացատիպ արտահայտություններ, parens, braces կամ brackets, երկրորդական հուշում (լռելյայն «+>») տրվում է նոր գծի վրա: Երկրորդային հուշումը կարող է սահմանվել `սահմանելով« prompt2 »կարգը:

Թարգմանչի ընթացքում օգտագործվում է եփած ռեժիմը, նույնիսկ եթե նրա զանգերը հումքի ռեժիմն է:

Եթե ​​stdin- ը փակ է, թարգմանիչը կվերադառնա, եթե դրոշի օգտագործման դեպքում, որի դեպքում հետագա փաստարկը ներկայացվի:

log_file [args] [[-a] ֆայլ]
Եթե ​​ֆայլի անունը տրամադրվի, log_file- ը կներկայացնի նիստի գրառումը (սկսած այդ կետից) ֆայլում: log_file- ը կդադարեցնի ձայնագրությունը, եթե որեւէ փաստարկ չի տրվում: Ցանկացած նախորդ տեղեկամատյան ֆայլը փակ է:

Ֆայլի անունի փոխարեն, Tcl- ի ֆայլի նույնացուցիչը կարող է տրամադրվել, օգտագործելով բաց կամ լուսաբանում դրոշները: Սա նման է spawn հրամանին: (Տես հավելյալ տեղեկությունների համար ծղոտը :)

The- ի դրոշի ուժերը մուտք են գործել, որը ճնշված է log_user հրամանով:

Լռելյայն, log_file հրամանը ավելացնում է հին ֆայլեր, այլ ոչ թե կրճատում դրանք, քանի որ հեշտությամբ կարող են մուտք գործել անջատելը եւ բազմիցս անգամ մեկ նիստում: Ֆայլեր կոճապրելու համար օգտագործեք- չընդհատել դրոշը:

The -info դրոշը log_file- ն է վերադարձնում տրված վերջին ոչ-տեղեկատվական փաստարկների նկարագրությունը:

log_user-info | 0 | 1
Լռելյայնորեն, ուղարկել / սպասել երկխոսությունը մուտք է գործում stdout (եւ logfile, եթե բաց է): Կարգավորումը stdout- ը անջատված է «log_user 0» հրամանով եւ «log_user 1» - ի կողմից reenabled: Logfile- ին մուտք գործելը անփոփոխ է:

The -info դրոշը log_user- ին առաջացնում է տրված վերջին ոչ-տեղեկատվական փաստարկների նկարագրությունը:

match_max [-d] [-i spawn_id] [size]
սահմանում է բեռնարկղի չափը (բայթերում), որոնք ակնկալվում են ներսից: Չափման փաստարկով, ընթացիկ չափը վերադարձվում է:

-d դրոշով, նախնական չափը սահմանվում է: (Նախնական լռելյայնը `2000): -i դրոշի հետ չափը սահմանվում է անվանական ծաղկման ID- ի համար, հակառակ դեպքում այն ​​սահմանվում է ընթացիկ գործընթացի համար :

կափարիչ [- # spawn_id] [- # spawn_id] [...] ծրագիր [args]
իրականացնում է « ընթացիկ ակնկալիք» ծրագրի փոխարեն «ծրագրային արգ»: Մի ծածուկ շեղանկյուն փաստարկը հրամանատարի անունի տողը ստիպում է կարծել, որ այն մուտքի վահանակ էր: Բոլոր spawn_ids- ները փակ են, բացառությամբ նրանց, ովքեր անվանում են փաստարկներ: Սրանք նշված են ֆայլի նույնացուցիչների վրա:

Spawn_ids- ը քարտեզագրվում է ժառանգելու նոր ծրագրի համար նույնականացման համար: Օրինակ, հետեւյալ տողը շախմատ է վարում եւ թույլ է տալիս վերահսկել ընթացիկ գործընթացը , ասենք, շախմատիստ:

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id շախմատ

Սա ավելի արդյունավետ է, քան «interact -u», սակայն այն զոհաբերում է ծրագրավորված փոխազդեցության իրականացման ունակությունը, քանի որ « Սպասում» գործընթացը այլեւս չի վերահսկվում:

Նշենք, որ վերահսկման տերմինը չի տրամադրվում: Այսպիսով, եթե դուք անջատեք կամ հիշեք ստանդարտ ներդրումը, աշխատանքը վերահսկող ծրագրեր (կաբինետներ, մուտքի եւ այլն) չեն գործի:

հավասարություն [-d] [-i spawn_id] [value]
սահմանում է, թե արդյոք հավասարակշռությունը պետք է պահպանվի կամ կորզվի ծալված գործընթացներից: Եթե արժեքը զրոյական է, ապա հավասարակշռությունը զրկվում է, հակառակ դեպքում այն ​​չի կորցնում: Առանց արժեքի փաստարկի, ներկայիս արժեքը վերադարձվում է:

-d դրոշի հետ, նախնական պարիտետի արժեքը սահմանվում է: (Նախնական լռելյայն 1-ն է, այսինքն `հավասարությունը չի զրկվում): -i դրոշի հետ, հավասարության արժեքը սահմանվում է անվանական ծալքի ID- ի համար, հակառակ դեպքում այն ​​սահմանվում է ընթացիկ գործընթացի համար :

remove_nulls [-d] [-i spawn_id] [value]
սահմանում է, թե արդյոք nulls պահպանվում են կամ հեռացվել են արտադրության դուրս spawned գործընթացների առաջ pattern համընկնում կամ պահում է փոփոխական ակնկալել կամ interact_out . Եթե արժեքը 1 է, ապա nulls- ը հանվում է: Եթե արժեքը 0 է, ապա nulls չեն հանվում: Առանց արժեքի փաստարկի, ներկայիս արժեքը վերադարձվում է:

-d դրոշի հետ, նախնական արժեքը սահմանվում է: (Նախնական լռելյայն 1-ն է, այսինքն, nulls- ը հանվում է): -i դրոշի հետ արժեքը սահմանվում է անվանական ծաղկման ID- ի համար, հակառակ դեպքում այն ​​սահմանվում է ընթացիկ գործընթացի համար :

Անկախ նրանից, թե արդյոք nulls են հեռացվել, Ակնկալում է, որ null բայթ է գրանցվեք եւ stdout:

ուղարկել [-flags] տողը
Ուղարկում է տողը ընթացիկ գործընթացին : Օրինակ, հրամանը

ուղարկել «բարեւ աշխարհ \ r»

ուղարկել հերոսների, helloworld ընթացիկ գործընթացին : (Tcl- ն ներառում է printf- ի նման հրաման ( ֆորմատ կոչված), որը կարող է կառուցել կամայականորեն համալիր տողեր:

Անձնավորությունները անմիջապես ուղարկվում են, չնայած գծային բուֆերացված մուտքագրված ծրագրերը չեն կարդում նիշերը մինչեւ վերադարձի բնույթը: Վերադարձի բնույթը նշանակված է «\ r»:

The դրոշը ստիպում է հաջորդ փաստարկը մեկնաբանել որպես տող, այլ ոչ թե դրոշ: Ցանկացած տողը կարող է նախորդել «-» -ին, թե իրականում նման է դրոշի: Սա ապահովում է հուսալի մեխանիզմ `փոփոխական տողերի նշելով, առանց վրիպազերծելու նրանց, որոնք պատահաբար նման են դրոշներ: ("-" սկսած բոլոր տողերը պահվում են ապագա տարբերակների համար):

The -i դրոշը հայտարարում է, որ տողը ուղարկվում է spawn_id անունով: Եթե ​​spawn_id- ը user_spawn_id- ը է , եւ տերմինը հումքի ռեժիմում է, լարային գծերը վերադարձվում են վերադարձի նոր շարքի հաջորդականությամբ, որպեսզի հայտնվեն, թե տերմինալը պատրաստված է ռեժիմով: Հրապարակված դրոշը անջատում է այս թարգմանությունը:

The -null flag- ն ուղարկում է նիշ նշաններ (0 բայթ): Լռելյայն, մեկ նուլ է ուղարկվում: Մի ամբողջ թիվ կարող է հետեւել -հարցել , թե ինչպես պետք է ուղարկի քանի զառիթափ :

Թռիչքի դրոշը առաջացնում է ընդմիջման վիճակը: Սա միայն նշանակություն ունի, եթե ծղոտը ID- ն վերաբերում է «ծաղկաման» միջոցով բացված մի տիպի սարքին: Եթե ​​դուք հուշում եք նման պրոցես , ապա պետք է օգտագործեք հուշի կոնվենցիա `ընդմիջման առաջացման համար:

The դրոշի ուժերի արտադրանքը պետք է ուղարկվի «դանդաղ», այսպիսով խուսափել ընդհանուր իրավիճակում, որտեղ համակարգիչը outtypes մուտքային բուֆերային, որը նախատեսված է մի մարդու, որը երբեք դուրս թիրախ նույն բուֆեր . Այս արտադրանքը վերահսկվում է «send_slow» փոփոխականի արժեքով, որը երկու տարրերի ցուցակ է վերցնում: Առաջին տարրը մի ամբողջ թիվ է, որը նկարագրում է ատոմային ուղարկելու բայթերի քանակը: Երկրորդ տարրը իրական թիվ է, որը նկարագրում է վայրկյանների քանակությունը, որոնցով պետք է անջատվել ատոմային ուղին: Օրինակ, «set send_slow {10 .001}» - ը ստիպելու է «ուղարկել -s» ուղարկելու տողերը 1 մղոններով ուղարկված յուրաքանչյուր 10 նիշի միջեւ:

The -h flag ուժերի արտադրանքը պետք է ուղարկվի (մի քիչ), ինչպես մարդը գրելիս: Մարդկանց նման ուշացումներն առաջանում են նիշերի միջեւ: (Ալգորիթմը հիմնված է Weibull բաշխման վրա, փոփոխություններով, որոնք համապատասխանում են տվյալ կիրառությանը): Այս արտադրանքը վերահսկվում է «send_human» փոփոխականի արժեքով, որը վերցնում է հինգ տարրերի ցանկ: Առաջին երկու տարրերը վայրկյանների միջանկյալ ժամանակահատվածն են: Առաջինն օգտագործվում է կանխադրված: Երկրորդը օգտագործվում է բառերի վերջավորության մեջ, որպեսզի նմանօրինակ անցումներում երբեմն լինում են նուրբ դադարները: Երրորդ պարամետրը փոփոխականության միջոց է, որտեղ .1 բավականին փոփոխական է, 1-ը ողջամտորեն փոփոխված է, եւ 10-ը բավականին անփոփոխ է: Ծայրահեղությունը 0 է անսահմանություն: Վերջին երկու պարամետրերը, համապատասխանաբար, նվազագույն եւ առավելագույն interarrival ժամանակը: Նվազագույնը եւ առավելագույնը օգտագործվում են վերջին եւ «կրկնօրինակը» վերջնական ժամանակը: Առավելագույն միջինը կարող է բավականին տարբեր լինել տվյալ միջինից, եթե նվազագույն եւ առավելագույն չափսը բավականաչափ արժեք է:

Որպես օրինակ, հետեւյալ հրահանգը emulates արագ եւ հետեւողական typist:

set_human {.1 .3 1 .05 2} ուղարկել -h «Ես սոված եմ, ճաշենք»:

իսկ հաջորդը կարող է ավելի հարմար լինելուց հետո կախել:

set_human {.4 .4 .2 .5 100} ուղարկեք -h "Goodd երեկոյան գիշեր!"

Նշենք, որ սխալները չեն մոդելավորվում, չնայած դուք կարող եք սխալների ուղղման իրավիճակներ ստեղծել ինքներդ ձեր սխալներով եւ ուղղումներով, ուղարկեք փաստարկ:

Նուռ նիշ ուղարկելու դրոշները, ընդմիջումների ուղարկելու համար, դանդաղ ելքի եւ մարդկային ոճի արտադրության համար ստիպված են փոխադարձաբար բացառիկ: Միայն վերջինը նշված կլինի: Բացի դրանից, նարնջագույն նիշերը կամ ընդմիջումները ուղարկելու համար դրոշներով նշվում են ոչ մի լարային փաստարկ:

Լավագույն գաղափար է, որ նախապես սպասելուց առաջ առաջինը ուղարկեք գործընթաց : ակնկալում է, որ սպասում է գործընթացը սկսելու, իսկ ուղարկելու հնարավոր չէ: Մասնավորապես, եթե գործընթացը սկսելուց առաջ առաջինը ուղարկվում է ավարտված, դուք օգտագործում եք ձեր տվյալները անտեսելու վտանգը: Այն դեպքերում, երբ ինտերակտիվ ծրագրերը նախնական հուշում չեն առաջարկում, նախքան ուշացումը կարող եք ուղարկել , ինչպես նաեւ `

# Խախտումներից խուսափելու համար խուսափելու համար, թե ինչպես պետք է կոտրել, # այս համակարգը արտաքին շտապ չի հուշում: # Սպասեք 5 վայրկյանից exec- ի համար, որպեսզի լրացնեք telnet- ը: very.secure.gov sleep 5 ուղարկեք գաղտնաբառ

exp_send- ը ուղարկելու համար այլ անուն է : Եթե ​​Դուք օգտագործում եք Expectk կամ Tk միջավայրում ակնկալվող այլ տարբերակ, ուղարկեք Tk- ի կողմից, բացառապես այլ նպատակների համար: exp_send- ը նախատեսված է միջավայրի միջեւ համատեղելիության համար: Նմանատիպ այլընտրանքները տրամադրվում են այլ ակնկալվող այլ ուղարկելու հրահանգներին:

send_error [-flags] տող
նման է ուղարկել , բացառությամբ, որ արտադրանքը ուղարկվում է stderr, այլ ոչ թե ընթացիկ գործընթաց :

send_log [-] տող
նման է ուղարկել , բացառությամբ, որ տողը ուղարկվում է միայն մուտք ֆայլին (տես log_file- ը ): Արժեթղթերը անտեսվում են, եթե որեւէ տեղեկամատյան ֆայլ բաց չէ:

send_tty [-flags] տողը
նման է ուղարկել , բացառությամբ, որ արտադրանքը ուղարկվում է / dev / tty, ոչ թե ներկայիս գործընթացին :

send_user [-flags] տող
նման է ուղարկել , բացառությամբ, որ արտադրանքը ուղարկվում է stdout, այլ ոչ թե ընթացիկ գործընթաց :

քնել վայրկյան
առաջացնում է սցենարը քնելու համար: Երկրորդը կարող է լինել տասնորդական թվ: Ընդհատումները (եւ Tk իրադարձությունները, եթե դուք օգտագործում եք Expectk), մշակվում են, իսկ ակնկալվում է քնում:

[args] ծրագիր [args]
ստեղծում է նոր ծրագիր, որը գործում է «ծրագրային արգ»: Նրա stdin, stdout եւ stderr- ը միացված են ակնկալել, որպեսզի նրանք կարողանան ընթերցել եւ գրել այլ ակնկալվող հրամաններով: Կապը փակվում է փակված կամ եթե գործընթացը ինքն է փակում ֆայլի նույնացուցիչներից որեւէ մեկը:

Երբ գործընթացը սկսվում է ծղոտի կողմից, spawn_id- ը փոփոխված է, որը վերաբերում է այդ գործընթացին վերաբերող նկարագրությանը: Spawn_id- ի կողմից նկարագրված գործընթացը համարվում է «ընթացիկ գործընթաց »: spawn_id- ը կարող է կարդալ կամ գրել, որն իրականում ապահովում է աշխատանքի հսկողություն:

user_spawn_id- ը գլոբալ փոփոխական է, որը պարունակում է նկարագրող, որը վերաբերում է օգտագործողին: Օրինակ, spawn_id- ը սահմանվում է այս արժեքի մեջ, ակնկալում է behave-user- ը :

I error_spawn_id- ը գլոբալ փոփոխական է, որը պարունակում է բնութագիր, որը վերաբերում է ստանդարտ սխալին: Օրինակ, spawn_id- ը սահմանվում է այս արժեքով, ուղարկեք send_error- ը :

tty_spawn_id- ը գլոբալ փոփոխական է, որը պարունակում է descriptor, որը վերաբերում է / dev / tty: Եթե ​​/ dev / tty- ն գոյություն չունի (օրինակ, cron, at, կամ խմբաքանակի սցենարով), ապա tty_spawn_id- ը չի սահմանվում: Սա կարող է փորձարկվել որպես հետեւյալը.

եթե {[info vars tty_spawn_id]} {# / dev / tty գոյություն ունի} else {# / dev / tty գոյություն չունի # հավանաբար cron, խմբաքանակի կամ սցենարի մեջ}

spawn վերադարձնում է UNIX գործընթացը id: Եթե ​​որեւէ պրոցես չի առաջացնում, ապա 0-ը վերադարձվում է: Spawn_out (slave, name) փոփոխականությունը սահմանվում է pty ստրուկ սարքի անունով:

Լռելյայնորեն, spawn արձագանքում է հրամանատարության անունը եւ փաստարկները: The -noecho դրոշը դադարում է ծաղկել դա անելուց:

The -console դրոշը հանգեցնում է մխիթարելային արտադրանքի վերամշակման գործընթացին : Սա բոլոր համակարգերում չի աջակցվում:

Ներքին կերպով, spawn- ը օգտագործում է pty- ը, նախասիրացրել է այն նույն ձեւը, ինչպիսին օգտագործողի tty- ն է: Սա հետագայում արդեն սկսվում է այնպես, որ բոլոր պարամետրերը «գայթակղիչ» են (ըստ stty (1)): Եթե ​​սահմանվում է փոփոխական stty_init , ապա այն մեկնաբանվում է որպես ծանր փաստարկների ոճով, որպես հետագա կազմաձեւ: Օրինակ, «սահմանված stty_init հումքը» կխթանի հումքի ռեժիմում հետագա հոսող գործընթացների տերմինները: -օգտագործման թույլտվություն չի անցնում օգտագործողի ստացված տվյալների հիման վրա: - անհնար է բաց թողնել « աննկատ » կարգավորումը:

Սովորաբար ծիլը քիչ ժամանակ է պահանջում իրականացնելու համար: Եթե ​​նկատում եք, որ լողանալով զգալի ժամանակ անցկացնելով, ապա դա հավանաբար հանդիպում է ptys, որոնք wedged. Մի շարք թեստեր են վարվում ptys- ի համար, որպեսզի խուսափեն խայտառակ գործընթացների հետ: (Այս տեւողությունը տեւում է 10 վայրկյան մեկ:) -Դի տարբերակով վազում սպասում է, թե արդյոք Ակնկալվում է տարօրինակ պետություններում բազմաթիվ ptys- ների հետ հանդիպում: Եթե ​​դուք չեք կարող սպանել այն գործընթացները, որոնց վրա դրանք կցված են, ձեր միակ ռեսուրսը կարող է վերաբեռնել:

Եթե ծրագիրը չկարողանա հաջողության հասնել, քանի որ exec (2) չի հաջողվում (օրինակ, երբ ծրագիրը գոյություն չունի), սխալ հաղորդումը կվերադարձվի հաջորդ զրուցակցի միջոցով կամ ակնկալում է հրաման, քանի որ ծրագիրը վարում է եւ արտադրում է սխալի հաղորդագրությունը որպես ելք: Այս պահվածքը ծաղկման իրականացման բնական հետեւանք է: Ներքին ձեւով, ծալեք ֆորմերը, որից հետո փշրված գործընթացը ոչ մի կերպ չի շփվելու սկզբնական ակնկալման գործընթացի հետ, բացառությամբ spawn_id- ի միջոցով հաղորդակցության:

The բացված դրոշը առաջացնում է հաջորդ փաստարկը, որը պետք է մեկնաբանվի որպես Tcl ֆայլի նույնացուցիչ (այսինքն, վերադարձով բացված է ): Ծաղկակաղամբը կարող է օգտագործվել այնպիսին, ինչպիսին եղել է ծալված գործընթաց : (Ֆայլի նույնացուցիչը այլեւս չպետք է օգտագործվի): Սա թույլ է տալիս բուժել հումքի սարքերը, ֆայլերը եւ խողովակաշարերը, որպես spawned գործընթացներ, առանց pty- ի օգտագործման: 0-ը վերադարձվում է, նշելու համար, որ կապված չէ որեւէ գործընթացի հետ : Երբ ծալված գործընթացին կապը փակ է, այնպես էլ Tcl ֆայլի նույնացուցիչը: The -leaveopen դրոշը նույնն է, այնուամենայնիվ, բացառությամբ այն, որ -plaveen- ն առաջացնում է ֆայլի նույնացուցիչի բացը նույնիսկ ծղոտի ID- ն փակվելուց հետո:

Դրոշի դրոշը բաց է դառնում, բայց ոչ մի գործընթաց չի առաջացել: 0-ը վերադարձվում է, նշելու համար, որ կապված չէ որեւէ գործընթացի հետ : Spawn_id- ը սովորական է:

Spawn_out (slave, fd) փոփոխականությունը սահմանվում է pty ստրուկին համապատասխան ֆայլի նույնացուցիչով: Այն կարող է փակվել `օգտագործելով« close -slave »:

The -ignore դրոշը անվանում է ազդանշան, որը անտեսվում է ծալված գործընթացում : Հակառակ դեպքում, ազդանշաններն ստանում են կանխադրված պահվածքը: Սխալները կոչվում են թակարդի հրամանով, բացառությամբ, որ յուրաքանչյուր ազդանշան պահանջում է առանձին դրոշ:

strace մակարդակը
առաջացնում է հետեւյալ հայտարարությունները, որոնք տպագրվելու են մինչեւ կատարումը: (Tcl- ի հետքային հրամանատարությունը հետեւում է փոփոխականներին) մակարդակը ցույց է տալիս, թե որքան հեռու է զանգի կախվածությունը հետագծելու համար: Օրինակ, հետեւյալ հրամանները սպասում են ակնկալել, երբ առաջին 4 մակարդակները հայտնաբերում են, բայց ոչ մեկը, որից ցածր է:

սպասեք -c "strace 4" script.exp

The -info դրոշը հիմք է տալիս վերադարձնել տրված վերջին ոչ-տեղեկատվական փաստարկների նկարագրությունը:

սթրի args
փոխում տերմինալների ռեժիմները, որոնք նման են արտաքին stty հրամանին:

Լռելյայն, հսկիչ տերմինալը հասանելի է: Այլ տերմինալներին կարելի է հասանելի դառնալ `ավելացնելով, որ« կարգավիճակի վերադարձի պահանջները դա որպես հրամանի արդյունք է: Եթե որեւէ կարգավիճակ չի պահանջվում եւ հսկիչ տերմինալը հասանելի է, հումքի եւ արձագանքի հատկանիշների նախորդ կարգավիճակը վերադարձվում է այն ձեւով, որը կարող է հետագայում լինել օգտագործված հրամանով:

Օրինակ, հում կամ փաստարկված փաստարկները տերմինը դնում են հումքի ռեժիմ: Պատճառները, պատրաստում կամ եփում են, տերմինը դնում են պատրաստի ռեժիմ: The arguments echo- ը եւ եզրափակումը տերմինը տեղադրեց համապատասխանաբար echo եւ noecho ռեժիմում:

Հետեւյալ օրինակը ցույց է տալիս, թե ինչպես ժամանակավորապես անջատել echoing: Դա կարող է օգտագործվել այլ կերպ `ավտոմատ սցենարներից խուսափելու համար գաղտնաբառերը ներկառուցելու համար: (Ստորեւ ներկայացված է ավելի շատ քննարկում, այս մասին EXPECT HINTS- ում:)

stty-echo send_user "Գաղտնաբառ:" expect_user -re "(. *) \ n" սահմանել գաղտնաբառ $ expect_out (1, string) stty echo

համակարգը args
տալիս args է sh (1) որպես մուտքագրում, ճիշտ այնպես, կարծես այն տպագրվել է որպես հրաման տերմինալից: Ակնկալում է սպասում, մինչեւ վանդակը վերջանա: Sh- ի ստվերային կարգավիճակը նույնն է, ինչ exec- ն իր վերադարձի կարգավիճակն է:

Ի տարբերություն exec- ի, որը վերահղում է ստինին եւ ստանդարտին սցենարով, համակարգը կատարում է ոչ վերահասցեավորում (բացառությամբ սյունակի կողմից նշված): Այսպիսով, հնարավոր է օգտագործել այնպիսի ծրագրեր, որոնք անմիջականորեն խոսելու են / dev / tty- ին: Նույն պատճառով, համակարգի արդյունքներն արձանագրված չեն:

ժամանակահատվածը [args]
վերադարձնում է ժամանակային նշան: Առանց փաստարկներ, դարաշրջանից սկսած վայրկյանների թիվը վերադարձվում է:

-format դրոշը ներկայացնում է տողը, որը վերադարձվում է, սակայն փոխարինողներով կատարվում է POSIX կանոնների համաձայն strftime: Օրինակ,% a- ն փոխարինվում է կրճատ շաբաթվա անունով (այսինքն `Sat): Մյուսները `

% a ամփոփ ամսաթիվ անունը% a ամփոփ ամսաթիվ անուն% b ամյակին ամսաթիվը% c ամսաթիվը, ժամը `Wed Հոկ 6 11:45:56 ամսվա ամսվա ամսաթիվը (01-31% H ժամ) (00-23)% I ժամ (01-12)% օր (001-366)% m ամիս (01-12)% M րոպե (00-59)% p am կամ pm% S երկրորդ (00-61) % u շաբաթ (1-7, երկուշաբթի օրը շաբաթվա առաջին օրն է) U շաբաթը (00-53, առաջին կիրակի օրը շաբաթվա առաջին օրն է) V շաբաթ (01-53, ISO 8601 ոճ)% w day (0- 6% W շաբաթ (00-53, առաջին երկուշաբթի օրը շաբաթվա առաջին օրն է)% x օրվա ժամը `սեպտեմբեր 6, 1993 թ. X անգամ, ինչպես նաեւ` 23:59:59% տարի (00-99) Y տարի, ինչպես նաեւ `1993% Z ժամային գոտի (կամ ոչինչ, եթե որոշված ​​չէ) %% ծանր տոկոս նշան

Այլ բնութագրերը որոշված ​​չեն: Այլ նիշերը կփրկվեն անփոփոխ: Միայն C- ն ապահովված է:

Երկրորդ փուլի դրոշը ներկայացնում է մի քանի վայրկյան, քանի որ դարաշրջանում օգտագործվում է որպես աղբյուր, որի ձեւաչափը: Հակառակ դեպքում ներկայիս ժամանակը օգտագործվում է:

The -gmt դրոշը ժամանակային ազդանշանի թողարկումն օգտագործելու է GMT ժամային գոտի օգտագործելու համար: Ոչ դրոշակով, տեղական ժամանակային գոտին օգտագործվում է:

թակարդ [[հրաման] ազդանշանները]
առաջացնում է տվյալ հրամանատարությունը , որը կատարվում է տվյալ ազդանշաններից որեւէ մեկի հետագա ստացման վրա: Հրահանգը կատարվում է համաշխարհային մասշտաբով: Եթե հրամանը բացակայում է, ազդանշանի գործողությունը վերադարձվում է: Եթե հրամանը SIG_IGN տող է, ապա ազդանշանները անտեսվում են: Եթե հրամանը SIG_DFL տողն է, ազդանշաններն առաջացնում են համակարգի լռելյայն: ազդանշանները կամ ազդանշանների կամ ազդանշանների ցուցակը: Ազդանշանները կարող են թվանշանային կամ խորհրդանշական կերպով նշել ազդանշանների (3): «SIG» նախածանցը կարող է բաց թողնել:

Առանց փաստարկներ (կամ փաստարկը `թվաքանակը), թակարդը վերադարձնում է կատարվող թակարդի հրամանի ազդանշանային համարը:

The- code դրոշը օգտագործում է հրամանի վերադարձ կոդը, այն տեղում, երբ Tcl- ը պատրաստվում էր վերադառնալ, երբ հրամանատարը սկսեց գործարկել:

The -interp դրոշը առաջացնում է հրամանը գնահատել, օգտագործելով թարգմանիչը, երբ հրամանատարը սկսեց վազել, քան այն ժամանակ, երբ թակարդը հայտարարվեց:

The -name դրոշը առաջացնում է թակարդի հրամանը `վերադարձնելու կատարված թակարդի հրամանի ազդանշանը:

The -max դրոշը առաջացնում է թակարդի հրամանը `վերադարձնելու ամենամեծ ազդանշանային համարը, որը կարող է սահմանվել:

Օրինակ, «trap {send_user" Ouch! "}" SIGINT "հրամանը կտտացնում է" Ouch! ": յուրաքանչյուր անգամ օգտվողը սեղմում է ^ C- ը:

Լռելյայն, SIGINT (որը սովորաբար կարող է առաջանալ, սեղմելով ^ C) եւ SIGTERM- ը հանգեցնում է Սպասել ելքի: Սա պայմանավորված է այն բանից հետո, երբ Ակնկալվում է ակնկալվում է, որ ստեղծվել է լռելյայն:

ծուղակ ելք {SIGINT SIGTERM}

Եթե ​​օգտագործեք -D դրոշը, կարգաբերիչը սկսելու համար, SIGINT- ը վերափոխվում է ինտերակտիվ կարգաբերիչը սկսելու համար: Սա պայմանավորված է հետեւյալ ծուղակով.

թակարդը {exp_debug 1} SIGINT

Կարգավորիչի ծուղակը կարող է փոխվել EXPECT_DEBUG_INIT շրջակա միջավայրի փոփոխականով նոր թակարդի հրամանով:

Դուք կարող եք, իհարկե, ընդհանրապես ընդհանրապես անտեսել դրանք, ավելացնելով թիրախային հրամանները ձեր սցենարով: Մասնավորապես, եթե դուք ունեք ձեր սեփական «ծուղակը ելք SIGINT», ապա դա կկիրառի կարգաբերիչի ծուղակը: Սա օգտակար է, եթե ցանկանում եք կանխել օգտվողներին ընդհանրապես կարգաբերող սարքին:

Եթե ​​ցանկանում եք սահմանել ձեր սեփական թակարդը SIGINT- ում, բայց դեռ աշխատում է կարգաբերիչին, երբ այն աշխատում է, օգտագործեք.

եթե {! [exp_debug]} {trap mystuff SIGINT}

Այլապես, կարող եք թակարդ լինել կարգավարին, օգտագործելով այլ ազդանշան:

թակարդը թույլ չի տա, որ դուք ջնջեք SIGALRM- ի գործողությունը, քանի որ այն օգտագործվում է Ներքին Ակնկալվում է: Անջատման հրամանը սահմանում է SIGALRM- ը SIG_IGN- ին (անտեսել): Դուք կարող եք վերալիցքավորել այն, քանի դեռ չեք անջատել այն հետագա spawn հրամանների ընթացքում:

Լրացուցիչ տեղեկությունների համար տես ազդանշանը (3):

սպասեք [args]
ձգձգում է մինչեւ փշրված գործընթացը (կամ ընթացիկ գործընթացը, եթե ոչ մեկը նշված չէ):

սպասել նորմալ վերադարձնում է թվերի չորս թվերի ցանկը: Առաջին ամբողջ թիվն այն գործընթացն է , որը սպասվում էր: Երկրորդ ամբողջը հանդիսանում է համապատասխան ծղոտի ID- ն: Երրորդ ամբողջական թիվն է, եթե գործառնական համակարգի սխալ է տեղի ունեցել, կամ հակառակ դեպքում `0: Եթե ​​երրորդ ամբողջ թիվն էր 0, ապա չորրորդը հանդիսանում է ծալված գործընթացի վերադարձված կարգավիճակը: Եթե ​​երրորդ ամբողջ թիվն էր -1, ապա չորրորդ թվերը օպերացիոն համակարգով սահմանված errno- ի արժեքն է: Գլոբալ փոփոխական errorcode- ը նույնպես սահմանվում է:

Լրացուցիչ տարրերը կարող են հայտնվել սպասման ավարտից հետո սպասելուց : Ընտրովի 5-րդ տարրը բացահայտում է տեղեկատվության դաս: Ներկայումս այս տարրերի միակ հնարավոր արժեքը CHILDKILLED- ն է, որի դեպքում հաջորդ երկու արժեքներն են C- ոճային ազդանշանը եւ կարճ տեքստային նկարագրությունը:

The -i դրոշը հայտարարում է գործընթացը , որը սպասում է նշված spawn_id- ին (ոչ թե գործընթացի id): SIGCHLD- ի աշխատողի մեջ կարելի է սպասել ցանկացած spawned գործընթացը , օգտագործելով spawn id -1- ը:

The knownow flag- ը սպասում է սպասում անմիջապես վերադառնալու հաջող սպասմանը : Երբ գործընթացը դուրս է գալիս (ավելի ուշ), այն ինքնաբերաբար անհետանում է առանց ակնհայտ սպասման անհրաժեշտության:

Սպասման հրամանը կարող է օգտագործվել նաեւ պատահական գործընթացի սպասում, օգտագործելով «-1» -ի փաստարկները: Ի տարբերություն դրա օգտագործման հետ ծագած գործընթացների, այս հրամանը կարող է կատարվել ցանկացած ժամանակ: Որեւէ հսկողություն չկա, որի արդյունքն է հնձել: Սակայն, վերադարձի արժեքը կարող է ստուգվել գործընթացի ID- ի համար:

ԳՐԱԴԱՐԱՆՆԵՐ

Ակնկալում է ավտոմատ կերպով ակնկալվող սցենարների ակնկալիքով երկու ներկառուցված գրադարանների մասին: Սրանք սահմանվում են «exp_library» եւ «exp_exec_library» փոփոխականների մեջ նշված դիրեկտորիաների կողմից: Երկուսն էլ նախատեսվում են պարունակել կոմունալ ֆայլեր, որոնք կարող են օգտագործվել այլ սցենարներով:

exp_library- ը պարունակում է ճարտարապետական-անկախ ֆայլեր: exp_exec_library- ը պարունակում է ճարտարապետական ​​կախված ֆայլեր: Կախված ձեր համակարգից, երկու դիրեկտորիաները կարող են ամբողջությամբ դատարկ լինել: $ Exp_exec_library / cat-buffers ֆայլի առկայությունը նկարագրում է, թե արդյոք ձեր / bin / cat բուֆերները լռելյայն են:

PRETTY-PRINTING

Շատ տպագրված ակնկալվող սցենարների համար հստակ սահմանափակում կա: Ակնկալելով բաշխման ակնկալիքով տրամադրված vgrind- ի սահմանումը ճիշտ է տեղադրվել, կարող եք օգտագործել հետեւյալը.

vgrind -lexpect ֆայլը

Օրինակներ

Շատերը չեն երեւում, թե ինչպես կարելի է ամեն ինչ միասին դնել, որ մարդը էջը նկարագրում է: Ես խրախուսում եմ ձեզ կարդալ եւ փորձել օրինակներ, ակնկալվող բաշխման օրինակներ գրացուցակում: Նրանցից ոմանք իրական ծրագրեր են: Մյուսները պարզապես պարզաբանում են որոշակի տեխնիկայի, եւ, իհարկե, մի քանիսը պարզապես արագ հաքերներ են: INSTALL ֆայլը ունի այս ծրագրերի արագ ակնարկ:

Ակնկալվող թերթերը (տես SEE- ը նաեւ) նույնպես օգտակար են: Թեեւ որոշ թերթիկները օգտագործում են ակնկալիքի ավելի վաղ տարբերակների համապատասխան սցենար, ուղեկցող հիմնավորումները դեռեւս վավեր են եւ ավելի մանրամասն են գնում, քան այս մարդը էջը:

ՀԵՏԱՔՐՔԻՐ

Ընդլայնումները կարող են բախվել «Ակնկալվող» հրամանների անուններով: Օրինակ, ուղարկումը որոշվում է Tk- ի կողմից `բացառապես այլ նպատակների համար: Այդ իսկ պատճառով ակնկալվող հրամանների մեծ մասը հասանելի է նաեւ որպես «exp_XXXX»: «Exp», «inter», «spawn» - ի եւ «timeout» - ով սկսվող հրամաններ եւ փոփոխականներ չունեն այլ անուններ: Օգտագործեք ընդարձակվող հրամանների անունները, եթե Ձեզ անհրաժեշտ է համատեղելիություն շրջակա միջավայրի միջեւ:

Ակնկալում է, թե որքան լիբերալ տեսանկյունից է ընդգրկվելու: Մասնավորապես, ակնկալվող ծրագրի հրամանները կարդալով փոփոխականները նախեւառաջ պետք է փնտրվեն տեղական շրջանակից, իսկ եթե չհայտնաբերվեն համաշխարհային մասշտաբով: Օրինակ, սա խոչընդոտում է «գլոբալ ժամանակի տեւողություն» տեղադրելու անհրաժեշտությունը յուրաքանչյուր գրառման մեջ, որը գրում է, որ ակնկալում է : Մյուս կողմից, գրված փոփոխականները միշտ տեղական շրջանակներում են (եթե «գլոբալ» հրաման չի տրվել): Ամենատարածված խնդիրը առաջանում է այն դեպքում, երբ ծիլը կատարվում է ընթացակարգով: Դեպի ընթացակարգից դուրս spawn_id- ը այլեւս գոյություն չունի, ուստի ծավալի գործընթացը այլեւս մատչելի չէ, պարզապես ընդգրկվելու պատճառով: Նման ընթացակարգին ավելացրեք «գլոբալ spawn_id»:

Եթե ​​դուք չեք կարողանում ակտիվացնել բազմալեզվացման հնարավորությունը (այսինքն, ձեր համակարգը չի աջակցում ոչ ընտրման (BSD * * *), հարցման (SVR> 2), ոչ էլ համարժեք բան), ակնկալում է, որ միայն մի ժամանակ կկարողանար վերահսկել մի գործընթաց : Այս դեպքում մի փորձեք spawn_id- ը չկանգնեք , այլ ոչ թե exec- ի միջոցով դուք պետք է կատարեք գործընթացները, մինչդեռ հուսահատված գործընթացը գործում է: Ավելին, միաժամանակ չեք կարող ակնկալել բազմաթիվ գործընթացներից (ներառյալ օգտագործողը):

Տերմինալի պարամետրերը կարող են մեծ ազդեցություն ունենալ սցենարների վրա: Օրինակ, եթե սցենար գրված է արձագանքելու համար, ապա դա կխախտի, եթե echoing- ը անջատվի: Այդ պատճառով Ակնկալիք ուժերը սնուցող տերմինալի պարամետրերը լռելյայնորեն: Ցավոք, դա կարող է այլ բաների համար տհաճ բաներ անել: Որպես օրինակ, emacs shell- ը ցանկանում է փոխել «սովորական» քարտեզագրությունները. Նոր գծերը փոխարկվում են նոր գծերի փոխարեն, փոխանակման նոր տողերի փոխարեն, եւ echoing- ը անջատված է: Սա թույլ է տալիս օգտագործել emacs- ը ներածման գիծը խմբագրելու համար: Ցավոք, Ակնկալվում է, որ դա հնարավոր չէ կանխատեսել:

Կարող եք պահանջել, որ Ակնկալեք չհամաձայնել տերմինալային պարամետրերի նախնական պարամետրը, սակայն այդպիսի միջավայրերի համար գրելիս պետք է շատ զգույշ լինել: Emacs- ի դեպքում խուսափեք կախված նրանից, թե ինչպես echoing եւ վերջնական- line ցուցադրություններ.

Հրահանգները, որոնք ընդունված փաստարկներն ընդունված են միատեսակ ցուցակով ( ակնկալվող տարբերակները եւ փոխազդեցությունը ), օգտագործեն heuristic որոշելու համար, թե արդյոք ցուցակը փաստացի փաստարկ է կամ շատերը: The heuristic կարող է ձախողել միայն այն դեպքում, երբ ցուցակը, ըստ էության, ներկայացնում է մեկ փաստարկ, որն ունի բազմակի ներկառուցված \ n է ոչ սպիտակ տառերով նրանց միջեւ: Սա կարծես բավականին անհավանական է թվում, սակայն «անհամաձայնություն» փաստարկը կարող է օգտագործվել միայն մեկ փաստարկի համար, որպես միասնական փաստարկ: Սա կարող է օգտագործվել մեքենայացված գաղափարների ակնկալվող կոդով: Նմանապես, - ուժի մեջ է մտնում միակ փաստարկը, որը պետք է լուծվի որպես բազմաթիվ օրինակներ / գործողություններ:

BUGS- ը

Իրականում գայթակղիչ էր «սեքս» ծրագիրը («Smart EXec» կամ «Ուղարկել-Փակցնել») անվանելու համար, սակայն լավ իմաստով (կամ, թերեւս, ընդամենը Puritanism) գերակշռում էր:

Որոշ համակարգերում, երբ շեղբայրը ծալվում է, դժգոհում է, որ չկարողանա մուտք գործել, բայց միեւնույն ժամանակ աշխատում է: Սա նշանակում է, որ ձեր համակարգը ունի վերահսկողություն ձեռք բերելու մեխանիզմ, որը ակնկալում է չգիտի: Խնդրում ենք պարզել, թե ինչ է դա եւ ուղարկել այս տեղեկությունները ինձ:

Ultrix 4.1- ը (առնվազն վերջին տարբերակները այստեղ) դիտում է 1000000-ից ավելի վերբեռնման ժամանակահատվածները, 0-ին համարժեք:

Թվային UNIX 4.0A (եւ, հավանաբար, այլ տարբերակները) հրաժարվում են ptys հատկացնել, եթե դուք սահմանում եք SIGCHLD մշակողը: Լրացուցիչ տեղեկությունների համար տեսեք շնորհանդես էջ:

IRIX 6.0- ը չի թույլատրում թույլտվություն թույլատրել ճիշտ այնպես, որ եթե ակնկալվի, որ նախկինում օգտագործված մեկ այլ անձի կողմից գումար հատկացվի, ապա դա չի հաջողվում: Upgrade to IRIX 6.1.

Telnet (ստուգված է միայն SunOS 4.1.2-ի ներքո) կախված է, եթե TERM- ը չի սահմանվել: Սա խնդիր է cron- ի, cgi- ի եւ cgi- ի սցենարներում, որոնք չեն սահմանում ժամկետը: Այսպիսով, դուք պետք է հստակորեն սահմանեք այն, ինչ տեսակի սովորաբար անտեղի է: Պարզապես պետք է ինչ-որ բան սահմանել: Հաջորդը, հավանաբար, բավական է շատ դեպքերում:

սահմանել env (TERM) vt100

Հուշում (ստուգված է միայն BSDI BSD / OS 3.1 i386- ի ներքո) կախված է, եթե SHELL- ը եւ HOME- ը չեն կարգավորվում: Սա խնդիր է cron , cgi եւ cgi սցենարներում, որոնք չեն սահմանում այս միջավայրի փոփոխականները: Այսպիսով, դուք պետք է հստակորեն սահմանեք դրանք `ինչ տեսակի սովորաբար անտեղի է: Պարզապես պետք է ինչ-որ բան սահմանել: Հաջորդը, հավանաբար, բավական է շատ դեպքերում:

set env (SHELL) / bin / sh set env (HOME) / usr / local / bin

Ptys- ի որոշակի ծրագրեր նախատեսված են այնպես, որ միջուկը 10-15 վայրկյան հետո նետում է ցանկացած չկարդացված արդյունքը (իրական թիվը գործառնական կախվածություն է) հետո գործընթացը փակել է ֆայլի նկարագրությունը: Այսպիսով ակնկալեք ծրագրեր, ինչպիսիք են

20-ը սպասվում է քնելու քնելու մասին

չի հաջողվի: Խուսափելու համար դիմեք ոչ թե ինտերակտիվ ծրագրեր exec- ով, այլ ոչ թե ծիլ : Թեեւ նման իրավիճակները ենթադրելի են, գործնականում ես երբեք չեմ հանդիպել այնպիսի իրավիճակ, երբ իսկապես ինտերակտիվ ծրագրի վերջնական արդյունքը կորցնելու է այդ վարքագիծը:

Մյուս կողմից, Cray UNICOS ptys գործընթացը փակել է ֆայլի նկարագրությունը անմիջապես հետո անմիջապես դուրս գրված ցանկացած չկարդացված արդյունքը: Ես սա տեղեկացրել եմ Cray- ին եւ նրանք աշխատում են շտկում:

Երբեմն պահանջվում է ուշացում եւ պատասխան, ինչպես, օրինակ, երբ tty ինտերֆեյսը փոխում է UART պարամետրերը կամ համապատասխան բոդի արագությունները փնտրելով start / stop bits- ը: Սովորաբար, այս ամենը պահանջում է քնել երկրորդ կամ երկուսի համար: Ավելի առողջ տեխնիկա է վերագործարկել, մինչեւ սարքակազմը պատրաստ լինի ստանալ մուտքի թույլտվություն: Հետեւյալ օրինակում օգտագործվում են երկու ռազմավարություններ.

ուղարկել «արագություն 9600»: քուն 1 սպասում {timeout {ուղարկել "\ r"; exp_continue} $ հուշում}

թակարդի կոդը չի աշխատի որեւէ հրամանով, որը նստում է Tcl- ի իրադարձության հանգույցում, ինչպես, օրինակ, քունը: Խնդիրն այն է, որ միջոցառման հանգույցում, Tcl- ն վերադարձնում է վերադարձի կոդերը, երբեմն պատահական դեպքերի մշակողներից: Խափանումն այն է, որ ծուղակը դրոշի դրոշակ սահմանի: Այնուհետեւ ստուգեք դրոշը անմիջապես հրամանանից հետո (այսինքն, քուն):

The ակնկալիքը հենարան հրամանը անտեսում է - ժամանակի փաստարկներ եւ չունի հասկացություն timeouts ընդհանուր առմամբ.

& # 34; EXPECT HINTS & # 34;

Կան մի քանի բան, ակնկալել, որ կարող են լինել ոչ ինտուիտիվ: Այս բաժինը փորձում է մի քանի առաջարկներով դիմել դրանց:

Ընդհանուր ակնկալվող խնդիրն այն է, թե ինչպես պետք է ճանաչել ռումբի հուշումները: Քանի որ դրանք տարբերվում են այլ կերպ տարբեր մարդկանց եւ տարբեր ռումբերով, portable automating rlogin- ը կարող է դժվար լինել առանց իմանալու արագությունը: Խելամիտ կոնվենցիան այն է, որ օգտվողները պահպանում են EXPECT_PROMPT շրջակա միջավայրի փոփոխական պարամետրերի (մասնավորապես, դրա վերջ) նկարագրող կանոնավոր արտահայտություն: Կոդ, ինչպես օրինակ հետեւյալը. Եթե ​​EXPECT_PROMPT- ը գոյություն չունի, կոդը դեռեւս ճիշտ է գործում:

set 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 հում» հրամանը, որը կդադարեցնի թարգմանությունը: Նշենք, որ սա նշանակում է, որ դուք այլեւս չեք պատրաստի գծային խմբագրման առանձնահատկությունները:

ինտերակտիվորեն սահմանում է ձեր տերմինը հումքի ռեժիմում, ուստի այդ խնդիրը չի առաջանա:

Հաճախ օգտակար է գաղտնաբառերը (կամ այլ անձնական տեղեկությունները) ակնկալել սցենարներում: Սա խորհուրդ չի տրվում, քանի որ համակարգչում պահվող որեւէ բան ենթակա է նրան, որ որեւէ մեկը կարողանա մուտք գործել: Այսպիսով, սցենարից ինտերակտիվորեն հուշում է գաղտնաբառերի համար խելացի գաղափար, քան բառացիորեն ներդնելը: Այնուամենայնիվ, երբեմն նման ներկառուցումը միակ հնարավորությունն է:

Ցավոք, UNIX ֆայլային համակարգն ուղղակիորեն չի ստեղծում սցենարներ, որոնք կատարելի են, բայց անընթեռնելի: Հատուկ ռելաքսի սցենարները սատարող համակարգերը կարող են անուղղակիորեն նմանեցնել հետեւյալը.

Ստեղծեք ակնկալվող սցենար (որը պարունակում է գաղտնի տվյալները), ինչպես միշտ: Իր թույլտվությունները դարձրեք 750 (-rwxr-x ---) եւ պատկանում է վստահելի խմբի, այսինքն, մի խումբ, որը թույլ է տալիս կարդալ այն: Անհրաժեշտության դեպքում ստեղծել նոր խումբ այս նպատակով: Հաջորդը, ստեղծեք / bin / sh սկրիպտ 2751 (-rwxr-s-x) թույլտվությամբ, նույն խմբին պատկանող, նախկինում:

Արդյունքը սցենար է, որը կարող է կատարվել (եւ կարդալ) որեւէ մեկի կողմից: Երբ հրավիրվում է, այն վարում է Սպասում սցենարը:

& # 34; SEE ALSO & # 34;

Tcl (3), libexpect (3)
Դոն Լիվեսը, էջ 602, ISBN 1-56592-090-2, O'Reilly եւ Associates, 1995 թ., «Ուսումնասիրության ակնկալիք. Tcl- ի վրա հիմնված գործիքային գործիք»:
«ակնկալում` ինտերակտիվության այդ անկառավարելի հակումները բուժում », Դոն ԼիԲիի կողմից, ամառային զեկույցներ 1990 USENIX կոնֆերանսը, Անահեյմ, ​​Կալիֆոռնիա, հունիսի 11-15, 1990:
1990 թ. Հոկտեմբերի 17-19, Կոլորադո, Կոլորադո, Կոլորադո, Կոլորադո, 1990 թ. USENIX Large Installation Systems Administration Conference- ի նյութերը:
1990 թ. Հունվարի 22-26, USENIX կոնֆերանսը, Ջոն Օսերհութի կողմից «Tcl: տեղադրվող հրամանատարության լեզու»: Դոն ԼիԲի կողմից համակարգչային համակարգերի ինտերակտիվ ծրագրերի վերահսկման սցենարներ: , Հ. 4, թիվ 2, Կալիֆոռնիայի Մամուլի Ամսագրերի Համալսարան, Նոյեմբեր 1991. «Դիալեկտիկական ծրագրերի ռեգրեսիայի փորձարկում եւ համապատասխանության ստուգում», Դոն ԼիԲի կողմից, Ամառային զեկույց 1992 USENIX կոնֆերանս, pp. 135-144, Սան Անտոնիո, TX, Հունիս 12-15, 1992 թ. «Կիբից - Միասին ինտերակտիվ ծրագրեր միավորելը», Դոն Լիվսի կողմից, Ծրագրային պրակտիկա եւ փորձառություն, Ջոն Ուիլեյ եւ Սոնս, Արեւմտյան Սուսեկես, Անգլիա, Vol.

23, թիվ 5, մայիս, 1993 թ., «Դատապարտող Tcl- ի դիմումների համար», Դոն Լիբերս, 1993 թ. Tcl / Tk սեմինարի նյութեր, Բերկլի, CA, հունիսի 10-11, 1993 թ.

AUTHOR

Դոն ԼիԲես, ստանդարտների եւ տեխնոլոգիաների ազգային ինստիտուտ

ՀԱՍՏԱՏՈՒԹՅՈՒՆՆԵՐ

Thanks to John Ousterhout for Tcl եւ Scott Paisley ոգեշնչման համար: Շնորհիվ Rob Savoye- ի ակնկալվող autoconfiguration կոդը:

Պատմության ֆայլը փաստաթղթերի մեծ մասը ակնկալում է էվոլյուցիան: Դա հետաքրքիր ընթերցում է եւ կարող է ձեզ ավելի մանրամասն պատկերացնել այս ծրագրաշարը: Շնորհիվ այնտեղ հիշատակված մարդկանց, որոնք ինձ ուղարկեցին սխալներ եւ տվեցին այլ օգնություն:

Նախագծի դիզայնը եւ իրականացումը մասնակիորեն վճարվել է ԱՄՆ կառավարության կողմից եւ, հետեւաբար, հանրային տիրույթում: Այնուամենայնիվ հեղինակը եւ NIST- ը կցանկանան վարկ ստանալ, եթե այդ ծրագիրը եւ փաստաթղթերը կամ դրանց մասերը օգտագործվեն: