Linux / Unix Command Expect

Beklentiniz, bir skriptə görə digər interaktiv proqramlarla danışıqlar proqramıdır. Skriptdən sonra "Beklent" bir proqramdan nə gözlənilə biləcəyini və düzgün cavabın nə olduğunu bilir. Tərcümə edilmiş bir dil dialoqun istiqamətləndirilməsi üçün dallanma və yüksək səviyyəli idarəetmə strukturları təmin edir. Bundan əlavə, istifadəçi nəzarət etmək və istənilən zaman birbaşa əlaqə saxlaya bilər, sonra isə nəzarətə skriptə qayıdır.

Expectk, Gözləmə və Tk bir qarışığıdır. Bu, gözlənilən və TK arzusu kimi davranır. Gözləyin də Tcl olmadan C və ya C ++ da istifadə edilə bilər.

"Gözləyin" adı uucp, kermit və digər modem nəzarət proqramları tərəfindən populyarlaşdırılan göndərmək / gözləməyin sxemindən gəlir. Lakin uucp-dan fərqli olaraq, Beklent hər hansı bir proqram və vəzifəsi nəzərə alınmaqla istifadəçi səviyyəsində bir komanda kimi istifadə edilə bilməsi üçün ümumiləşdirilir. Gözləmə eyni zamanda bir neçə proqramla danışa bilər.

Nə edəcəyini gözləyin

Məsələn, burada əmr verə biləcəyiniz bəzi şeylər var:

Kabuğun bu vəzifələri yerinə yetirə bilməyəcəyi müxtəlif səbəblər var. Gözləmələrlə hamısı mümkündür.

Ümumiyyətlə, Gözləmə proqramı ilə istifadəçi arasındakı qarşılıqlı əlaqə tələb edən hər hansı bir proqramın işlənməsi üçün faydalıdır. Lazımdır ki, qarşılıqlı əlaqələr programlı olaraq xarakterizə edilə bilər. Gözlənilən nəzarət proqramı dayandırmadan istifadəçi nəzarəti də geri ala bilər. Eynilə, istifadəçi hər hansı bir zamanda skriptə nəzarətə qayıda bilər.

İstifadəsi

Beklenecek komutların siyahısı üçün cmdfile oxuyur. Gözləməyin #! skriptin icra edilə biləcəyini və skriptdə ilk satırını qeyd etməklə qeyd etmək:

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

Əlbəttə ki, yol həyatın gözlənilməz yerini dəqiq təsvir etməlidir. / usr / local / bin yalnız bir nümunədir.

-c bayrağı, skriptdə hər hansı bir əvvəl icra edilmək üçün bir əmri qabaqcadan edir. Komanda qövslə parçalanmamaq üçün əmr verilməlidir. Bu seçim bir neçə dəfə istifadə edilə bilər. Çox əmrlər, onları tək-c ilə nöqtəli vergüllə ayıraraq yerinə yetirilə bilər. Komutlar göründükləri sırada icra edilir. Expectk istifadə edərkən, bu seçim "komanda" olaraq təyin olunur.

-d bayrağı, əsasən gözlənilən və qarşılıqlı olaraq əmrlərin daxili fəaliyyətini bildirən bəzi diaqnostik çıxışı təmin edir. Bu bayraq bir Expect komutunun başında "exp_internal 1" kimi eyni təsirə malikdir, üstəgəl "Gözləmə" versiyası çap olunur.

-D bayrağı interaktiv bir ayıklama qurğusunu təmin edir. Tam dəyər tam olmalıdır. Hata ayıklayıcısı, dəyər sıfır deyilsə və ya bir ^ C basın və ya bir kəsmə nöqtəsi vurulursa ya da digər uyğun hata ayıklayıcısı əmrində görünürsə növbəti Tcl prosedurundan əvvəl nəzarət edəcək. Expectk istifadə edərkən, bu seçim - Debug olaraq göstərilir.

-f bayrağı, əmrləri oxumaq üçün bir faylın qabağını alır. Bayrağın özü isteğe bağlıdır, çünki yalnız #! notation, belə ki, digər arqumentlər əmr xəttində verilə bilər. Expectk istifadə edərkən bu seçim fayl olaraq verilir.

Varsayılan olaraq, komanda faylı yaddaşa oxunur və bütövlükdə icra edilir. Bəzən faylları bir seqmentdə oxumaq bəzən arzu edilir. Özbaşına faylları bu şəkildə idarə etmək üçün, -b bayrağı istifadə edin. Expectk istifadə edərkən, bu seçim - tampon kimi göstərilib.

"-" simli bir filename olaraq verilirsə, standart giriş oxunur. Əslində "-" adlı bir fayldan oxumaq üçün "./-" istifadə edin.

-i bayrağı, bir fayldan oxumaq əvəzinə komanda üçün interaktiv olaraq istəyə bilər. İstifadəsi çıxış komanda və ya EOF üzərindən sonlandırılır. Komanda faylı nə də -c istifadə edilmədiyi halda, -i bayrağı qəbul edilir. Expectk istifadə edərkən, bu seçim "interaktiv" olaraq təyin olunur.

- variantların sonunu məhdudlaşdırmaq üçün istifadə edilə bilər. Bu, gözləntilər tərəfindən şərh edilmədən skriptinizə bir seçim kimi sübuta keçmək istəyirsinizsə faydalıdır. Bu faydalı bir şəkildə #! xətt gözləyin. Məsələn, aşağıdakı argumentlər dəyişkən argvdə script adını da daxil edəcəkdir.

#! / usr / local / bin / expect -

Qeyd edək ki, adi getopt (3) və icra etmə (2) konvensiyalarının #! line.

Əgər, -N bayrağı istifadə edilmədiyi təqdirdə, $ exp_library / expect.rc faylı avtomatik olaraq qaynaqlanır. (Expectk istifadə edərkən, bu seçim -NORC kimi göstərilir.) Bundan sonra dərhal, ~ / .expect.rc faylını -n bayraq istifadə edilmədiyi halda avtomatik olaraq əldə edilir. DOTDIR ətraf mühitin dəyişkənliyi müəyyən edildikdə, bir qovluq kimi qəbul edilir və orada .expect.rc oxunur. Expectk istifadə edərkən bu seçim -norc kimi göstərilir. Bu qaynaq yalnız hər hansı bir bayraqları icra etdikdən sonra baş verir.

-v səbəbləri versiyasını və çıxışını yazmaq üçün gözləyin. Uzun bayraq adlarını istifadə edən Expectk-də müvafiq bayraq - dəyişiklikdir.

Opsiyonel args bir liste halına gətirilir və argv adlı dəyişəndə ​​saxlanılır. argc argv uzunluğuna başlayır.

Argv0, heç bir script istifadə edilmədiyi təqdirdə, skriptin və ya ikili'nin adıdır. Məsələn, aşağıdakılar scriptin adını və ilk üç arqumenti yazır:

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

Komanda

Tool Komutanlığı Dilindən istifadə etməyi gözləyin. Tcl nəzarət axını (ifa üçün, ifa etmə), ifadə qiymətləndirilməsi və recursionand prosedur müəyyən kimi digər xüsusiyyətləri təmin edir. Burada istifadə edilmiş lakin müəyyən edilməyən əmrlər (set, if, exec) Tcl əmrləridir. Beklenecek ek komutları dəstəkləyir. Başqa sözlə göstərilmədiyi halda, əmrlər boş simli qayıdır.

Komutlar əlifba sırası ilə siyahıya alınır ki, onlar tezliklə yerləşə bilərlər. Bununla belə, yeni istifadəçilər, spawn təsviri oxumaq, göndərmək, gözləmək və qarşılıqlı olaraq, bu qaydada başlayaraq daha asan tapa bilər.

yaxın [-save] [-onexec 0 | 1] [-i spawn_id]

mövcud prosesə bağlılığı bağlayır. Çox interaktiv proqramlar EOF- ni stdin və çıxışlarında aşkar edəcək; beləliklə də prosesi də öldürmək üçün kifayətdir. The -i bayrağı bu prosesi spawn_id adına uyğun bağlamağı bəyan edir.

Həm gözləyirik, həm də qarşılıqlı təsirlər cari prosesdən qaçındıqda və aşkar bir şəkildə yaxınlaşdıqda aşkar olacaq, amma "exec kill $ pid" deyərək proseyi öldürsəniz, açıqca yaxın zəng etməliyik .

The -onexec bayrağı hər hansı bir yeni spawned prosesində və ya proses overlayed əgər spawn id bağlıdır müəyyən edir. Spawn id açıq qoymaq üçün, dəyər 0-dan istifadə edin. Sıfır olmayan tamsayı dəyəri hər hansı bir yeni prosesdə spawn bağlanıb.

Əlvan bayraq, spawn id ilə əlaqəli köləmi bağlayır. Bağlantı bağlı olduqda, qul hələ də açıq olduqda avtomatik olaraq bağlanır.

Bağlantı örtüklü və ya açıq bir şəkildə bağlanılmasa da, müvafiq kernel prosesi yuvasını təmizləmək üçün gözləyin. Yaxın komanda gözləməyəcək, çünki bir prosesin bağlanması heç bir zəmanət olmayacaqdır.

debug [[-now] 0 | 1]

bir Tcl hata ayıklayıcısını nəzarət edir və bəyanatlardan keçməyə və breakpoints təyin etməyə imkan verir.

Debugger işləmədiyi halda, heç bir arqument yox, 1 qaytarılır, əks halda 0 qaytarılır.

1 arqumentlə, debugger işə salınır. 0 arqumenti ilə düzəldici dayandırılır. Əgər 1 argument əvvəlcədən -now bayrağından əvvəlsə, debugger dərhal başlayır. Əks halda, debugger növbəti Tcl ifadəsi ilə başlamışdır.

Debug komutu heç bir tələni dəyişdirmir. D-bayraqla gözləməyə başlayın.

Bağlantıdan çıxma əmri terminaldan çəngəl bir prosesi kəsir. Arxa planda davam edir. Proses öz proses qrupuna verilir. Standart I / O / dev / null ünvanına yönəldilir.

Aşağıdakı fraqment arxivdə skriptə davam etməyə davam etmək üçün ayırmaqdan istifadə edir.

əgər {{fork]! = 0} çıxarsa, ayırın. . .

Aşağıdakı skript şifrəni oxuyur və hər dəfə işə düşən hər bir parol tələb edən bir proqramı işə salır. Ssenariya parolu yalnız bir dəfə yazmaq üçün verər.

send_user "parol? \" expect_user -re "(. *) \ n" for {} 1 {} {if ({fork]! = 0} {sleep 3600; davam} spawn priv_prog bekleyin Şifre: göndər "$ expect_out ( 1, string) \ r ". . . çıxış}

Shell asinxron proses xüsusiyyətindən (&) ayırmaqdan istifadə etmək üstünlüyü, Gözləməyin terminal parametrlərini ayırmadan əvvəl saxlaya biləcəyini və daha sonra yeni ptyslərə tətbiq edə biləcəyindən ibarətdir. & Gözləməyin terminalın parametrlərini oxumaq şansı yoxdur, çünki terminal artıq zəmanət gözlədiyi zaman nəzarət gözləyir.

exit [-opts] [status]

səbəbləri çıxmaq və ya başqa şəkildə hazırlamaq üçün gözləyin.

The -onexit bayrağı növbəti arqumentin bir çıxış işleyicisi olaraq istifadə edilməsinə səbəb olur. Bir argüman olmadan, mövcud exit işleyicisi geri qaytarılır.

Nöqtə bayraq istifadəyə çıxmağa hazırlaşır, amma əməliyyat sisteminə həqiqətən qayıtmaqdan qısa durur. Istifadəçi müəyyən exit handler həmçinin Expect-in öz daxili işləyicilərindən istifadə edir. Heç bir daha gözlənilməz əmrlər yerinə yetirilməməlidir. Beklentiyi digər Tcl uzantıları ilə işləyərkən bu faydalıdır. Mövcud tərcüməçi (və Tk mühitində əsas pəncərədə) digər Tcl uzantıları təmizlənə biləcək şəkildə qalır. Beklentinin çıxışı yenidən çağırılırsa (lakin bu baş verə bilər), işləyicilər yenidən işləmirlər.

Çıxarılıb çıxdıqdan sonra yaranan proseslərə olan bütün əlaqələr bağlanır. Yağmurlaşdırma prosesləri ilə EOF olaraq təsbit ediləcək. exit normal _exit (2) proseduru nə kənarda başqa hərəkətlər edir. Beləliklə, EOF-ni yox etməyən spawned proseslər davam edə bilər. (Müxtəlif şərtlər, məsələn, spawned prosesinin göndəriləcəyi siqnalların nə dərəcədə qəbul ediləcəyini müəyyən etmək üçün vacibdir, lakin bu, sistemə bağlıdır, adətən çıxışda sənədləşdirilir (3).) Keçirməyə davam edən spawned proseslər init tərəfindən miras alınacaqdır.

status (və ya əgər göstərilməyibsə) Beklentinin exit statusu kimi qaytarılır. Ssenarinin sonuna çatıldığı təqdirdə çıxış çıxılmaz vəziyyətdədir.

exp_continue [-continue_timer]
Komandanın exp_continue əmri normal olaraq geri dönmədən yerinə yetirilməsini gözləməyə imkan verir. Varsayılan olaraq exp_continue zaman aşımı taymerini sıfırlar. -Continue_timer bayrağı taymerin yenidən başlamasını maneə törədir. (Daha ətraflı məlumat üçün gözləyin .)

exp_internal [-f fayl] dəyəri
qiyməti sıfır deyilsə stderr- ə gözləyin . 0 rəqəmi olduqda bu çıxış aradan qaldırılır. Diaqnostik məlumat alınan hər bir xarakterə və hər bir cəhddə nümunələrə qarşı mövcud çıxışı uyğunlaşdırır.

İsteğe bağlı fayl təmin edildikdə, normal və debugged bütün çıxış həmin faylya yazılır (dəyəri dəyərindən asılı olmayaraq). Hər hansı bir əvvəlki diaqnostik çıxış faylı bağlanıb.

The -info bayrağı, verilən ən son informasiyalı argümanların təsvirini qaytarmaq üçün exp_internal səbəb olur.

exp_open [args] [-i spawn_id]
orijinal spawn idinə uyğun olan bir Tcl fayl identifikatorunu qaytarır. Fayl identifikatoru Tcl-nin açıq əmri ilə açılmış kimi istifadə edilə bilər. (Spawn id istifadə edilməməlidir. Bir gözləyin yerinə yetirilməməlidir.

The -leaveopen bayrağı gözləmə əmrləri vasitəsilə daxil olmaq üçün spawn idini tərk edir. Spawn idində gözləyin edilməlidir.

exp_pid [-i spawn_id]
hazırda yaranan prosesə uyğun olan proses idini qaytarır. -I bayrağı istifadə edildikdə, pid , verilmiş spawn idin uyğun gəldi.

exp_send
göndərmək üçün bir aliasdır.

exp_send_error
send_error üçün bir aliasdır .

exp_send_log
send_log üçün bir aliasdır .

exp_send_tty
send_tty üçün bir aliasdır .

exp_send_user
send_user üçün aliasdır .

exp_version [[-exit] versiyası]
scriptin Beklentinin mövcud versiyası ilə uyğun olduğundan əmin olmaq üçün faydalıdır.

Heç bir dəlil olmadan, gözləntinin mövcud versiyası qaytarılır. Bu versiya sonra ssenarinizdə kodlaşdırıla bilər. Əgər həqiqətən son versiyaların xüsusiyyətlərini istifadə etmirsinizsə, daha əvvəlki bir versiyanı müəyyən edə bilərsiniz.

Versiyalar nöqtələrlə ayrılmış üç ədəddən ibarətdir. Birincisi, ən böyük nömrədir. Fərqli bir sıra ilə Beklentinin versiyaları üçün yazılmış skriptlər demək olar ki, işləməyəcəkdir. exp_version , əsas rəqəmlər uyğun deyilsə, bir səhv qaytarır.

İkincisi kiçik nömrədir. Cari versiyadan daha çox kiçik sayda bir versiya üçün yazılmış skriptlər bəzi yeni xüsusiyyətlərə bağlı ola bilər və işləməyəcəkdir. exp_version , əsas rəqəmlər uyğun olsa, bir səhv qaytarır, lakin skript kiçik sayı çalışan gözləniləndən daha böyükdür.

Üçüncü versiya müqayisədə heç bir rol oynayan bir rəqəmdir. Buna baxmayaraq, proqram təminatı bölüşdürülməsinin gözlənilməsi , əlavə sənədlər və ya optimallaşdırma kimi hər hansı bir şəkildə dəyişdirildikdə artırılır. Hər bir yeni kiçik versiyaya 0 sıfırlanır.

-Xətt bayrağı ilə " Bekle" bir səhv yazdırır və versiyası köhnəlirsə çıxılır.

gözləmək [[-opts] pat1 body1] ... [-opts] patn [bodyn]
nümunələrdən birinə çırpılmış bir prosesin çıxışına, müəyyən bir müddət keçdiyinə və ya sonuncu faylın göründüyünə qədər gözləyir. Sonuncu bədən boş olduqda, buraxıla bilər.

Ən sonuncu gözləmədən əvvəlki nümunələr başqa nümunələrdən əvvəl örtük şəkildə istifadə olunur. Ən son gözləniləndən sonra əmrləri digər nümunələrdən sonra örtük şəkildə istifadə olunur.

Bütün gözlənilən bəyanatın arqumentləri birdən çox xətt tələb etməlidirsə, hər bir ardıcılın tersliklə endirilməməsi üçün bütün arqumentlər birinə "bükülmüş" ola bilər. Bu vəziyyətdə, kölgələrə baxmayaraq adi Tcl əvəzləri meydana gələcək.

Efor sözü bir nümunədirsə, müvafiq orqan faylın sonu ilə yerinə yetirilir. Bir nümunə söz zaman aşımı zamanında olduqda, müvafiq quruluş zaman aşımı zamanı icra edilir. Heç bir zaman aşımı sözü istifadə edilmirsə, zaman aşımı zamanı örtülü null tədbirlər həyata keçirilir. Varsayılan zaman aşımı süresi 10 saniyedir, ancaq, məsələn, 30'a "set timeout 30" əmri ilə təyin edilə bilər. Sonsuz bir zamanaşım -1 ilə təyin edilə bilər. Bir nümunə sözü default edirsə, müvafiq orqan ya zaman aşımı ya da sonuncu fayl üzərindən icra edilir.

Nümunə uyğun olarsa, müvafiq orqan icra edilir. gözləyin bədənin nəticəsini qaytarır (və ya heç bir nümunə eşleşmediğinde boş simli). Çox nümunələr uyğun olduqda, ilk görünən bir bədən seçmək üçün istifadə olunur.

Hər dəfə yeni çıxış gəldikdə, hər bir nizamda göstərildiyi sıraya görə müqayisə edilir. Beləliklə, bir nümunə kimi son görünüşün zəmanət veriləcəyi bir şey verərək bir matç olmaması üçün test edə bilərsiniz. Heç bir sorğu olmadığı hallarda, vaxtınızı istifadə etməliyəm (əlinizlə qarşılıqlı əlaqədə olduğunuz kimi).

Nümunələr üç şəkildə ifadə edilir. Varsayılan olaraq, nümunələr Tcl-nin simli uyğunluğu əmri ilə müəyyən edilir. (Bu cür nümunələr, ümumiyyətlə, "külək" nümunələri kimi istinad edilən C-shell normal ifadələrinə bənzər). -Gl bayraqları, bayraqların bunu etməsini gözləməklə uyğunlaşa biləcək nümunələri qorumaq üçün istifadə edilə bilər. "-" ilə başlayan hər hansı bir nümunə bu şəkildə qorunmalıdır. ("-" ilə başlayan bütün simlər gələcək variantlar üçün qorunur.)

Məsələn, aşağıdakı fraqment uğurlu giriş üçün baxır. ( Abortun skriptin başqa bir yerində müəyyən edilmiş prosedur olduğu ehtimal edilir).

gözləmək {busy {puts busy \ n; exp_continue} başarısız oldu "etibarsız parol" dayandırma dayandırılıb bağlanmadı}

Cədvəllər dördüncü nüsxədə lazımdır, çünki başqa bir nişanı hərəkətdən ayırmaq üçün bir yer ehtiva edir. Eyni hərəkətə malik nümunələr (3-cü və 4-cü kimi) hərəkətləri təkrar qeyd etməyi tələb edir. Bu, regexp-stil nümunələrini istifadə etməkdən çəkinir (aşağıya bax). Glob üslublu nümunələri formalaşdırmaq haqqında daha ətraflı məlumat Tcl dərslikində tapıla bilər.

Regexp-stil nümunələri, Tcl-nin regexp (qısa) "normal ifadə" əmri ilə müəyyən edilmiş sintaksisini yerinə yetirir. regexp nümunələri bayraqla -re ilə təqdim edilir . Əvvəlki nümunə bir regexp istifadə edərək yenidən yazıla bilər:

gözləmək {busy {puts busy \ n; exp_continue} -re "uğursuz | yanlış parol" abort timeout abort bağlı}

Nümunələrin hər ikisi "nizamlanmamışdır". Bu, nümunələrin bütün simvolu uyğun deyil, lakin matçın başlanğıc və simvol hər hansı bir yerdə başa bilər (hər şey eşleşir olduğu müddətdə). Bir simli başlanğıc üçün ^ istifadə edin və sona uyğun olaraq $. Bir stringin bitməsini gözləməyin, cavabların asanlıqla simli ortada sona çatdığına diqqət yetirin, çünki onlar spawned prosesindən əks olunur. Düzgün nəticələr çıxararkən, çıxış qeyri-təbii görünür. Beləliklə, simvolun sonunda simvolları tam olaraq təsvir edə bilərsiniz, əgər $ istifadə edilməsinə təşviq olunur.

Qeyd edək ki, bir çox redaktorda, ^ və $ naviqasiyanın başlanğıc və sonuna uyğun gəlir. Lakin, xətt yönümlü deyil, çünki bu simvollar hazırda gözlənilən eşleme tamponundakı məlumatların başlanğıc və sonuna (xəttlərə qarşı) uyğun gəlir. (Həmçinin, aşağıda qeyd olunan "sistem həzminə" baxın.)

-ex bayrağı, nümunənin bir "dəqiq" simli olaraq uyğunlaşmasına səbəb olur. *, ^, Və s. Şərhləri edilmir (baxmayaraq ki, adi Tcl konvensiyaları hələ də müşahidə edilməlidir). Dəqiq desəklər həmişə nizamlanmamışdır.

-Ölçüm bayrağı, kiçik əmsallar kimi, müqayisə edilmək üçün böyük əmsalları yaradır. Nümunə təsirlənmir.

Çıxışını oxuyarkən, 2000 baytdan çox əvvəllər "unudulmuş" baytları məcbur edə bilər. Bu, match_max funksiyası ilə dəyişdirilə bilər. (Qeyd edək ki, çox böyük dəyərlər nümunə uyğunlaşdıqda yavaşlaya bilər). Liste listesi tam_buffer olsa, uyğun_max bayt alındıqda və digər nümunələr eşleşmediğinde , müvafiq qurum həyata keçirilir . Tam_buffer sözünün istifadəsi olsun və olmasın, unudulmuş simvollar wait_out (buffer) yazılır.

Axtardığınız söz siyahısı null və nulls ( remove_nulls komandası vasitəsilə), bir müvafiq ASCII 0 eşleştirilirsə müvafiq orqanı həyata keçirilir. Glob və ya regexp nümunələri ilə 0 byte uyğun ola bilmərik.

Nümunə (və ya eof və ya tam_buffer) uyğunlaşdıqda, hər hansı eşleme və əvvəllər uyğun olmayan çıxış dəyişən wait_out (bufer) ilə saxlanılır . Up to 9 regexp substring maçları expect_out (9, string) vasitəsilə gözləyin ( 1, string) dəyişənlərə qeyd olunur. Bir nümunədən əvvəl istifadə olunan bayraq bayraqları istifadə edildikdə , 10 simvolun başlanğıc və bitiş indeksləri (qeyri- adi üçün uyğun formada) gözlənilən (X, başlanğıc)wait_out (X, end) dəyişənlərində saxlanılır, burada X bir rəqəmli, tamponda substrinq mövqeyinə cavab verir. 0, bütün nümunəyə uyğun gələn və glob nümunələri və regexp nümunələri üçün yaradılan simləri ifadə edir. Məsələn, bir proses "abcdefgh \ n" çıxışı çıxarsa, nəticə:

gözləmək "cd"

aşağıdakı bəyanatları yerinə yetirmişdir:

set expect_out (0, string) cd müəyyən expect_out (buffer) abcd

və "efgh \ n" çıxış tamponunda qalır. Bir proses çıxış "abbbcabkkkka \ n" çıxardı, nəticə:

"b (b *). * (k +)"

aşağıdakı bəyanatları yerinə yetirmişdir:

set expect_out (0, start) 1 set expect_out (0, end) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, end) 3 set expect_out (1, string) bb set expect_out (2, başlanğıc) 10 set expect_out (2, end) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

və "a \ n" çıxış tamponunda qalır. "*" Nişanı (və ". * *") Prosesdən daha çox çıxış oxumadan çıxış tamponunu yandırır.

Normal olaraq, eşleşen çıktı, Beklentin daxili tamponlarından atılır. Bu qeyri-köçürmə bayrağı ilə bir nümunə ön tərəfindən qarşısını almaq olar. Bu bayraq xüsusən eksperimentdə faydalıdır (və sınaq zamanı rahatlıq üçün "yox" deyilə bilər).

Uyğundur çıxışı (və ya eof və ya full_buffer) ilə əlaqəli spawn id gözlənilən_out (spawn_id) saxlanılır.

Zamanlı bayraq, zaman aşımı dəyişəninin dəyərini istifadə etmək əvəzinə, aşağıdakı dəyərləri bir zaman aşımı kimi istifadə etmək üçün gözlənilən əmr verir.

Varsayılan olaraq, nümunələr mövcud prosesdən çıxışa qarşı eşidilir, lakin -i bayrağı, adlandırılmış spawn_id siyahısından çıxarılan hər hansı bir nümunəyə (növbəti -i qədər) uyğunlaşdıqlarını bildirir. Spawn_id siyahısı spawn_ids-in ayrılmış bir boşluq və ya spawn_ids-in belə bir siyahısına istinadən dəyişən olmalıdır.

Məsələn, aşağıdakı proqnoz $ proc2 tərəfindən verilən spawn_id-dən mövcud prosesdən "bağlı" və ya "məşğul", "uğursuz" və ya "etibarsız parol" gözləyir.

gözləmək {-i $ proc2 busy {puts busy \ n; exp_continue} -re "uğursuz | yanlış parol" abort timeout abort bağlı}

Qlobal değişkenin any_spawn_id dəyəri, mövcud beklentisi əmrində bütün digər -i bayraqları ilə adlandırılan hər hansı bir spawn_ids üçün nümunələri uyğunlaşdırmaq üçün istifadə edilə bilər. Bir -i bayrağından spawn_id heç bir əlaqəli nümunə ilə (yəni başqa bir -i ilə izlənilir) hər hansı bir nümunəyə hər hansı bir_spawn_id ilə əlaqəli eyni gözlənilən əmrdə təqdim edilir.

The -i bayrağı da dəyişən bir spawn kimliklərinin siyahısı üçün oxunduqda qlobal dəyişən adını verə bilər. Değişken değiştiğinde tekrar okunur. Bu əmr icra edildikdə I / O mənbəyini dəyişdirmək üçün bir yol təqdim edir. Bu şəkildə verilən spawn idləri "dolayı" spawn idləri deyilir.

Breakdavam kimi hərəkətlər idarəetmə strukturlarına (yəni proc üçün ) adi şəkildə davranmağa səbəb olur. Komandanın exp_continue əmri normal olaraq geri dönmədən yerinə yetirilməsini gözləməyə imkan verir.

Bu açıq loops və ya təkrar gözləyin ifadələrindən qaçınmaq üçün faydalıdır. Aşağıdakı misal, rlogin'i avtomatlaşdırmaq üçün bir parçanın bir hissəsidir. Exp_continue , rlogin bir parol tələb edərsə, ikinci bir gözləməylə bəyanat yazmaqdan qaçır ( yeniliyi axtarmaq üçün).

\ n "send_user" \ n "göndərin" $ expect_out (1, string) \ r "stty echo exp_continue} yanlış {send_user "geçersiz şifre və ya haqq-hesab \ n" çıkış} zaman aşımı {send_user "$ ana bilgisayara bağlanma \ n" exit} eof {send_user \ "host bağlanma başarısız oldu: $ expect_out (buffer)" exit} yenidən göndərmək}

Məsələn, aşağıdakı fraqment istifadəçiyə tamamilə avtomatlaşdırılmış bir qarşılıqlı təsir göstərməyə kömək edə bilər. Bu halda, terminal xammal rejiminə qoyulur. İstifadəçi "+" düyməsinə basdıqda, bir dəyişən artırılır. "P" basıldığında prosesə bir neçə bəyanat göndərilir, bəlkə də bir şəkildə onu soxdur və "i" istifadəçinin proseslə qarşılıq verməsini təmin edir, effektiv olaraq skriptdən nəzarət aparır. Hər halda, exp_continue , cari hərəkəti icra etdikdən sonra cari nümunə uyğunlaşmasını davam etdirməyi planlaşdırır.

stty raw -echo expect_after {-i $ user_spawn_id "p" {gönder "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {əlaqə; exp_continue} "çıxmaq" çıxışı}

Varsayılan olaraq, exp_continue , zamanaşımı zamanlayıcısını sıfırlar. Istifadəçi -continue_timer bayraqla çağırılırsa, zamanlayıcı yenidən başlamır .

expect_after [expect_args]
gözləniləndəngözləniləndən sonrakı nümunələr uyğun olsalar, gözlənilən naxışlar istisna olmaqla, əvvəlcədən gözləniləndir . Daha ətraflı məlumat üçün gözləyin əvvəlcədən əmrinə baxın.

expect_background [expect_args]
gözlədiyimiz kimi eyni arqumentləri alır, ancaq dərhal qaytarır. Nümunələr yeni giriş gəldiyi zaman test edilir. Nümunə zamanaşımıdefault görünüşü gözləmədən mənasızdır və səssizcə atılır. Əks halda, expect_background əmrini gözlənilən kimi gözləyingözləniləndən sonra gələcək nümunələri istifadə edir.

Beklentilerden geri qalan hərəkətlər qiymətləndirildikdə eyni toxum idinin arxa planı bloklanır. Hərəkət başa çatdıqdan sonra fon emalından çıxın. Arxa fonda işləmə qadağan edildikdə, eyni spawn ID-də (ön plan) bir şey gözləmək mümkündür.

Beklentinin geri alınması gözlənilmədikdə gözləmək mümkün deyil. Belirli bir spawn id üçün gözləyin_kökümü eyni spawn id ilə yeni bir expect_background elan edərək silinir. Heç bir naxışla gözləməyəcəyini bildirən arxa planda arxa planda nümunələri uyğunlaşdırma qabiliyyətindən verilmiş spawn ID qaldırır.

expect_before [expect_args]
gözlədiyimiz kimi eyni arqumentləri alır, ancaq dərhal qaytarır. Eyni spawn id ilə əvvəlcədən gözlənilən ənənədən nümunəvi hərəkət cütləri hər hansı bir gözlənilən əmrlərə dolğun olaraq əlavə edilir. Nümunə uyğunlaşdıqda, gözlənilən komanda özündə göstərildiyi kimi qəbul edilir və əlaqəli orqan gözlənilən əmr kontekstində icra edilir. Hər iki gözləniləndəngözlənildiyindən nümunələr uyğun ola bilərsə , əvvəlcədən gözlənilən model istifadə olunur.

Heç bir model göstərilmirsə, spawn id hər hansı bir nümunə yoxlanılmır.

Bir -i bayrağı ilə əvvəlcədən nəzərdə tutulmadıqda , gözləntilər əvvəlcədən gözləməyən əmr yerinə yetirildikdə təyin olunmalıdır ( desen eşleme olunmazsa ).

The -info bayrağı gələcəkdə gözlənilən nəticələrə uyğun gələcəkdir. Varsayılan olaraq, mövcud spawn id haqqında məlumat verir. Bu spawn id haqqında məlumat üçün əlavə spawn id dəqiqləşdirilməsi verilə bilər. Misal üçün

expect_before -info -i $ proc

Ən çox spawn id dəqiqləşdirilməsi verilə bilər. Bayraq, indirect spesifikasiyalardan gələn birbaşa kürü idilərini basdırır.

Spawn id spesifikasiyasının əvəzinə, "bütün" bayraq "-info" bütün spawn idləri haqqında məlumat verməyə səbəb olacaq.

-Info bayrağının çıxışı gözlənilən əvvəlcədən arqument kimi yenidən istifadə edilə bilər.

gözləməyəcəkdir [expect_args]
gözlədiyiniz kimi, lakin / dev / tty (yəni istifadəçi tərəfindən vurulmuş vuruş) simvolunu oxuyur. Standart olaraq, oxu bişirilmiş rejimdə həyata keçirilir. Beləliklə, xəttlər onları görmək gözləmək üçün bir dönüş ilə sona çatmalıdır. Bu, stty vasitəsilə dəyişdirilə bilər (aşağıdakı stty əmrinə baxın).

expect_user [expect_args]
gözləyin, lakin stdindən simvol oxuyur (yəni istifadəçi tərəfindən vurulmuş vuruş). Standart olaraq, oxu bişirilmiş rejimdə həyata keçirilir. Beləliklə, xəttlər onları görmək gözləmək üçün bir dönüş ilə sona çatmalıdır. Bu, stty vasitəsilə dəyişdirilə bilər (aşağıdakı stty əmrinə baxın).

çəngəl
yeni bir proses meydana gətirir. Yeni proses cari Expect prosesinin tam surətidir. Uğurlu olaraq, çatal yeni (uşaq) prosesinə 0 qaytarır və uşağın proses kimliyini ana prosesə qaytarır. Qeyri-müntəzəm olaraq (hər zaman resursların olmaması, məsələn, svop boşluq, yaddaş) görə, fork qaytarır -1 valideyn prosesi və heç bir uşaq prosesi yaradılır.

Forked proseslər, orijinal proses kimi, çıxış komandanlığı ilə çıxış edirlər . Forked prosesləri log fayllarına yazmağa icazə verilir. Əgər proseslərin əksəriyyətində diskussiya etməyi və ya giriş etməyi dayandırmırsan, nəticə çaşdışı ola bilər.

Bəzi pty tətbiqləri birdən çox oxucu və yazıçı tərəfindən, hətta bir anda qarışdırıla bilər. Beləliklə, yumurtlama prosesləri əvvəlcədən təhlükəsizdir.

qarşılıqlı [string1 body1] ... [stringn [bodyn]]
istifadəçi üçün mövcud prosesin nəzarətini təmin edir, belə ki tuş vuruşları cari prosesə göndərilir və mövcud prosesin stdout və stderr qaytarılır.

String-bədən cütləri arqumentlər kimi göstərilə bilər, buna görə cisim müvafiq simli girildikdə yerinə yetirilir. (Əvəzində, simli cari prosesə göndərilmir.) Sonuncu cisim eksiksə, tercüman komandası qəbul edilir.

Bütün qarşılıqlı ifadələrə dair arqumentlər birdən çox xətt tələb etsə, hər bir ardıcılın tersliklə endirilməməsi üçün bütün arqumentlər birinə "bükülmüş" ola bilər. Bu vəziyyətdə, kölgələrə baxmayaraq adi Tcl əvəzləri meydana gələcək.

Məsələn, aşağıdakı komanda işlədilir, müəyyən olunan aşağıdakı string-body cütləri ilə qarşılıqlı çalışır: ^ Z düyməsini basıldığında, Gözləmə dayandırılır. ( Açıq bayraq terminal rejimlərini bərpa edir.) ^ A basıldığında, istifadəçi "bir nəzarət-A yazdığınızı" görür və proses ^ A göndərilir. $ Basıldığında, istifadəçi tarixi görür. ^ C'ye basıldığında, Gözləyin çıxın. "Foo" girilsə, istifadəçi "bar" görür. ~ ~ Basıldığında, Tərcüməçi gözləyənlər interaktiv şəkildə çalışır.

set CTRLZ \ 032 etkileşim {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "bir denetim yazdınız - A \ n"; "\ 001"} $ {send_user "Tarix [saat formatı] [saat fasiləsi]."} \ 003 çıxış foo {send_user "bar"}} ~~}

Simli-bədən cütlərindəki strings onlar arqumentlər siyahıda sıraya uyğunlaşdırılır. Qismən qarşılaşdıqları sətirlər qalan hissənin gözlənildiyi anda mövcud prosesə göndərilmir. Daha sonra simvollar bir-birinə uyğun olmaya bilər, belə ki simvolun yalnız bir hissəsi başqa bir oyuna başlaya bilməyən prosesə göndəriləcəkdir. Beləliklə, qismən matçların alt sətri olan strings daha sonra uyğun ola bilər, əgər uyğunlaşmağa çalışdığınız orijinal strings nəticədə uğursuz olarsa.

Varsayılmadı olaraq, string eşleme, vahşi kartlar olmadan dəqiqdir. (Əksinə, gözlənilən komanda default şəklində ümumdünya üslub nümunələrini istifadə edir.) -ex bayraqları başqa hallarda qarşılıqlı bayraqlarla uyğunlaşa biləcək nümunələri qorumaq üçün istifadə edilə bilər. "-" ilə başlayan hər hansı bir nümunə bu şəkildə qorunmalıdır. ("-" ilə başlayan bütün simlər gələcək variantlar üçün qorunur.)

Bu bayraq bayraq bir simvolu tərs tərz kimi şərh ediləcək. Bu halda, uyğun substrings dəyişən interact_out saxlanılır gözləmək yolu ilə eyni çıxış onun dəyişən wait_out saxlayır . Bu bayraq bayraqları eyni şəkildə dəstəklənir.

Efor nümunəsi faylın sonu ilə yerinə yetirilən bir hərəkət təqdim edir. Ayrı-ayrı eof naxışları da çıxış bayrağına əməl edə bilər, bu halda çıxışı yazarkən eof aşkar edildikdə eşleşir. Varsayılan eof aksiyası "geri" dir, belə ki, qarşılıqlı əlaqələr sadəcə hər hansı bir EOF üzərində qayıdır.

Model zaman aşımı bir zaman aşımı (saniyədə) və müəyyən bir zaman üçün heç bir simvol oxunmasından sonra icra edilən fəaliyyət təqdim edir. Gecikmə nüsxəsi ən son müəyyən edilmiş proses üçün tətbiq olunur. Heç bir default timeout yoxdur. Xüsusi dəyişən "timeout" ( gözlənilən komanda tərəfindən istifadə olunur) bu zaman aşımına təsir göstərmir.

Məsələn, aşağıdakı bəyanat bir saat üçün heç bir şey yazmayan, lakin hələ tez-tez sistem mesajlarını alan istifadəçilərin autologoq üçün istifadə oluna bilər:

qarşılıqlı -put $ user_spawn_id timeout 3600 return -output \ $ spawn_id

Nümunə sözü boş deyilsə və nulls icazə verilirsə ( remove_nulls komandası vasitəsilə), bir ASCII 0 uyğunlaşdıqda müvafiq orqan icra edilir. Glob və ya regexp nümunələri ilə 0 byte uyğun ola bilmərik.

Flag -write ilə bir nümunə hazırlamaq dəyişən interact_out (spawn_id) naxışına (və ya eof) uyğun olan spawn_id üçün təyin olunmasına səbəb olur.

Breakdavam kimi hərəkətlər idarəetmə strukturlarına (yəni proc üçün ) adi şəkildə davranmağa səbəb olur. Bununla yanaşı, geri qayıtmaq səbəbləri aradağına qayıtmaq üçün qarşılıqlı əlaqələrdir, inter_return isə çağırana geri dönməyə səbəb olur. Məsələn, əgər "proc foo" sözügedən inter_return-i yerinə yetirmişdirsə , proc foo qayıdır. (Bu deməkdir ki, qarşılıqlı əlaqəli tərcüməçi interaktiv şəkildə qayıdış yazaraq geri qayıtmağa davam edəcək, inter_return qarşılıqlı əlaqənin zəng edənə qayıtmasına səbəb olur.

Qarşılıqlı əlaqə zamanı xam rejimi bütün simvolların hazırkı prosesə ötürülməsi üçün istifadə olunur. Mövcud proses işə nəzarət siqnallarını tutmursa, bir durdurma siqnalı göndərildikdə dayandırılacaqdır (default ^ Z). Yenidən başladın, davam siqnalını göndərin (məsələn, "öldürmək-CONT"). Əgər həqiqətən belə bir prosesə SIGSTOP göndərmək istəyirsinizsə (^ Z ilə), əvvəlcədən yumurtlama csh hesablayın və sonra proqramı işləyirik. Digər tərəfdən, özünü gözləmək üçün bir SIGSTOP göndərmək istəyirsinizsə, əvvəlcə tərcüməçini çağırın (bəlkə də bir qaçış xarakteri istifadə edərək) və sonra ^ Z düyməsini basın.

String-bədən cütləri tərcüməçiyə daxil olmaq və komutları interaktiv olaraq yerinə yetirməkdən qaçınmaq üçün bir stenoqrafiya kimi istifadə edilə bilər. Əvvəlki terminal rejimi bir simli bədən çifti cismi icra edilərkən istifadə olunur.

Sürət üçün tədbirlər hamı rejimində yerinə yetirilir. Həyəcan bayrağı bayraqları qarşılıqlı olaraq əvvəlcədən rejiminə qaytarır (həmişə bişirilmiş rejim). Qeyd edək ki, rejim qoşulduqdan sonra daxil edilən simvollar (bəzi sistemlərdə terminal sürücünün uğursuz xüsusiyyətləri) itkin ola bilər. İstifadənin yeganə səbəbi - hərəkətinizin bişirilmiş rejimdə işlədilməsindən asılıdır.

The -xeo bayraqları aşağıdakı nümunəyə uyğun gələn simvolları hər bir xarakterin oxunduğu kimi yaradan prosesə göndərir. İstifadəçi qismən tərtib edilmiş nümunələrdən geribildirim görməli olduqda bu faydalı ola bilər.

Bir nümunə əks olunduqda, lakin nəticədə uyğunlaşmırsa, simvol spawned prosesinə göndərilir. Çıxarılan proses onları yandırsa, istifadəçi simvolları iki dəfə görür. istifadəçi modelin tamamlanmasını çətinləşdirməmiş vəziyyətlərdə, ehtimal ki, yalnız uyğun olur. Məsələn, aşağıdakı alıntı rftp'dən, yəni recursive-ftp skriptidir, burada istifadəçinin indiki kataloqun təkrarlanan şəkildə alınması, qoyulması və ya listelenmesi üçün ~ g, ~ p və ya ~ l daxil olması tələb olunur. Bunlar, normal ftp əmrlərindən uzaqdır, istifadəçinin hər hansı bir şeylə yanlış istisna olmaqla, başqa bir şeyin ardına yazmaq çətin deyildir, bu halda, yəqin ki, hər halda nəticəni görməyəcəklər.

qarşılıqlı əlaqə (-echo ~ g) {getcurdirectory 1} -exo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

-Normal bayrağı, xarakterlər oxunduğu kimi , aşağıdakı prosedura uyğun gələn simvolları çıxış prosesinə göndərir.

Bir proqramın echo modelini geri qaytarmaq istədiyində bu faydalıdır. Məsələn, aşağıdakılar bir şəxsin yığdığı yerə nəzarət etmək üçün istifadə oluna bilər (Hayes-stil modemi). Hər dəfə "atd" göründüyündə skript xəttin qalan hissəsini saxlayır.

dial lognumber {} {interact -nobuffer -re "(. *) \ r" returns put $ log "[saat formatı [saat saniyesi]]: dialed $ interact_out (1, string)"} interact -nobuffer "atd" lognumber

Qarşılaşma zamanı log_user'ın əvvəlki istifadə edilməməsi göz ardı edilir. Xüsusilə, qarşılıqlı çıxış onun girişini (standart çıxışa göndərilir) məcbur edəcək, çünki istifadəçi kor-koranə qarşılıq vermək istəmir.

-O bayraq, hər hansı aşağıdakı əsas bədən cütünün mövcud prosesin çıxışına tətbiq olunmasına səbəb olur. Bu, məsələn, bir telnet sessiyası zamanı istenmeyen simvol göndərən ana ilə məşğul olduqda faydalı ola bilər.

Varsayılan olaraq, qarşılıqlı istifadəçi stdin yazmaq və Gözləmə prosesinin özünü stdout yazmasını gözləyir . -U bayrağı ("istifadəçi" üçün) istifadəçini öz arqumenti ilə adlandırılan proses kimi əlaqə saxlayır (spawned id olmalıdır).

Bu, bir-birinə aid olmayan iki prosesin birbaşa loopdan istifadə etmədən birləşməsinə imkan verir. Hata ayıklamaya kömək etmək üçün, Diqqəti gözləməyin həmişə stderr (və ya müəyyən giriş və hata ayıklama məlumatları üçün stdout). Eyni səbəbdən, tərcüməçi əmri stdindən interaktiv şəkildə oxuyacaqdır.

Məsələn, aşağıdakı fraqment bir giriş prosesi yaratır. Sonra istifadəçi (göstərilən deyil) yığır və nəhayət ikisini birləşdirir. Əlbəttə, hər hansı bir proses giriş üçün əvəz edilə bilər. Məsələn, məsələn, istifadəçi hesabı və parol vermədən işləməyə imkan verir.

spawn login girişə girmə $ spawn_id spawn tip modem # istifadəçi geri qayıtmaq # əlaqə istifadəçi daxil olmaq üçün -u $ giriş

Çıxışları bir çox prosesə göndərmək üçün, hər bir başlanğıc listesini - bir bayt bayrağı ilə əvvəlcədən qeyd edin. Bir qrup çıxış çərşənbə axşamı idilər üçün giriş bir giriş bayrağı ilə əvvəlcədən bir spawn id siyahısı ilə müəyyən edilə bilər. (Hər hansı bir -spunan_idin qarşılıqlı təsir göstərməməsi istisna olmaqla) - giriş və çıxışlar, gözlənilən əmrdə -i bayrağı ilə eyni formada ola bilər.) Bütün bu bayraq və strings (və ya naxışlar) giriş bayrağı göstərilir. Heç bir giriş olmadıqda , "çıxış $ user_spawn_id -output" deməkdir. ( Eynisi olmayan, nümunələri ilə- daxildir .) Bir çıxış göstərildiyi halda, $ user_spawn_id-i overrides. İkinci bir nəticə göstərildiyi təqdirdə , $ spawn_id-i overrides. Əlavə giriş bayraqları göstərilə bilər.

İki nəzərdə tutulan giriş prosesi, çıxışlarını $ spawn_id və $ user_spawn_id (əksinə) kimi göstərməyə qadirdir. Bir giriş bayrağı heç bir göstərici bayrağı olmadan görünsə, bu prosesdən gələn xarakterlər silinir.

-I bayrağı mövcud spawn_id üçün əvəz təqdim etmədikdə, başqa heç bir əlamət və ya boşluq bayraqları istifadə edilmir. A -i bayrağı bir -o bayrağı nəzərdə tutur.

İndirekt spawn id istifadə edərək, qarşılıqlı olan prosesləri dəyişdirmək mümkündür. (Dolayı spawn idləri gözlənilən komanda bölməsində təsvir olunur). Dolaysız spawn idləri -i, -u, -input və ya -these bayraqları ilə göstərilə bilər.

tərcüməçi [args]
istifadəçinin interaktiv olaraq Beklentisi və Tcl əmrləri tələb olunur. Hər əmrin nəticəsi çap olunur.

Breakdavam kimi hərəkətlər idarəetmə strukturlarına (yəni proc üçün ) adi şəkildə davranmağa səbəb olur. Bununla yanaşı tərcüməçi tərcüməçiyə zəng edənə qayıdır , inter_return interpreter isə zəng edənə bir qaytarma səbəb olur. Məsələn, "proc foo" tərcüməçi adlandırdıqda, sonra inter_return fəaliyyətini icra etdi, proc foo qayıdıb. Başqa hər hansı bir komanda tərcüməçiyə yeni əmrləri verməyi davam etdirməyə səbəb olur.

Varsayılan olaraq, sorğu iki tamsayı ehtiva edir. İlk tamsayı, qiymətləndirmə yığının dərinliklərini təsvir edir (yəni Tcl_Eval neçə dəfə çağırıldı). İkinci tamsayı Tcl tarixinin identifikatorudur. Tezlik, "return1" adlı proseduru müəyyənləşdirməklə təyin edilə bilər ki, qaytarma dəyəri növbəti təklif olur. Bəyanatda açıq quotes, parens, braces və ya mötərizələr varsa, yeni xətt üzrə ikincil sorğu (default olaraq "+>") verilir. İkinci sifariş "prompt2" adlı proseduru təyin etməklə təyin edilə bilər.

Tərcüməçi , çağıran xammal rejimi istifadə etsə də, bişirilmiş rejim istifadə olunur.

Stdin bağlıdırsa, hər hansı bayraq istifadəsi istisna olmaqla, tərcüməçi qayıdacaqdır, bu halda növbəti arqument çağırılır.

log_file [args] [[-a] fayl]
Bir filename təmin edildikdə , log_file faylda seansın transkriptini (həmin nöqtədən başlayaraq) qeyd edər. Log_file , heç bir arqument verilmədiyində qeydiyyatı dayandırır. Hər hansı əvvəlki günlük faylı bağlanıb.

Bir filename əvəzinə, bir Tcl fayl identifikatoru -open və ya birləşmə bayraqları istifadə edilə bilər. Bu spawn əmrinə bənzəyir. (Daha çox məlumat üçün spawn'a baxın.)

Açılan log qüvvələri giriş log_user əmri ilə bastırılmışdır.

Günlük olaraq, log_file komutu, bir seansta bir neçə dəfə gündüzü söndürmək və bir neçə dəfə açmağın rahatlığı üçün köhnə fayllara əlavə olunur. Faylları uzaqlaşdırmaq üçün, əlvan bayraqdan istifadə edin.

The -info bayrağı log_file verilən ən son informasiyalı argümanların təsvirini qaytarmağa səbəb olur.

log_user-info | 0 | 1
Varsayılan olaraq, göndərmək / gözləməyə dair dialoq stdout (və açıq olsa, logfile) üçün daxil edilir. Stdout-ə giriş "log_user 0" əmri ilə aradan qaldırılır və "log_user 1" ilə reenabled olunur. Günlük faylına giriş dəyişməzdir.

The -info bayrağı log_user verilən ən son informasiyalı argümanların təsvirini qaytarmağa səbəb olur.

match_max [-d] [-i spawn_id] [size]
gözləmədən istifadə edilən tamponun (baytlarda) ölçüsünü təyin edir. Heç bir ölçülü dəlil olmadan, cari ölçüsü qaytarılır.

-d bayrağı ilə, u mənim ölçüsü müəyyən edilir. (Başlanğıc default 2000'dir .) -i bayrağı ilə ölçüsü adlandırılmış spawn id üçün müəyyən edilir, əks halda mövcud proses üçün təyin edilir.

örtük [- # spawn_id] [- # spawn_id] [...] proqramı [args]
sona çatan cari Expect proqramının yerinə "proqram args" yerinə yetirir. Çıplak tire arqumenti, bir giriş kabuğu olduğu kimi komanda adının qarşısında bir tireni qüvvətləndirir. Bütün spawn_ids, argümanlar olaraq adlandırılanlar istisna olmaqla, bağlanır. Bunlar adı verilən fayl identifikatorları üzərində eşlenir.

Spawn_ids yeni proqramın devralması üçün identifikatorların faylları ilə əlaqələndirilir. Məsələn, aşağıdakı satır şahmatla məşğul olur və onu cari proses ilə idarə etməyə imkan verir - məsələn, şahmat ustası.

örtük -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id chess

Bu, "qarşılıqlı -u" dan daha səmərəli olur, lakin Gözləmə müddəti artıq nəzarətdə deyil, çünki proqramlaşdırılmış qarşılıqlı təsir imkanlarını qurban verir.

Heç bir nəzarət terminalının verilmədiyini unutmayın. Beləliklə, standart girişi ayırdığınız və ya yenidən işlədiyiniz halda, işə nəzarət edən proqramlar (kabuklar, giriş və s.) Düzgün işləməyəcəkdir.

parite [-d] [-i spawn_id] [dəyər]
bərabərliyin yaranmış proseslərin əmələ gəlməsinin və ya ləğv edilməsinin müəyyənləşdiriləcəyini müəyyən edir. Məbləğ sıfırsa, paritet ləğv edilir, aksi hallarda sökülmür. Heç bir dəyər fərqi yoxdur, cari dəyər qaytarılır.

-d bayrağı ilə, standart parite dəyəri müəyyən edilir. (Başlanğıc default 1, yəni parite ləğv edilmir.) -i bayrağı ilə parite dəyəri adlanan spawn id üçün müəyyən edilir, əks halda mövcud proses üçün təyin olunur .

remove_nulls [-d] [-i spawn_id] [value]
null nümunələri eşleme və ya gözlənilən dəyişkənlikdə və ya interact_outda saxlanmadan əvvəl nullların saxlanılan proseslərin çıxmasından və ya çıxarılmasından müəyyən edir. 1 ədəd dəyəri varsa, nulls çıxarılır. Qiymət 0 olduqda, nulls qaldırılmır. Heç bir dəyər fərqi yoxdur, cari dəyər qaytarılır.

-d bayrağı ilə, default dəyər müəyyən edilir. (Başlanğıc default 1, yəni boşluqlar silinir.) -i bayrağı ilə dəyəri adlanan spawn id üçün təyin edilir, əks halda mövcud proses üçün təyin olunur .

Nullların silinməməsi və ya silinməməsi, Gözləmələr null baytları log və stdout-a qeyd edəcəkdir.

göndərin [-flags] string
Mövcud prosesə simli göndərir. Məsələn, əmr

"salam dünyası" göndərin

simvolları, helloworld'i cari prosesə göndərir. (Tcl, özbaşına kompleks strings qura bilən bir printf- oxşar komanda ( format adlandırılır) daxildir.)

Xətt-tamponlu giriş proqramları, qayıtma xarakteri göndəriləcəyi qədər simvolları oxumamalarına baxmayaraq, simvollar dərhal göndərilir. Qaytarma xarakteri "\ r" ilə ifadə edilir.

Bayrak, növbəti dəlilləri bir bayraq deyil, simli olaraq şərh edilməsini tələb edir. Hər hansı bir simli "-" əvvəllər bir bayrağa bənzəyirmi və olmasın. Bu təsadüfən bayraqlara bənzəyir olanlar tərəfindən kəsilmədən dəyişən strillərin müəyyən edilməsi üçün etibarlı bir mexanizm təmin edir. ("-" ilə başlayan bütün simlər gələcək variantlar üçün qorunur.)

-i bayrağı, simli adlı spawn_id-ə göndərildiyini bəyan edir. Spawn_id user_spawn_id ise və terminal xam rejimindədirsə, string içərisində yeni satırlar, terminalın bişirilmiş rejimdə olduğu kimi görünəcək şəkildə, yeni line ardıcıllığına çevrilir . Çağırış bayraq bu tərcüməni aradan qaldırır.

-Null bayraq null simvol göndərir (0 bayt). Mənim cari olaraq, bir null göndərilir. Bir tamsayt , nüvələrin göndərilməsinin neçə null olduğunu göstərmək üçün null-lərini izləyə bilər.

-Xarici bayraq bir qırılma vəziyyətini yaradır. Spawn id "spawn -open" vasitəsilə açılmış bir tty cihazı aiddirsə, bu yalnız əhəmiyyətlidir. Əgər uşağınız kimi bir proses ortaya qoymuş olsanız, ara vermək üçün ucun konvensiyasından istifadə etməlisiniz.

The -s bayraq gücləri "yavaş-yavaş" göndəriləcək, beləliklə bir kompüter eyni tampondan çıxmayan bir insan üçün nəzərdə tutulmuş bir giriş tamponunu ortadan qaldıran ümumi vəziyyətdən qaçın. Bu çıxış dəyişən "send_slow" dəyəri ilə idarə olunur ki, bu da iki element siyahısını verir. Birinci element, atom göndərmək üçün bayt sayını təsvir edən bir tamsayıdır. İkinci element atomun göndərdiyi saniyələr sayını təsvir edən gerçək bir nöqtədir. Məsələn, "set send_slow {10 .001}" göndərilən hər bir 10 simvol arasında 1 millisaniyalı strings göndərmək üçün "göndərmək" -ə məcbur edəcək.

Bayraq qüvvələri əslində bir insan kimi həqiqətən yazaraq göndəriləcəkdir. Qəhrəmanlar arasında insan kimi gecikmələr görünür. (Alqoritm bir Weibull dağılımına əsaslanaraq, bu xüsusi proqrama uyğun dəyişikliklər təşkil edir.) Bu çıxış beş element siyahısına sahib olan "send_human" dəyişəninin dəyəri ilə idarə olunur. İlk iki element saniyədə ortalama interarrival karakter simvoludur. Birincisi default olaraq istifadə olunur. İkincisi, sözügedən keçidlərdə bəzən baş verən incə fasilələri simulyasiya etmək üçün söz sonlarında istifadə olunur. Üçüncü parametr dəyişkənliyin ölçüsüdür. 1 olduqca dəyişkən, 1 əsasən dəyişkən və 10 olduqca dəyişkəndir. Aşırmalar sonsuzluğa 0-dir. Son iki parametr müvafiq olaraq minimum və maksimum interarrival vaxtdır. Minimum və maksimum son istifadə edilir və son dəfə "klip" istifadə olunur. Minimum və maksimum kəmiyyətin kifayət qədər dəyərləri varsa, son orta göstərilən orta göstəricidən olduqca fərqlənə bilər.

Bir nümunə olaraq, aşağıdakı komanda sürətli və ardıcıl bir typist emulates:

send_human {.1 .3 1 .05 2} göndər -h "Mən açım, yemək yeyək."

aşağiyyətdən sonra aşağıdakılar daha uyğun ola bilər:

send_human {.4.4 .2 .5 100} göndər -h "Goodd partiya gecə gecəsi!"

Səhvlər düzəldilməməsinə baxmayaraq, səhv düzəldilməsi vəziyyətləri özünüzü göndərin və səhvləri və düzəlişləri göndərin.

Null simvol göndərmək üçün bayraqlar, ara vermək üçün, yavaş çıxışı və insan tərzi çıxışı üçün qarşılıqlı olaraq seçilirlər. Yalnız sonuncu bir istifadə ediləcək. Bundan əlavə, null simvol və ya fasilə göndərmək üçün bayraqlarla heç bir string arqumenti göstərilə bilməz.

Bir gözləntiyə görə bir prosesə ilk göndərmədən əvvəl yaxşı bir fikirdir. prosesi başlamağı gözləməyəcək, göndərə bilməyəcək. Xüsusilə, proses başlamazdan əvvəl ilk göndərmə tamamlanarsa, məlumatların gözardı edilməməsi riski vardır. Etkileşimli proqramların ilkin təklif vermədiyi hallarda, gecikmə ilə göndərildikdən əvvəl belə ola bilər:

# Hacker'ların necə pozulacağına dair göstərişlər verməməsi üçün # bu sistem xarici bir parol istəmir. # Exec'in spawn telnet tamamlanması üçün 5 saniyə gözləyin. Very.secure.gov yuxu 5 parol göndərin

exp_send göndərmək üçün bir aliasdır . Tk mühitində Expectk və ya Beklentinin başqa bir variantını istifadə edirsinizsə, göndərin Tk tərəfindən tamamilə fərqli bir məqsədlə təyin olunur. exp_send ətraf mühit arasında uyğunluq təmin edilir. Digər Beklentinin digər göndərmə əmrləri üçün də oxşar adlar təqdim edilir.

send_error [-flags] string
göndərmə kimi deyil, istisna deyil ki, çıxış hazırda prosesdən çox stderrə göndərilir.

send_log [-] simli
heç bir günlük faylı açıq deyilsə, arqumentlər yalnız log faylına göndərilir (bax log_file .).

send_tty [-flags] simli
göndərmə kimi deyil, istisna deyil ki, çıxış hazırda mövcud prosesdən çox / dev / tty- ə göndərilir.

send_user [-flags] string
göndərmə kimi deyil, istisna deyil ki, çıxış bu prosesdən çox stdout-a göndərilir.

yatmaq saniyə
skriptin saniyə saniyə üçün yatmasına səbəb olur. Saniyələr decimal ədədi ola bilər. Expectk istifadə edərkən kəsilmə (və Tk hadisələri) isə Beklentilər yatarkən işlənir.

spawn [args] proqramı [args]
"proqram args" işləyən yeni bir proses yaradır. Onun stdin, stdout və stderr Beklentiyə bağlıdır, belə ki, onlar digər Bekleme əmrləri ilə oxumaq və yazıla bilərlər. Bağlantı yaxındır və ya proses özü hər hansı bir fayl identifikatorunu bağlayır.

Bir proses spawn tərəfindən başlandığında, dəyişən spawn_id bu prosesə toxunan bir təsvirə təyin edilir. Spawn_id tərəfindən təsvir edilən proses " cari proses " hesab olunur. Spawn_id işə nəzarət təmin edən oxumaq və ya yazıla bilər.

user_spawn_id , istifadəçiyə aid olan bir təsviri olan qlobal dəyişəndir. Məsələn, spawn_id bu dəyərə təyin edildikdə, expect_user kimi davranırlar.

. Error_spawn_id , standart səhv aid olan bir təsviri olan bir qlobal dəyişəndir. Məsələn, spawn_id bu dəyərə təyin edildikdə, send_error kimi davranış göndərin .

tty_spawn_id , / dev / tty ünvanına aid olan bir təsviri olan qlobal dəyişəndir. Əgər / dev / tty (cron, at və ya batch skriptində) mövcud deyilsə, tty_spawn_id müəyyən edilmir. Bu kimi test edilə bilər:

əgər {[info vars tty_spawn_id]} {# / dev / tty var} else {# / dev / tty mövcud deyil, ehtimal cron, batch və ya script}

spawn UNIX prosesi idini qaytarır. Əgər proses bitmirsə, 0 qaytarılır. Dəyişən spawn_out (kölə, ad) pty kölə qurğusunun adına təyin edilir.

Varsayılan olaraq, spawn komanda adını və arqumentlərini əks etdirir. -Nejo bayrağı buğdanı vermir.

Möhkəm bayraq konsol çıxışının yarılma prosesinə yönəldilməsinə səbəb olur. Bütün sistemlərdə bu dəstəklənmir.

Daxili olaraq, spawn bir pty istifadə edir, istifadəçinin tty ilə eyni şəkildə başlamışdır. Bu, bütün parametrlərin "ağıl" (stty (1) görə) üçün başlanğıcdır. Dəyişən stty_init müəyyən edildikdə, daha çox konfiqurasiya kimi stty arqumentlərinin tərzində şərh edilir. Məsələn, "set stty_init raw" daha çox tükənən prosesin terminallarının ham rejimində başlamasına səbəb olacaq. -nottycopy istifadəçinin tty əsasında başlanğıcını atlayır. -nottyinit "sane" başlanğıcını atlayır.

Normalda, spawn həyata keçirmək üçün az vaxt tələb edir. Çox əhəmiyyətli miqdarda zaman ayırdığınızı görürsünüzsə, ehtimalla çürümüş ptys ilə qarşılaşırsınız. Çıldırdıqları proseslərlə dolanmaqdan qaçınmaq üçün bir sıra testlər keçirilir. (Bunlar hər bir pte üçün 10 saniyə çəkirlər). -d variantında Running Expect (Gözləməyin Beklentisi), Beklentinin tək bir vəziyyətdə bir çox ptys ilə qarşılaşdıqda göstərəcəkdir. Bu ptys bağlı olan prosesləri öldürmək mümkün deyilsə, təkrar müraciətiniz yenidən başladın.

Proqram exec (2) başarısız olduğundan uğursuz olursa, (məsələn, proqram mövcud deyildirsə), növbəti qarşılıqlı bir səhv mesajı geri qaytarılacaq və ya proqramın işlədiyi kimi əmr gözləyin və səhv mesajını çıxdıqda çıxarın. Bu davranış spawn tətbiqinin təbii nəticəsidir. Daxili olaraq, spawned prosesinin spawn_id vasitəsilə kommunikasiya istisna olmaqla, orijinal Gözləmə prosesi ilə ünsiyyət qurma yolunun olmamasıdır.

Açılmış bayraq, növbəti arqumentin bir Tcl faylı identifikatoru (yəni, açıq olaraq qaytarıldığı) kimi şərh edilməsinə səbəb olur. Spawn id daha sonra spawned bir proses kimi istifadə edilə bilər. (Fayl identifikatoru artıq istifadə edilməməlidir). Bu, xti qurğuları, faylları və boru kəmərlərini pty istifadə etmədən spawned proseslər kimi müalicə etməyə imkan verir. 0 əlaqəli bir proses olmadığını göstərmək üçün geri qaytarılır. Çıxarılan prosesə bağlı olan bağlandıqda, Tcl fayl identifikatoru belədir. Theaveaveen bayrağına bənzəyirlər, istisna olmaqla, alaveaveen fayl identifikatorunun spawn id bağlanıldıqdan sonra açıq olmasına səbəb olur.

Boş bayraq bir pty açılmasına səbəb olur, amma heç bir proses ortaya çıxmır . 0 əlaqəli bir proses olmadığını göstərmək üçün geri qaytarılır. Spawn_id adi olaraq müəyyən edilir.

Değişken spawn_out (slave, fd), pty slave'e uyğun bir fayl tanıtıcısına ayarlanır . Bu "yaxın bağlama" istifadə edərək bağlana bilər.

- Dəyişən bayraq süni prosesdə nəzərə alınmayacaq bir siqnal verir. Əks halda, siqnallar default davranışı alır. Hər bir siqnal ayrı bir bayraq tələb etməsi istisna olmaqla, siqnallar tələyə əmrindədir.

strace səviyyəsi
icra edilməzdən əvvəl yazılı bəyanatlara səbəb olur. (Tcl-nin iz komanda dəyişənləri izləyir) səviyyəsində zəng yığınında izlənmənin nə qədər aşağı olduğu göstərilir. Məsələn, aşağıdakı komanda zənglərin ilk 4 səviyyəsini izləyərkən Gözləyin , lakin bunlardan heç biri yoxdur.

gözləyin -c "strace 4" script.exp

The -info bayrağı, verilmiş ən son informasiyalı argümanların təsvirini geri qaytarmağa səbəb olur.

stty args
xarici stty əmrinə oxşar terminal rejimi dəyişir.

Varsayılan olaraq, nəzarət terminalı əldə edilir. Digər terminallara əmr nəticəsində statusun qaytarılması üçün sorğular əlavə edilə bilər. Heç bir status tələb olunmur və nəzarət terminalına çatılmırsa, xam və eko atributlarının əvvəlki vəziyyəti sonradan ola biləcək formada qaytarılır. komanda tərəfindən istifadə olunur.

Məsələn, çörək və ya pişmiş olan argumentlər terminalı xammal rejiminə qoydu. Arqumentlər - çay və ya pişirilmiş terminalı pişmiş rejimə qoydu. Dəyişikliklər echo-exo terminalı yankı və noecho rejimi uyğun olaraq.

Aşağıdakı misal, yankıların necə müvəqqəti olaraq aradan qaldırılacağını göstərir. Bu, başqa şifrələri daxil etməmək üçün avtomatik olaraq istifadə edilə bilər. (Aşağıdakı EXPECT HINTS altında daha ətraflı müzakirə baxın.)

stty -echo send_user "Şifrə:" expect_user -re "(. *) \ n" parol qoymaq $ expect_out (1, string) stty echo

sistem args
bir terminaldan bir komanda kimi yazılmış kimi girdiyi (1) giriş kimi verir. Kabuk bitməyincə gözləyin . Sh'den geri dönüş statusu, exec'in qaytarma statüsünü işlədiyini eyni şəkildə idarə edir.

Stdin və stdout-u skriptə yönəldən exec sistemindən fərqli olaraq, sistem təkrar istiqamətləndirilmir (simli ilə göstəriləndən başqa). Beləliklə, / dev / tty ilə birbaşa danışmaq üçün lazım olan proqramlar istifadə etmək mümkündür. Eyni səbəbdən, sistemin nəticələri jurnalda qeyd edilmir.

zaman damgası [args]
zaman damgasını qaytarır. Mübahisələrsiz dövrdən bəri saniyə sayını qaytarır.

-format bayraq geri qaytarılacaq, lakin strftime üçün POSIX qaydalarına uyğun olaraq əvəzedilməz bir simli təqdim edir. Məsələn,% a qısa bir iş günü adı ilə dəyişdirilir (yəni, Sat). Digərləri:

qısaldılmış həftəlik adı% A tam iş günü adı% b qısaldılmış ay adı% B tam ay adı% c tarix-zaman: Çərşənbə 6 oktyabr 11:45:56 Ayın 1993-cü il günü (01-31% H saat (00-23)% I saat (01-12)% j gün (001-366)% m ay (01-12)% M dəqiqə (00-59)% p am ya da pm% S ikinci (00-61) % u həftə (1-7, Bazar ertəsi həftənin ilk günü) U həftə (00-53, ilk bazar həftənin birinci günü) V həftə (01-53, ISO 8601 stil)% w gün (0- 6)% W həftə (00-53, birinci bazar ertəsi həftənin birinci günü)% x tarixdə olduğu kimi: Wed Oct 6 1993% X dəfə olduğu kimi: 23:59:59% y year (00-99) Y il olduğu kimi: 1993% Z zonası (və ya müəyyən edilə bilməyəcək bir şey) %% çıplak yüzdə bir işarə

Digər% spesifikasiyalar qeyri-müəyyəndir. Digər simvollar toxunmadan keçəcəkdir. Yalnız C locale dəstəklənir.

Dövrdən başlayaraq bir neçə saniyə təqdim edən ikinci bayraq, formatın hansı mənbədən istifadə ediləcəyi ilə bağlıdır . Əks halda, cari vaxt istifadə olunur.

-Gmt bayraqları GMT vaxtını istifadə etmək üçün vaxt damgası çıxışı. Heç bir bayraq olmadan, yerli vaxt zonası istifadə olunur.

tələ [[əmr] siqnalları]
verilmiş siqnalların gələcəkdə alınmasından sonra verilmiş əmrin yerinə yetirilməsinə səbəb olur. Komanda qlobal miqyasda icra edilir. Komanda olmadıqda, siqnal hərəkətləri qaytarılır. Komanda SIG_IGN düsturudursa, siqnallar nəzərə alınmır. Komut SIG_DFL simli olarsa, siqnallar sistemin default vəziyyətinə gətirilir. siqnallar tək siqnal və ya siqnalların siyahısıdır. Siqnallara görə siqnallara görə rəqəmsal və ya simvolik göstərilə bilər (3). "SIG" prefiksi istisna edilə bilər.

Heç bir dəlil (və ya argument -sənəd) olmadan, tələ hələ hazırda icra olunan tələ kodu əmrini qaytarır.

Kod kodu, komandanın başlanğıcda işə başladığı zaman Tcl-nin qaytarılacağı hər hansı bir kodun yerinə komandanın qaytarma kodunu istifadə edir.

Təqdim olunan bayraq, komanda əmr işə başladığı zaman aktiv olan tercüman vasitəsi ilə qiymətləndirilən komanda tələlərin elan ediləcəyi zaman yerinə yetirilməsinə səbəb olur.

Namizəd bayrağı, tələyə əmrinin icra edilən tələ kodu əmrinin qaytarılmasına səbəb olur.

-max bayrağı, tələyə əmrini təyin edilə biləcək ən böyük sinyal sayını geri qaytarmağa səbəb olur.

Məsələn, "trap {send_user" Ouch! "SIGINT" əmri "Ouch!" istifadəçi hər dəfə ^ C düyməsini basın.

Default olaraq, SIGINT (adətən ^ C düyməsinə basaraq yarana bilər) və SIGTERM çıxmaq üçün Gözləyin. Bu gözləməyə başlandıqda default tərəfindən yaradılmış aşağıdakı tələ ilə bağlıdır.

tələyə çıxmaq {SIGINT SIGTERM}

Hata ayıklayıcısını başlatmaq üçün -D bayrağı istifadə etsəniz, SIGINT interaktiv ayıklama qurğusunu başlamaq üçün yenidən təyin edilir. Bu aşağıdakı tələyə bağlıdır:

tələ (exp_debug 1) SIGINT

Hata ayıklayıcısının tələsi, EXPECT_DEBUG_INIT mühitin dəyişənini yeni tələ kodu ilə təyin etməklə dəyişdirilə bilər.

Əlbəttə, ssenarinizə tələyə əmrləri əlavə etməklə, həm də bunların hər ikisini məhv edə bilərsiniz. Xüsusilə, öz "trap exit SIGINT" varsa, bu hata ayıklayıcının tələini ləğv edəcək. Kullanıcıların hata ayıklayıcısına ulaşmasını engellemek isterseniz bu yararlıdır.

SIGINT üzərindəki öz tələini müəyyən etmək istəyirsənsə də, hələ də işləyərkən hata ayıklayıcısına tələsmək üçün istifadə edin:

əgər {! [exp_debug]} {trap mystuff SIGINT}

Alternativ olaraq, bəzi digər siqnalları istifadə edərək, hata ayıklayıcısına tələyə bilərsiniz.

tələyə SIGALRM üçün hərəkətin qadağan edilməsinə icazə verməyəcək, çünki bu, Gözləmələr üçün daxili olaraq istifadə olunur. Bağlantı siqnalı SIGALRM'yi SIG_IGN olaraq təyin edir (ignore). Sonrakı spawn komutları zamanı onu aradan bıraktığınız sürece bunu yeniden etkinleştirebilirsiniz.

Daha çox məlumat üçün siqnal (3) baxın.

gözləyin [args]
bitmə prosesi (və ya heç kimin adı verilmirsə, mövcud proses ) sona çatdıqdan sonra gecikir.

gözləyin normal olaraq dörd tamsayıların bir siyahısını qaytarır. Birinci tamsayı, gözlənilən prosesin pidəsidir. İkinci tamsayı müvafiq toxum ididir. Bir əməliyyat sistemi hatası meydana gəldiyində üçüncü integer -1 və ya başqa halda 0 olur. Üçüncü tamsayı isə 0 olarsa, dördüncü tamsayı - spawned prosesi tərəfindən qaytarılmış statusudur. Üçüncü tamsayı -1 olarsa, dördüncü tamsayı əməliyyat sistemi tərəfindən təyin olunan errno dəyəridir. Qlobal dəyişən errorCode da müəyyən edilir.

Əlavə elementlər dönüş dəyərinin sonunda gözləyin . İstiqamətli beşinci element bir məlumat sinifini müəyyənləşdirir. Hal-hazırda bu elementin mümkün qiyməti CHILDKILLEDdir, bu halda növbəti iki dəyər C-stilinin adı və qısa mətn təsviridir.

-i bayrağı, prosesin adını verən spawn_id (PROSİM idi deyil) uyğun olaraq gözləməsini bəyan edir. SIGCHLD işləyicisi içərisində, spawn id -1 istifadə edərək hər hansı bir yumurtalı prosesi gözləmək olar.

- Fikir bayrağını gözləyin müvəffəqiyyət gözləməsi ilə dərhal geri qayıtmaq üçün səbəb olur. Bu proses (sonradan) çıxdıqda, birbaşa gözləməyə ehtiyac olmadan avtomatik olaraq yox olacaq.

Bekleme əmri də "-i-1" dəlilini istifadə edərək forked bir prosesi gözləyin. Spawned prosesləri ilə istifadə fərqli olaraq, bu əmr istənilən vaxt icra edilə bilər. Hansı prosesin alındığına nəzarət yoxdur. Bununla belə, qaytarma dəyəri proses id üçün yoxlanılır.

KİTABXANALAR

Gözlənilən scriptlər üçün iki daxili kitabxananın avtomatik olaraq biləcəyi gözlənilir. Bunlar exp_library və exp_exec_library dəyişənlərindəki qovluqlar tərəfindən müəyyən edilir. Hər ikisi də digər skriptlər tərəfindən istifadə edilə bilən kommunal faylları ehtiva edir.

exp_library arxitektura müstəqil faylları ehtiva edir. exp_exec_library arxitektura asılı faylları ehtiva edir. Sisteminizə bağlı olaraq hər iki qovluq tamamilə boş ola bilər. $ Exp_exec_library / cat-buffers faylının mövcudluğu, / bin / cat tamponlarının default olaraq olub olmadığını təsvir edir.

PRETTY-PRINTING

Çətin tərifi olduqca çap olunmuş Gözləmə skriptləri üçün istifadə edilə bilər. Gözləməyin paylanması ilə təmin edilən vgrind tərifini düzgün olaraq quraşdırdıqda, onu aşağıdakı kimi istifadə edə bilərsiniz:

vgrind -lexpect faylı

ÖRNEKLER

Çoxlu sayda insan səhifəsinin təsvir etdiyi hər şeyi necə bir yerdə qoymaq lazım olduğu aydın deyil. Gözləməyin paylanmasının nümunə kataloqunda nümunələri oxumaq və sınamağa təşviq edirəm. Onların bəziləri real proqramdır. Digərləri sadəcə müəyyən texnika ilə izah edirlər və əlbəttə ki, bir cüt, sadəcə, tez xarakter daşıyır. INSTALL faylında bu proqramların bir xülasəsi var.

Gözlənilən sənədləri də (baxın SEÇ) də faydalıdır. Bəzi sənədlər, Expect'in əvvəlki versiyalarına uyğun olan sözdizimləri istifadə edərkən, həmin mə'lumatlar hələ də etibarlıdır və bu adam səhifəsinə baxdıqdan daha çox detallara daxil olur.

CAVEATS

Uzatmalar Beklentinin komanda adları ilə vuruşa bilər. Məsələn, göndərmək tamamilə fərqli bir məqsəd üçün Tk tərəfindən müəyyən edilir. Buna görə Expect komutlarının əksəriyyəti də "exp_XXXX" kimi təqdim olunur. "Exp", "inter", "spawn" və "timeout" ilə başlayan əmrlər və dəyişənlər, takma adları yoxdur. Ətraf mühit arasında bu uyğunluğa ehtiyac duyarsanız, genişletilmiş komanda adlarını istifadə edin.

Gözlənilmə , əhatə dairəsinin kifayət qədər liberal bir görünüşünü alır. Xüsusilə, Expect proqramına aid olan əmrlər ilə oxunan dəyişənlər ilk növbədə yerli əhatə dairəsi və qlobal miqyasda tapılmadıqda axtarılacaq. Məsələn, bu, istifadə etdiyiniz yazdığınız hər prosedurda "qlobal zamanaşımı" qoymağın zəruriliyini aradan qaldırır. Digər tərəfdən yazılan dəyişənlər həmişə yerli əhatə dairəsindədir ("qlobal" əmr verilmədiyi təqdirdə). Bunun səbəbi, spawnun bir prosedurda icra edildiyi ən ümumi problemdir. Prosedürün xaricində, spawn_id artıq mövcud deyil, belə ki, spawned prosesi artıq miqyaslama görə əlçatan deyil. Belə prosedurlara "qlobal spawn_id" əlavə edin.

Multispawning imkanını (yəni sisteminiz nə seçə bilmir) dəstəkləyir (BSD *. *), Sorğu (SVR> 2), nə də ekvivalent bir şey), Gözləmə yalnız bir zamanda bir prosesi idarə edə biləcəkdir. Bu halda, spawn_id qurmağa çalışmayın , nə də prosesləri həyata keçirərkən exec ilə prosesləri yerinə yetirməyin. Bundan əlavə, eyni anda birdən çox prosesdən (istifadəçi daxil olmaqla) birdən də gözləmək mümkün olmayacaq.

Terminal parametrləri skriptlər üzərində böyük təsir göstərə bilər. Məsələn, bir ekranda əks olunmaq üçün yazılmış bir skript varsa, yankı söndürüldükdə yanlış davranır. Bu səbəbdən, gözləyin, sane terminal parametrlərini default olaraq qüvvətləndirin. Təəssüf ki, bu digər proqramlar üçün xoşagəlməz şeylər yarada bilər. Məsələn, emacs qabığı "adi" göstəriciləri dəyişdirmək istəyir: yeni satırlar satırbaşına yeni satırlar yerinə yeni xəttlər ilə əlaqələndirilir və yankılanma əlil olur. Bu, giriş xəttini redaktə etmək üçün bir emacs istifadə etməyə imkan verir. Təəssüf ki, Gözləməyin bəlkə də bunu təxmin edə bilmərik.

Beklentiyi terminal parametrlərinin standart qəbulu ilə əvəz etməməsini tələb edə bilərsiniz, ancaq belə mühitlər üçün skript yazarkən çox diqqətli olmalısınız. Emacs halda, echoing və line-line mapping kimi şeylər asılı olaraq qarşısını almaq.

Arqumentləri qəbul edən əmrlər vahid siyahıya ( gözləyin variantları və qarşılıqlı təsir ) aid olan əmrlər siyahı həqiqətən bir arqument və ya çox olub-olmadığını müəyyən etmək üçün heuristik istifadə edir. Bu heuristik yalnız siyahıda həqiqətən birdən çox gömülü olan \ nlar arasında boşluq olmayan boşluqlar olan bir arqument əks etdirdiyində baş verə bilər. Bu kifayət qədər qeyri-qənaətbəxş görünür, ancaq "təkəbbür" mübahisəsi bir arqumentin tək bir mübahisə kimi işlənməsini məcbur etmək üçün istifadə edilə bilər. Bu, maşınla yaradılan Gözləmə kodu ilə anlaşıla bilər. Bənzər bir şəkildə, tək bir arqumentin birdən çox nümunə / hərəkət kimi işlənməsinə mane olur.

BUGS

Proqramın "cinsi" ("Smart EXec" ya da "Göndərmək-Ekspektiv" üçün) adını çəkmək həqiqətən cazibədar idi, lakin yaxşı mənada (ya da bəlkə də yalnız Puritanism) üstünlük təşkil etdi.

Bəzi sistemlərdə, bir qabıq töküldükdə, tty-ə daxil olmaq mümkün deyil, lakin hər halda çalışır. Bu sizin sisteminizin Gözləməyin bilmədiyinə nəzarət etmək üçün bir mexanizmdir. Xahiş edirəm, nə olduğunu öyrənin və bu məlumatları mənə qaytarın.

Ultrix 4.1 (ən azı buradakı ən son versiyalar) 1000000-dən yuxarı olan zaman aşımlarını 0-ə bərabər hesab edir.

Digital UNIX 4.0A (və yəqin ki, digər versiyaları) bir SIGCHLD işleyicisini təyin edərkən ptys ayırmaqdan imtina edir. Daha ətraflı məlumat üçün xahiş səhifəsinə baxın.

IRIX 6.0 pty icazələrini düzgün idarə etmir, belə ki Gözləməyin əvvəlcədən başqa bir şəxs tərəfindən istifadə edilən bir pty ayırmağa çalışması baş verə bilməz. IRIX 6.1'e yükseltin.

Telnet (yalnız SunOS 4.1.2 altında doğrulandı) TERM ayarlanmamışsa asılır. Bu, CER, TİM-də müəyyən edilməyən cgi komutlarında və ctrl altında bir problemdir. Beləliklə, onu açıq şəkildə müəyyənləşdirməlisiniz - hansı növ adətən vacib deyil. Yalnız bir şeyə ehtiyac var! Çox hallarda aşağıdakılar kifayətdir.

set env (TERM) vt100

SHELL və HOME ayarlanmadıqda İpucu (yalnız BSDI BSD / OS 3.1 i386 altında təsdiqlənir) asılır. Bu, bu mühit dəyişənlərini müəyyənləşdirməyən cron , cgicgi yazıları altında bir problemdir. Beləliklə, onları açıq şəkildə müəyyənləşdirməlisiniz - adətən hansı növə aiddir? Yalnız bir şeyə ehtiyac var! Çox hallarda aşağıdakılar kifayətdir.

env (SHELL) / bin / sh təyin set env (HOME) / usr / local / bin

Ptys'ların bəzi tətbiqləri, faylın təsvirini bağladıqdan sonra çekirdek 10-15 saniyə sonra (faktiki sayı tətbiqə bağlıdır) hər hansı bir oxunmamış çıxışı atmaq üçün nəzərdə tutulmuşdur. Beləliklə proqramları gözləyirik

Xərçəngdən 20 gün gözləyin

uğursuz olacaq. Bunun qarşısını almaq üçün, spack deyil, exec ilə qeyri-interaktiv proqramları çağırın . Bu cür hallar nəzərə çarpan olsa da, praktikada bu davranışın səbəbindən həqiqətən interaktiv proqramın yekun çıxışı ləğv ediləcək bir vəziyyətlə üzləşməmişəm.

Digər tərəfdən, Cray UNICOS ptys proses fayl təsvirini bağladıqdan dərhal sonra oxunmamış hər hansı bir çıxışı atır. Bunu Cray üçün bildirdim və bir düzeltme üzərində çalışırlar.

Bəzən tez və cavab arasında gecikmə tələb olunur, məsələn, tty interfeysi başlanğıc / stop bitlərini axtararaq UART parametrlərini dəyişdirir və ya uyğun bod nisbətlərini dəyişir. Ümumiyyətlə, bunların hamısı ikinci və ya iki dəfə yatmaqdır. Daha güclü bir texnika, donanım girişə hazır olana qədər yenidən cəhd etməkdir. Aşağıdakı misal həm strategiyaları istifadə edir:

"sürət 9600 \ r" göndərin; yuxu 1 gözləyin {timeout {göndər "\ r"; exp_continue} $ prompt}

tələ kodu, Tcl-nin hadisə loopunda oturan hər hansı bir komanda ilə işləməyəcək, məsələn, yuxu kimi. Məsələ ondadır ki, hadisə loopunda, Tcl, təkrarlanan hadisə işləyicilərindən qaytarma kodlarını ləğv edir. Bir həlli, tələ kodunda bayraq qurmaqdır. Sonra əmrdən (yəni yuxudan) sonra bayraqı yoxlayın.

Gözlənilən_yeni qrupa aid komanda əmrləri vaxtında yox edir və ümumiyyətlə zaman aşımı anlayışına malik deyildir.

& # 34; EXPECT MƏLUMAT & # 34;

Qeyri-intuitiv ola biləcək gözləmələr haqqında bir neçə şey var. Bu bölmə bir neçə təkliflə bu işlərin bir qismini həll etməyə çalışır.

Ümumi olaraq gözlədiyi problem, kabukların istəklərini necə tanıyır. Bunlar fərqli insanlar və müxtəlif kabuklar tərəfindən fərdiləşdirildikləri üçün, rlogin avtomatlaşdırma istənilən vaxt bilmədən çətin ola bilər. Ağlabatan bir konvensiya, kullanıcıların EXPECT_PROMPT ortam değişkeninde isteklerini (özellikle sonuna) izah eden bir ifadeyi saklamasını sağlamaktır. Aşağıdakı kimi kod istifadə edilə bilər. EXPECT_PROMPT mövcud deyilsə, kodun düzgün işləməsi yaxşı bir şansa malikdir.

"(% | # | \\ $) $"; # default soruşmaq {set prompt $ env (EXPECT_PROMPT)} gözləyin - $ prompt

Görməyi gözlədiyiniz hər şeyin bitməsini ehtiva edən nümunələri gözləməyə təşviq edirəm. Bu, hər şeyi görməzdən əvvəl bir sualın cavablandırılmasının qarşısını alır. Əlavə olaraq, siz onları tamamilə görməzdən əvvəl suallara cavab verə bilsəniz, erkən cavab verərsəniz, cavabınız sualın ortasında səslənir. Başqa sözlə, ortaya çıxan dialoq doğru olacaq amma qarışıq görünüşlü olacaq.

Çox istəklər sonunda bir kosmik xarakter daşıyır. Məsələn, ftp-dən istənilən 'f', 't', 'p', '>' və. Bu istək uyğun olmaq üçün, bu simvolların hər biri üçün hesab verməlisiniz. Boşluğu daxil etməmək üçün ümumi bir səhvdir. Boşluğu dəqiq şəkildə qoyun.

X şəklində bir nümunə istifadə edirsinizsə * * X sonunadək alınan bütün nəticələrə sonuncu şey uyğun gəlir. Bu intuitiv səslənir, ancaq "sonuncu şey" ifadəsi kompüterin sürətinə və I / O-ə həm də çekirdeklə və cihaz sürücüsündən asılı olaraq dəyişə bilər, çünki bir qədər qarışıq ola bilər.

Xüsusilə insanlar, proqramların çox hissəsini (atomla) gələn proqramın məhsullarını görməkdədirlər. Əvvəlki bəndin nümunəsindəki * * yalnız mövcud xəttin sonuna uyğun ola bilər, baxmayaraq ki, daha çox görünsə də, matç zamanı alınan bütün çıxış idi.

Sizin nümunəniz xüsusilə bunun üçün hesab etməyincə, daha çox məhsulun gəldiyini bilmək üçün heç bir yolu yoxdur.

Hətta line-oriented tamponlama asılı olaraq ağıllı deyil. Proqramları nadir hallarda buferləşdirmə növü barədə vədlər vermir, lakin sistem həzmləri çıxış xətlərini poza bilər ki, xətalar görünən təsadüfi yerlərdə pozulur. Beləliklə, nümunələri yazarkən tez bir zamanda sonuncu simvolları ifadə edə bilərsiniz, bunu etmək müdrikdir.

Bir proqramın son çıxışında bir nümunəni gözləyirsinizsə və proqramın yerinə başqa bir şey çıxarsa, zaman aşımı sözüyle bunu algılayamazsınız. Bunun səbəbi gözləməyəcəyi zaman deyil - bunun əvəzinə bir eof göstəricisi olacaq. Bunun əvəzinə istifadə edin. Hətta daha yaxşı, həm də istifadə edin. Bu xəttin ətrafında köçdüyünə görə, xəttin özünü düzəltməyə ehtiyac yoxdur.

Yeni satırlar, terminal sürücüsü tərəfindən çıxdıqda, adətən satırbaşına qaytarılır, linefeed sıralarına çevrilir. Beləliklə, printf ("foo \ nbar"), yəni iki xəttə uyğun bir model istəyirsinizsə, "foo \ r \ nbar" nişanını istifadə etməlisiniz.

Istifadəçidən oxuyarkən, oxşar bir tərcümə, expect_user vasitəsilə olur . Bu halda, geri qayıtdığınız zaman yeni bir satıra çevriləcəkdir. Gözləyin sonra terminini xammal rejiminə (telnet kimi) təyin edən bir proqrama keçərsə, proqramın doğru bir qaytarılması gözlədiyi bir problem olacaq. (Bəzi proqramlar əslində bağışlayırlar ki, onlar avtomatik olaraq yeni xəttləri qayıdırlar, lakin əksəriyyəti yoxdur). Təəssüf ki, bir proqram öz terminalını xammal rejiminə qoyduğunu öyrənmək üçün heç bir yol yoxdur.

Qaytarma ilə yeni xəttləri əl ilə əvəz etməmək əvəzinə, həll tarazlığı dayandıra biləcək "stty raw" əmrini istifadə etməkdir. Buna baxmayaraq, bu artıq bişirilmiş line-editing xüsusiyyətləri olmayacaq deməkdir.

qarşılıqlı olaraq termininizi xammal rejimi ilə təyin edir, beləliklə bu problem bundan sonra yaranmaz.

Beklenen skriptlərdə şifrələri (və ya digər şəxsi məlumatları) saxlamaq çox vaxt faydalıdır. Bir kompüterdə saxlanılan bir şey hər kəs tərəfindən əldə olunmasına həssas olduğundan, bu məsləhət görülmür. Beləliklə, interaktiv bir skriptdən şifrələrin istifadəsini səciyyəvi bir şəkildə yerləşdirməkdən daha ağıllı bir fikirdir. Buna baxmayaraq, bəzən bu cür yerləşdirmə tək imkanıdır.

Təəssüf ki, UNIX fayl sistemi yürütülebilir, lakin okunmaz olan skript yaratmaq üçün birbaşa yola malik deyildir. Ketgid kabuk skriptlərini dəstəkləyən sistemlər dolayı olaraq bunu aşağıdakı kimi simüle edə bilər:

Hər zamanki kimi, gizli məlumatları ehtiva edən Gözləmə skriptini yaradın. Onun icazələrini 750 (-rwxr-x ---) və etibarlı qrupun sahibi olması, yəni oxumağa icazə verilmiş bir qrupdur. Lazım gələrsə, bu məqsəd üçün yeni bir qrup yaradın. Daha sonra, əvvəlki kimi eyni qrupun sahibi olan 2751 (-rwxr-s - x) icazələri olan / bin / sh skript yaradın.

Nəticədə hər kəs tərəfindən icra edilə bilən (və oxuya bilən) bir skriptdir. Çağırıldıqda, Gözləmə skriptini işlədir.

& # 34; ayrıca bax & # 34;

Tcl (3), libexpect (3)
Donb Libes, s. 602, ISBN 1-56592-090-2, O'Reilly və Associates, 1995-ci ildə " Gözlənilənləri Gözdən keçirin: İnteraktiv Proqramların Avtomatlaşdırılması üçün Tcl-Based Toolkit" .
"Gözləyin: Donbiznesin idarə olunmasına nəzarət edən yoxsulların müalicəsi", 1990-cı ilin yayının materialları USENIX Konfransı, Anaheim, Kaliforniya, 11-15 iyun, 1990.
Don Libes, 1990-1995, Kolorado Kolorado, Kolorado Kolorado, 1990 USENIX Böyük Quraşdırma Sistemləri İdarəsi Konfransının "Sistem İdarəetmə vəzifələrini Avtomatlaşdırmağı gözləyin".
John Ousterhout, "Qış 1990-cı il USENIX Konfransı", 22-26 yanvar 1990-cı il, "Tcl: Buraxılan Bir Komanda dili". Don Libes, Computing Systems tərəfindən İnteraktiv Proqramların İdarə Edilməsi üçün Ssenari , Vol. 4 noyabr, 2 saylı, California Press Journals Universiteti, Noyabr 1991. "Donuz Libes", "1992-ci ilin yazının əsərləri", ABŞ-ın San Antonio, TX, 135-144, "Regresyon Testi və uyğunluq Testi İnteraktiv Proqramları" İyun 12-15, 1992. "Kibitz - Birgə İnteraktiv Proqramların Birləşdirilməsi", Don Libes, Software-Practice & Experience, John Wiley & Sons, West Sussex, İngiltərə, Vol.

23, № 5, May, 1993. Don Libes tərəfindən 1993-cü il, Tcl / Tk Çalıştayı, Berkeley, CA, 10-11 iyun 1993-cü ildə "Tcl Başvuruları üçün Debugger".

AUTHOR

Don Libes, Standartlar və Texnologiya Milli İnstitutu

TƏQDİM EDİLMƏSİ

Tcl üçün John Ousterhout və ilham üçün Scott Paisley sayəsində. Beklentinin autoconfiguration koduna Rob Savoye sayəsində.

TARİXİ fayl sənədlərin çoxu gözləməkdədir . Bu maraqlı oxu və bu proqram üçün daha çox fikir verə bilər. Burada xatırlatmaları göndərən adamlara təşəkkür edirəm və digər yardımlar verdim.

Gözləmənin dizaynı və həyata keçirilməsi qismən ABŞ hökuməti tərəfindən ödənilmişdir və buna görə də ictimai sahədədir. Bununla birlikdə yazar və NIST, bu proqram və sənədlərin və ya onların bir qismini istifadə edildikdə kredit istəyə bilər.