Linux / Unix Command Expect

Nyana minangka program sing ngobrol karo program interaktif liya miturut skrip. Nderek script, Nganti ngerti apa sing bisa diarepake saka program lan apa respon sing bener kudu. Basa sing dianggep menehi struktur pangepungan lan dhuwur kanggo ngarahake dialog kasebut. Kajaba iku, pangguna bisa njupuk kontrol lan sesambungan langsung nalika dikarepake, sawise bali kontrol menyang script.

Expectk minangka campuran saka Expect and Tk. Iku dumadakan kaya pengin Expect and Tk. Nyana uga bisa digunakake langsung ing C utawa C ++ tanpa Tcl.

Jeneng "Expect" asalé saka gagasan ngirim / nyedhaki urutan sing popularized dening uucp, kermit lan program kontrol modem liyane. Nanging ora kaya uucp, Expect digeneralisasi supaya bisa mlaku minangka command level pangguna karo program lan tugas sing ana ing pikiran. Nyuwun bisa ngomong karo pirang-pirang program sekaligus.

Apa Expect Can Do

Contone, ana sawetara perkara sing bisa dideleng:

Ana macem-macem alesan kenapa cangkang ora bisa nindakake tugas kasebut. Kabeh bisa dikarepake.

Umumé, Nyina bisa migunani program sing mbutuhake interaksi antarane program lan pangguna. Kabeh sing perlu yaiku interaksi kasebut bisa ditondoi kanthi cara pemrograman. Nyedhaki uga menehi kontrol maneh marang pangguna tanpa nyegah program sing dikontrol. Kajaba iku, pangguna bisa ngowahi kontrol marang naskah ing sembarang wektu.

Dianggo

Nyana maca cmdfile kanggo dhaptar perintah kanggo ngeksekusi. Ngarep-arep bisa dijupuk kanthi implisit ing sistem sing ndhukung #! notasi kanthi menehi tandha script minangka executable lan nggawe baris pisanan ing naskah:

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

Mesthine, path kudu kanthi jelas njlèntrèhaké panggonan sing dikarepake. / usr / local / bin namung conto.

Bendhelan-c ngandhut pandhuan supaya bisa dieksekusi sadurungé ana ing skrip. Perintah kasebut kudu dikutip kanggo nyegah pecah dening cangkang. Pilihan iki bisa digunakake kaping pirang-pirang. Sawetara perintah bisa dileksanakake kanthi siji-c kanthi pamisahan kasebut kanthi titik koma. Pandhuan dieksekusi ing urutan kasebut. Nalika nggunakake Expectk, pilihan iki kasebut minangka-koma.

Bendhelan -d ngidinake sawetara output diagnostik, sing utamané nglaporake aktivitas internal saka perintah kayata nyangka lan sesambungan. Gendéra iki duwé éfék sing padha karo "exp_internal 1" ing awal skrip Ekspektasi, ditambah versi Expect sing dicithak.

Bendera -D ngidini debugger interaktif. Nilai integer kudu diikuti. Debugger bakal njupuk kontrol sadurunge prosedur Tcl sabanjure yen nilai kasebut non-nol utawa yen ^ C ditekan utawa breakpoint kacet, utawa printah debugger liyane sing katon ing naskah. Nalika nggunakake Expectk, pilihan iki kasebut minangka - Debug.

Bendhelan -f ngganti file sing diwiwiti kanggo maca perintah. Gendéra dhewe opsional amarga mung migunani nalika nggunakake #! notasi, supaya argumen liyane bisa diwenehake ing baris perintah. Nalika nggunakake Expectk, pilihan iki kasebut minangka file.

Secara default, file printah diwaca ing memori lan dieksekusi kabeh. Sampeyan sok-sok dienggo kanggo maca file siji baris ing siji wektu. Kanggo nggeroake file-file sing sewenang-wenang kanggo ditangani kanthi cara iki, gunakake flag -b. Nalika nggunakake Expectk, pilihan iki kasebut minangka -buffer.

Yen senar "-" diwenehake minangka jeneng filen, input standar diwaca. Gunakake "./-" kanggo maca saka file sing bener jenenge "-".

Bendhelan -i nimbulake Expect kanggo mlebu interaksi kanthi prentah tinimbang maca file kasebut. Prompting diakhiri liwat perintah metu utawa marang EOF. Bendera -i dianggep menawa ora ana file printah utawa -c digunakake. Nalika nggunakake Expectk, pilihan iki kasebut minangka -interaktif.

- bisa dipigunakaké kanggo mbatasi pungkasan opsi. Iki migunani yen sampeyan pengin ngliwati argumentasi pilihan-kaya menyang skrip tanpa diinterpretasikake dening Nyana. Iki bisa migunani ing #! baris kanggo nyegah interpretasi kaya-kaya dening Expect. Contone, ing ngisor iki bakal ninggalake argumen asli kalebu jeneng skrip ing argv variabel.

#! / usr / local / bin / expect -

Elinga yen getopt biasa (3) lan eksekusi (2) konvensi kudu diamati nalika nambah argumen menyang #! baris.

File $ exp_library / expect.rc bakal otomatis sumberna yen saiki, kajaba flag -N sing digunakake. (Nalika nggunakake Expectk, opsi iki ditemtokake minangka -NORC.) Sakcepete sawise iki, berkas ~ / .expect.rc bakal sumber otomatis, kajaba flag -n sing digunakake. Yen lingkungan variabel DOTDIR ditetepake, diolah minangka direktori lan .expect.rc diwaca saka ing kana. Nalika nggunakake Expectk, pilihan iki kasebut minangka -norc. Iki sumber mung dumadi sawise ngeksekusi bendera -c.

-v nimbulaké Nyana kanggo nyithak nomer versi lan metu. Bendera sing cocog ing Expectk, sing nggunakake jeneng gendéra dawa, yaiku -versi.

Pilihan args didhekake menyang dhaptar lan disimpen ing variabel sing dijenengi argv lan. argc wis diinisialisasi nganti dawa argv.

Argv0 didefinisine minangka jeneng naskah utawa binary yen ora ana naskah sing dipigunakaké. Contone, ing ngisor iki printah jeneng naskah lan telung argumen kapisan:

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

Prentah

Nyedhak nggunakake Tool Command Language. Tcl menehi kontrol aliran (yen, kanggo, break), expression evaluasi lan sawetara fitur liyane kayata recursionand definisi prosedur. Perintah sing dipigunakaké ing kene nanging ora ditetepake (set, yèn, exec) iku perintah Tcl. Ngarepake ndhukung tambahan perintah. Kajaba sing kasebut, printah mbatalake string kosong.

Perintah disusun miturut abjad supaya bisa ditemokake kanthi cepet. Nanging, pangguna anyar bisa luwih gampang diwiwiti kanthi maca deskripsi ngasilake, ngirim, nyana, lan sesambungan, ing urutan kasebut.

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

nutup sambungan menyang proses saiki. Paling program interaktif bakal ndeteksi EOF ing stdin lan metu; saéngga cedhak biasane cukup kanggo mateni proses kasebut uga. Gendéra-i nyatakaké proses kanggo nutup cocog karo jeneng spawn_id.

Loro-lorone nyedhak lan sesambungan bakal ndeteksi nalika proses saiki metu lan sacara implisit nutup, nanging yen sampeyan mateni proses , ngomong, "exec kill $ pid", sampeyan kudu kanthi tegas nelpon .

Bendhelan-ajixt nemtokake manawa idjarane wis ditutup ing proses pangolahan anyar utawa yen proses wis ditunggangi. Kanggo ninggalake id sing diuncalake, gunakake nilai 0. Nilai integer non-nol bisa ngasilake spawn ing sembarang proses anyar.

Bendera alun-alun nutup budak sing digandhengake karo id ngasilake. Nalika sambungan ditutup, budak ditutup kanthi otomatis nalika mbukak.

Ora ketompo yen sambungan ditutup kanthi implisit utawa tegas, sampeyan kudu nelpon tunggu kanggo ngosongake slot proses kernel sing cocog. Printah cedhak ora nunggu ngenteni amarga ora ana jaminan sing nutup sambungan proses bakal nimbulake.

debug [[-now] 0 | 1]

ngontrol debugger Tcl ngijini sampeyan ngliwati statements lan nyetel breakpoints.

Tanpa argumen, 1 bakal dikembalikan menawa debugger ora mlaku, mula ora ana 0 sing dikembalikan.

Kanthi 1 argumentasi, debugger diwiwiti. Kanthi argumen 0, debugger mandheg. Yen argumen 1 didhisiki dening bendera saiki, debugger diwiwiti kanthi cepet. Yen ora, debugger diwiwiti karo statement Tcl sabanjure.

Perintah debug ora ngganti jebakan apa wae. Mbandhingake iki kanggo miwiti Nyana karo -D flag.

Pandhuan nyopot dicopot proses kabir saka terminal . Iku terus mlaku ing latar mburi. Proses kasebut diwenehi klompok proses dhewe. Standar I / O dialihake menyang / dev / null .

Potongan ing ngisor iki nggunakake pedhot sambungan kanggo terus mlaku ing latar mburi.

yen {[fork]! = 0} metu saka sambungan. . .

Tulisan ngisor iki maca sandhi lan banjur nganggo program saben jam sing nggunakake sandhi saben wektu wis lumaku. Tulisan iki nyedhiyakake sandhi supaya sampeyan mung kudu ngetik.

send_user "sandhi? \" expect_user -re "(. *) \ n" kanggo {} 1 {} {if fork]! = 0} 1, senar) \ r ". . . metu}

Keuntungan kanggo nggunakake dicabut ing babagan fitur proses asynchronous shell (&) yaiku sing Nyegah bisa nyimpen paramèter terminal sadurunge pemotongan lan banjur diterapaké ing pangkat anyar. Kanthi &, Nganti ora duwe kasempatan kanggo maca paramèter terminal wiwit terminal wis dicopot kanthi wektu Nyedhak bakal nampi kontrol.

metu [-opts] [status]

nyebabake Nyedhaki utawa metu nyiapake.

Bendera- axit nyebabake argumentasi sabanjure digunakake minangka pandhuan metu. Tanpa pitakonan, pandhuan metu saiki wis bali.

Bendera -noexit nyebabake Nyedhiyakake kanggo nyiapake kanggo metu nanging mungkasi cendhak kontrol sing bener bali menyang sistem operasi. Pandhuan metu saka pangguna wis diatur lan uga penangan internal dhewe. Ora ana perintah sing Nyedhiyakake maneh kudu dieksekusi. Iki migunani yen sampeyan mlaku Nyana karo ekstensi Tcl liyane. Interpreter saiki (lan jendhela utama yen ing lingkungan Tk) tetep supaya ekstensi Tcl liyane bisa ngresiki. Yen ekspansi kasebut diarani maneh (Nanging iki bisa kedadeyan), penangan ora nyepetake.

Sawise metu, kabeh sambungan kanggo mroduksi proses wis ditutup. Penutupan bakal dideteksi minangka EOF dening proses pangolahan. metu ora njupuk tumindak liyane sing ngluwihi apa prosedur _exit (2) normal ora. Mangkono, pangolahan sing ora mriksa EOF bisa terus dilakoni. (Ana macem-macem kahanan sing penting kanggo nemtokake, umpamane, apa sinyal sing bakal diproses bakal dikirim, nanging iki gumantung saka sistem, biasane didokumentasikan metu ing (3).) Proses pangolahan sing terus dilireni bakal diwenehi panas.

status (utawa 0 yen ora kasebut) wis dibaleni minangka status metu saka Expect . metu kasebut secara implisit dileksanakake yen pungkasan script wis tekan.

exp_continue [-continue_timer]
Exp_continue perintah ngidini nyana dhewe kanggo terus ngeksekusi tinimbang ngasilake kaya biasa. Kanthi standar exp_continue nampilake timer wektu entek. Bendera -continue_timer ngalangi wektu supaya ora diwiwiti maneh. (Waca nyuwun informasi liyane.)

exp_internal [-f file] value
nyebabake printah luwih lanjut kanggo ngirim informasi internal diagnostik menyang Expect to stderr yen nilai non-nol. Output iki dipateni yen nilai 0. Informasi diagnostik kalebu saben karakter sing ditampa, lan saben nyoba digawe kanggo cocog output saiki marang pola.

Yen file pilihan diwenehake, kabeh output normal lan debugging ditulis kanggo file kasebut (tanpa kaprigelane nilai kasebut ). Saben file output diagnostik sadurunge ditutup.

Ing -info flag nyebabake exp_internal kanggo bali menyang deskripsi argumen non-info paling anyar sing diwenehake.

exp_open [args] [-i spawn_id]
ngasilake pengenal berkas Tcl sing cocog karo id ngasilake asli. Pengenal file kasebut bisa digunakake minangka yen dibukak dening printah mbukak Tcl. (Ing spawn id ora digunakake maneh. Ngenteni ora kudu dileksanakake.

Bendhelan- godhongé ijo mbukak id ngasilake kanggo ngakses liwat pituduh Pangarepan. Tunggu kudu dieksekusi ing id ngasilake.

exp_pid [-i spawn_id]
ngasilake id proses sing cocog karo proses sing saiki diasilake. Yen bendera -i digunakake, pid bali cocog karo id ngasilake sing diwenehake.

exp_send
yaiku alias kanggo ngirim .

exp_send_error
yaiku alias kanggo send_error .

exp_send_log
yaiku alias kanggo send_log .

exp_send_tty
yaiku alias kanggo send_tty .

exp_send_user
yaiku alias kanggo send_user .

exp_version [[-exit] version]
migunani kanggo njamin yen skrip kompatibel karo versi saiki Expect.

Tanpa argumen, versi Expect saiki bakal dikembalikan. Versi iki bisa dikodekan ing skrip sampeyan. Yen sampeyan ngerti, yen sampeyan ora nggunakake fitur versi anyar, sampeyan bisa nemtokake versi sadurungé.

Versi kalebu telung nomer sing dipisahake karo titik-titik. Pisanan nomer utama. Aksara sing ditulis kanggo versi Nganti karo nomer utama sing beda mesthi ora mesthi ora bisa. exp_version ngasilake kesalahan yen nomer utama ora cocog.

Kapindho yaiku nomer suntingan. Script sing ditulis kanggo versi sing luwih cilik tinimbang versi saiki bisa gumantung ing sawetara fitur anyar lan ora bisa mbukak. exp_version ngasilake kesalahan yen angka-angka utama cocog, nanging jumlah suntingan script luwih gedhe tinimbang sing nyinaoni mlaku.

Katelu minangka nomer sing ora ana bagian ing comparison versi. Nanging, iki tambah nalika distribusi piranti lunak Expect diganti ing sembarang cara, kayata kanthi dokumentasi tambahan utawa optimasi. Reset kanggo 0 marang saben versi suntingan anyar.

Kanthi flag -exit , Expect prints error lan exits yen versi wis kedaluwarsa .

ngarepake [[-open] pat1 body1] ... [-opts] patn [bodyn]
ngenteni nganti salah sawijining patron cocog karo proses proses produksi, wektu wektu sing wis ditemtokake, utawa pungkasan file. Yen awak final kosong, bisa ditolak.

Pola saka command_expression paling anyar sing dipigunakaké sacara implisit sadurunge ana pola liya. Pola saka perintah expect_after paling anyar sing digunakaké sacara implisit sawisé pola liya.

Yen argumen kanggo kabeh statement nyuwun mbutuhake luwih saka siji baris, kabeh argumine bisa "disambungan" dadi siji supaya ora bisa ngatasi saben baris kanthi backslash. Ing kasus siji iki, substitusi Tcl biasa bakal kedadeyan senadyan kandhutan.

Yen pola iku tembung kunci, awak sing gegandhengan dieksekusi ing pungkasan file. Yen pola punika wektu entek kata kunci, awak sing gegandhengan dieksekusi sak wektu entek. Yen ora ana tembung kunci wektu sing dipigunakaké, sawijining tindakan kosong implisit dileksanakake sawisé wektu tundha. Periode wektu sing standar wektu 10 detik nanging bisa disetel, contone nganti 30, kanthi printah "nyetel wektu entek 30". Timeout tanpa wates bisa ditunjuk dening nilai -1. Yen pola minangka default tembung kunci, awak sing gegandhengan dieksekusi ing wektu entek utawa pungkasan.

Yen pola cocog, awak sing cocog dileksanakake. nyarepake ngasilake asil awak (utawa senar kosong yen ora ana pola sing cocog). Ing acara sing pirang-pirang pola cocog, sing katon pisanan digunakake kanggo milih awak.

Saben output anyar teka, dibandhingake karo pola saben urutan kasebut. Mangkono, sampeyan bisa nyoba kanggo ora ana pertandhingan kanthi nggawe pola pungkasan sing bakal dijamin, kayata pituduh. Ing kahanan sing ora ana pituduh, sampeyan kudu nggunakake wektu entek (kaya sampeyan bakal yen sampeyan sesambungan kanthi manual).

Pola kasebut kasebut kanthi telung cara. Secara default, pola kasebut minangka perintah match match Tcl. (Pola kaya iki uga padha karo ekspresi reguler C-shell sing biasa kasebut minangka pola "glob"). Gendéra-flag bisa digunakna kanggo nglindhungi pola sing bisa uga cocog karo panji-panji sing diarepake . Sembarang pola sing diwiwiti karo "-" kudu dilindhungi kanthi cara iki. (Kabeh rentenir sing diawali karo "-" disusun kanggo opsi mangsa ngarep.)

Contone, fragmen ing ngisor iki katon kanggo mlebu log sing sukses. (Elinga yen mbatalake dianggep minangka prosedur sing ditemtokake ing panggon liya ing naskah kasebut.)

ngarepake {sibuk {nanggo sibuk \ n; exp_continue} gagal ngilangi "kata sandi sing sah" ora sah wektu abort disambungake}

Kutipan sing perlu ing pola kaping papat amarga ngemot spasi, sing bakal misahake pola kasebut saka tindakan. Pola karo tindakan sing padha (kayata kaping 3 lan kaping 4) kudu nggawe maneh tindakan kasebut. Iki ora bisa digunakake kanthi nggunakake pola regexp (ndeleng ngisor). Informasi luwih lengkap babagan mbentuk pola gaya glob bisa ditemokake ing manual Tcl.

Pola gaya regexp ngetutake sintaks sing ditemtokake dening regexp Tcl (cendhak kanggo "ekspresi reguler"). pola regexp dienal karo flag -re . Conto sadurunge bisa ditulis ulang nggunakake regexp minangka:

ngarepake {sibuk {nanggo sibuk \ n; exp_continue} -re "gagal | tembung sandhi ora bener" mbatalake wektu tundha disambungake}

Loro jinis pola kasebut "unanchored". Iki tegese pola ora kudu cocog karo kabeh string, nanging bisa miwiti lan ngakhiri pertandhingan ing ngendi wae ing senar (anggere kabeh cocok liyane). Gunakake ^ kanggo cocog awal string, lan $ kanggo cocog karo mburi. Elinga manawa sampeyan ora ngenteni akhire senar, tanggapan sampeyan bisa gampang nempuh ing tengah senar kaya sing diarani saka proses sing diwenehake. Nalika isih ngasilake asil sing bener, output bisa katon ora wajar. Mangkono, panggunaan $ didhukung yen sampeyan bisa nemtokake karakter ing mburi senar.

Elinga yen ing akeh editors, ^ lan $ cocog karo baris awal lan pungkasan. Nanging, amarga ora ngandut ora diarani baris, karakter kasebut cocog karo awal lan pungkasan data (minangka lawan garis) saiki ing penyangga pencocokan sing dikarepake. (Uga, waca cathetan ing ngisor iki "sistem pencernaan.")

Ing -ex gendéra nyebabake pola kasebut dicocogake minangka senar "pas". Ora ana interpretasi *, ^, etc digawe (senadyan konvensi Tcl biasanipun isih kudu diamati). Pola eksak tansah unanchored.

Bendera- bendera nyebabake karakter gedhe saka output kanggo mbandhingake kaya-kaya karakter huruf cilik. Pola ora kena.

Nalika maca output, luwih saka 2000 byte bisa meksa bita sadurunge dadi "lali". Iki bisa diganti karo match_max fungsi. (Elinga yen nilai sing gedhe banget bisa ngendhegake matcher pola.) Yen patlist wis full_buffer , awak sing gegandhengan dieksekusi yen byte match_max wis ditampa lan ora ana pola liya sing cocok. Apa tembung kunci full_buffer digunakake, karakter sing wis dilupakan ditulis kanggo expect_out (buffer).

Yen patlist minangka tembung kunci buncis , lan nulls diwenehake (liwat printah remove_nulls ), awak sing gegandhengan dieksekusi yen ASCII 0 siji cocok. Ora bisa cocog 0 byte liwat pola glob utawa regexp.

Upamane cocog karo pola (utawa eof utawa full_buffer), output sing cocog karo sing ora cocog bakal disimpen ing variable expect_out (penyangga) . Cocog kanggo 9 cocog subdomain regexp disimpen ing variabel expect_out (1, senar) liwat expect_out (9, senar) . Yen flag -indices digunakake sadurunge pola, indeks wiwitan lan pungkasan (ing wangun sing cocok kanggo lrange ) saka 10 senar disimpen ing variabel expect_out (X, wiwitan) lan expect_out (X, end) ngendi X minangka digit, cocok karo posisi substring ing buffer. 0 nuduhake strings sing cocog karo pola kabeh lan digawe kanggo pola glob uga pola regexp. Contone, yen proses wis ngasilake output saka "abcdefgh \ n", asil saka:

nyana "cd"

minangka kaya ing ngisor iki:

set expect_out (0, string) cd set expect_out (buffer) abcd

lan "efgh \ n" ditinggalake ing buffer output. Yen proses ngasilake output "abbbcabkkkka \ n", asil saka:

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

minangka kaya ing ngisor iki:

set expect_out (0, wiwitan) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, end) 3 set expect_out (1, (2, wiwitan) 10 set expect_out (2, pungkasan) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

lan "a \ n" ditinggalake ing buffer output. Pola "*" (lan -re ". *") Bakal ngilangke buffer output tanpa maca output luwih saka proses kasebut.

Biasane, output sing dicocogake dibuwang saka panyimpenan internal Expect. Iki bisa dicegah dening prefixing pola karo flag -notransfer . Gendéra iki utamané migunani ing eksperimen (lan bisa disingkat menyang "-not" kanggo gampang nalika nyoba).

Id ngasilake sing gegandhengan karo output sing cocog (utawa eof utawa full_buffer) disimpen ing expect_out (spawn_id) .

Bendhelan - waktuout kasebut nyebabake perintah nyana saiki kanggo nggunakake nilai ing ngisor iki minangka timeout tinimbang nggunakake nilai variabel timeout.

Kanthi gawan, pola cocog karo output saka proses saiki, nanging flag -i ngandharake output saka dhaptar spawn_id sing bakal dicocogake marang pola kasebut (nganti -i ). Daftar spawn_id kudu dadi spasi sing dipisahake whitespace spawn_ids utawa variabel sing ngrujuk dhaptar spawn_ids kasebut.

Contone, tuladha ing ngisor iki minangka "disambungake" saka proses saiki, utawa "sibuk", "gagal" utawa "ora sah tembung sandi" saka spawn_id sing dijenengi $ proc2.

nyana {-i $ proc2 busy {puts sibuk \ n; exp_continue} -re "gagal | tembung sandhi ora bener" mbatalake wektu tundha disambungake}

Nilai variabel global any_spawn_id bisa dipigunakaké kanggo nggayuh pola marang spawn_ids sing dijenengi karo bendha- bendera liya ing pangarepan saiki. Spawn_id saka gendera -i sing ora ana pola sing digandhengake (ie, banjur diterusake kanthi liya -i ) digawe kasedhiya kanggo pola apa wae ing perintah sing padha karo sing ana hubungane karo any_spawn_id.

Bendera -i bisa uga jeneng variabel global, sing bakal dibayarke variabel kanggo daftar uwong sing mbingungake. Variabel wis dibukak maneh nalika ngganti. Iki menehi cara ngganti sumber I / O nalika perintah ing eksekusi. Id sing dienggo diwenehi cara iki diarani id sing diarani "ora langsung".

Tindakan kayata break lan terus nyebabake struktur kontrol (ie, kanggo , proc ) kanggo nindakake kanthi cara sing biasa. Exp_continue perintah ngidini nyana dhewe kanggo terus ngeksekusi tinimbang ngasilake kaya biasa.

Iki migunani kanggo ngindhari puteran sing nyata utawa bola-bali ngarepake statements. Conto iki minangka bagéan saka fragmen kanggo ngotomatisasi rlogin. Exp_continue ngindhari kudu nulis statement pangarep -arep sing kapindho (kanggo nggoleki pituduh kasebut maneh) manawa tembung kasebut bisa diarani tembung sandhi.

nyana {Sandi: {stty -echo send_user} kanggo $ user ing $ inang: "expect_user -re" (. *) \ n "send_user" \ n "send" $ expect_out (1 string) echo exp_continue} salah {send_user "sandhi sing bener utawa akun \ n" metu} wektu tunda {send_user "sambungan menyang $ inang metu wektu tundha} metu koneksi {send_user} kanggo inang gagal: $ expect_out (penyangga) re $ prompt}

Contone, fragmen ing ngisor iki bisa mbantu panuntun pangguna lan interaksi sing wis rampung kanthi otomatis. Ing kasus iki, terminal kasebut dilebokake ing mode mentah. Yen pangguna nekan "+", variabel tambah. Yen "p" dipencet, sawetara ngasilake dikirim menyang proses kasebut, mbok menawa digodhok ing sawetara cara, lan "i" ngidini pangguna sesambungan karo proses kasebut, kanthi efektif nyolong kontrol saka naskah. Ing saben kasus, exp_continue ngidini pangarep -arep saiki kanggo nerusake pencocokan pola sawise nglakokne aksi sing saiki.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send "r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interaksi; exp_continue} "metu" metu}

Secara default, exp_continue ngreset wektu wektu entek. Timer ora diwiwiti, yen exp_continue diarani karo flag -continue_timer .

expect_after [expect_args]
dianggo identik karo prediksi sadurunge kajaba yen pola saka sing dikarepake lan expect_after bisa cocog, pola sing dipengini digunakake. Waca prentah expect_before kanggo informasi luwih lengkap.

expect_background [expect_args]
njupuk argumentasi sing padha, nanging bakal ngasilake maneh. Pola diuji nalika saben input anyar teka. Tenggang pola lan standar ora ana guna kanggo expect_background lan diam-diam dibuang. Yen ora, perintah expect_background nggunakake expect_b sadurunge lan expect_after pola kaya ngapa ora .

Nalika tumindak expect_background lagi dievaluasi, pangolahan latar mburi kanggo id ngasilake padha diblokir. Pangolahan latar mburi diblokir nalika tumindak rampung. Nalika pangolahan latar mburi diblokir, bisa nindakake latar ngarep ing ngarep id sing padha.

Sampeyan ora bisa ngeksekusi sing dikarepake nalika expect_background wis diblokir. expect_background kanggo id ngasilake tartamtu dibusak dening ngumumake expect_background anyar karo id ngasilake padha. Deklarasi expect_background tanpa pola mbusak spawn spawn sing diwenehi saka kemampuan kanggo cocog pola ing latar mburi.

expect_before [expect_args]
njupuk argumentasi sing padha, nanging bakal ngasilake maneh. Pasangan pola-tindakan saka expect_b sadurunge paling anyar karo id ngasilake padha sing secara implisit ditambahake sembarang perintah nyana iki . Yen pola cocog, sampeyan dianggep kaya-kaya kasebut ing perintah sing dikarepake dhewe, lan awak sing gegandhengan dieksekusi ing konteks perintah sing dikarepake. Yen pola saka expect_b sadurunge lan nyana bisa cocog, pola expect_before digunakake.

Yen ora ditemtokake pola, id ngasilake ora dipriksa kanggo pola apa wae.

Kajaba ditindakake dening gendera -i , pola-pola sing arep ditindakake pendhapatane nglawan id sing dikembangake ditemtokake nalika perintah expect_before dieksekusi (ora nalika pola dicocogake).

Bendhelan -info nyebabake expect_b sadurunge ngasilake spesifikasi saiki pola kasebut bakal cocog. Secara default, laporan ing id diterbitake saiki. Spesifikasi spawn id opsional bisa diwenehake kanggo informasi id sing bisa ditambang. Tuladhane

expect_before -info -i $ proc

Ing paling siji spawn id specification bisa diwenehi. Langsung-langsung ngilangi nada langsung spawn sing teka mung saka spesifikasi ora langsung.

Tinimbang spekulasi id spekulasi, bendera "-all" bakal nimbulake "-info" kanggo nyatake kabeh id uwong.

Output bendera -info bisa digunakke minangka argumen kanggo ngira-ngira sadurunge.

expect_args [expect_args]
kaya prediksi, nanging maca karakter saka / dev / tty (yaiku penekanan tombol saka pangguna). Secara default, wacan ditindakake ing mode masak. Mangkono, garis kudu diakhiri karo bali supaya bisa ngarep-arep. Iki bisa diganti liwat stty (pirsani printah stty ngisor).

expect_user [expect_args]
kaya prediksi, nanging maca aksara saka stdin (yaiku tombol ketik saka pangguna). Secara default, wacan ditindakake ing mode masak. Mangkono, garis kudu diakhiri karo bali supaya bisa ngarep-arep. Iki bisa diganti liwat stty (pirsani printah stty ngisor).

garpu
nggawe proses anyar. Proses anyar minangka salinan persis saka proses Harapan saiki. Ing kasile, garpu ngasilake 0 menyang proses (bocah) anyar lan ngasilake proses ID saka proses anak menyang proses induk. On failure (tansah amarga lack sumber daya, contone, swap spasi, memori), garpu ngasilake -1 menyang proses tiyang sepah, lan ora proses anak digawe.

Proses-proses forked metu liwat printah metu , kaya proses asli. Proses forked diijini nulis file log. Yen sampeyan ora mateni debugging utawa ngangkut barang ing sebagian besar proses, asil bisa mbingungake.

Sawetara implementasi pty bisa uga bingung dening sawetara nonton lan panulis, malah sedhela wae. Mangkono, iku paling aman kanggo garpu sadurunge pangolahan spawning.

interaksi [string1 body1] ... [stringn [bodyn]]
menehi kontrol proses saiki menyang pangguna, supaya keystrokes dikirim menyang proses saiki, lan stdout lan stderr proses saiki dikembalikan.

Pasangan-pasangan bisa ditemokake minangka argumen, ing ngendi awak dileksanakake nalika string sing gegandhengan dipasrahake. (Secara baku, string ora dikirim menyang proses saiki.) Pandhuan interpreter dianggep, yen awak final wis ilang.

Yen argumen kanggo kabeh statement sesambungan mbutuhake luwih saka siji baris, kabeh argumen bisa "disambungan" dadi siji supaya ora bisa ngatasi saben baris kanthi backslash. Ing kasus siji iki, substitusi Tcl biasa bakal kedadeyan senadyan kandhutan.

Contone, printah ing ngisor iki nganggo sesambungan karo pasangan senar sing ditemtokake ing ngisor iki: Nalika ^ Z ditekan, Expect digantung. ( Bendhelan -reset ngowahi mode terminal.) Nalika ^ A ditekan, pangguna ndeleng "sampeyan ngetik kontrol-A" lan proses dikirim ^ A. Nalika $ ditekan, pangguna ndeleng tanggal kasebut. Nalika ^ C ditetepake, Mesthi metu. Yen "foo" dipateni, pangguna nggoleki "bar". Nalika ~ ~ dipencet, interpreter Nganti bisa interaktif.

set CTRLZ \ 032 interact {-reset $ CTRLZ {exec kill -STOP [pid}} \ 001 {send_user "sampeyan ketik kontrol-A \ n"; kirim "$ 001"} $ {send_user "Tanggal iku [jam format [jam detik]]."} \ 003 exit foo {send_user "bar"} ~~}

Ing pasangan tali-tali, strings dicocogake supaya bisa didaftar minangka argumen. Strings sing cocog sebagian ora dikirim menyang proses saiki ing antisipasi sisane teka. Yen karakter banjur mlebu kaya sing ora ana maneh bisa dadi match, mung bagean saka string sing bakal dikirim menyang proses sing ora bisa miwiti match liyane. Mangkono, strings sing substrings saka parsial match bisa cocog mengko, yen strings asli sing nyoba cocog pungkasane gagal.

Kanthi gawan, pencocokan senar pancen tanpa kartu alam bébas . (Sebaliknya, printah sing nyedhiyakake nggunakake pola gaya glob sacara standar.) Bendhelan -ex bisa digunakake kanggo nglindhungi pola sing bisa cocog karo panji interaksi saka nglakoni. Sembarang pola sing diwiwiti karo "-" kudu dilindhungi kanthi cara iki. (Kabeh rentenir sing diawali karo "-" disusun kanggo opsi mangsa ngarep.)

Gendéra -re nggawé senar sing bisa diinterpretasi minangka pola gaya regexp. Ing kasus iki, sing cocog substrings disimpen ing variabel interact_out kaya cara ngira toko output ing variable expect_out . Bendera -indeks disokong uga.

Pola pola ngenalake tumindak sing dileksanakake sakwise file pungkasan. Pola pola sing kapisah uga ngetutake bendera- output supaya bisa dicocogake yen ditemokake nalika nulis output. Tindakan standar minangka "bali", supaya sesambungane mung bali marang EOF wae.

Timeout pola ngenalake timeout (detik) lan aksi sing dileksanakake nalika ora ana karakter sing dibaca kanggo wektu sing diwenehake. Pola timeout ditrapake kanggo proses paling anyar sing ditemtokake. Ora ana wektu tunggu standar. Variabel khusus "wektu entek" (digunakake dening perintah nyana ) ora kena pengaruh wektu iki.

Contone, pernyataan ing ngisor iki bisa digunakake kanggo pangguna otomatis sing durung ngetik apa-apa sajrone jam nanging sing isih ngenteni sistem pesen:

interaksi -inputake $ user_spawn_id wektu entek 3600 return-output \ $ spawn_id

Yen pola punika null , lan nulls diijini (liwat perintah remove_nulls ), awak sing gegandhengan dieksekusi yen ASCII 0 tunggal cocok. Ora bisa cocog 0 byte liwat pola glob utawa regexp.

Prefacing pola karo flag -iwrite nyebabake variabel interact_out (spawn_id) kanggo diset menyang spawn_id sing cocok karo pola (utawa e).

Tindakan kayata break lan terus nyebabake struktur kontrol (ie, kanggo , proc ) kanggo nindakake kanthi cara sing biasa. Nanging bali nggawa interaksi kanggo bali menyang pemanggil, nalika inter_return nyebabake sesambungan kanggo nimbulake bali ing panelpon. Contone, yen "proc foo" diarani interaksi kang banjur dieksekusi action inter_return , proc foo bakal bali. (Iki tegese yen sesambungan interpreter panggilan interaktif mundur bali bakal nyebabake interaksi kasebut terus, dene inter_return bakal nimbulake interaksi kanggo bali menyang panelpon kasebut.)

Sajrone sesambungan , mode mentah digunakake supaya kabeh karakter bisa dilewati menyang proses saiki. Yen proses saiki ora nyekel sinyal kontrol proyek, bakal mandheg yen ngirim sinyal mandeg (kanthi standar ^ Z). Kanggo miwiti maneh, ngirim sinyal terus (kayata dening "mateni -CONT"). Yen sampeyan pengin ngirim SIGSTOP menyang proses kasebut (dening ^ Z), nimbang cawangan spawning dhisik banjur mlaku program sampeyan. Saliyane, yen sampeyan pengin ngirim SIGSTOP menyang Expect dhewe, interpreter panggilan pisanan (mbok menawa nggunakake karakter uwal), banjur pencet ^ Z.

Pasangan-tali pasangan bisa digunakake minangka cendhak kanggo ngindhari kudu ngetik interpreter lan nglakokne perintah sacara interaktif. Modus terminal sadurungé dipigunakaké nalika pasangan pasangan tali-tali dieksekusi.

Kanggo kacepetan, tumindak nglakokaké ing mode mentah kanthi gawan. Bendera -reset nampilake terminal kasebut ing mode sing wis ditindakake sadurunge ana interaksi (diolah, dimasak modus). Elinga yen karakter sing ditempelake nalika mode diuripake bakal ilang (fitur apes saka driver terminal ing sawetara sistem). Alesan mung kanggo nggunakake -reset yen tumindak sampeyan gumantung ing mode masak.

Bendera -echo ngirim karakter sing cocok karo pola ing ngisor iki kanggo proses sing ngasilake minangka saben karakter diwaca. Iki bisa migunani nalika pangguna perlu ndeleng umpan balik saka pola sing diketik sebagian.

Yen pola diarani nanging pungkasane ora cocog, karakter dikirim menyang proses sing diasilake. Yen proses diwiwiti banjur menehi saran, pangguna bakal weruh karakter kaping pindho. -Eko mungkin mung cocok yen ana pangguna ora bisa ngrampungake pola kasebut. Contone, kutipan ing ngisor iki saka rftp, skrip rekursif-ftp, ing ngendi pangguna dijaluk ngetik ~ g, ~ p, utawa ~ l, kanggo nggayuh, nglebokake, utawa ngowahi direktori saiki kanthi recursively. Iki dadi adoh saka perintah ftp normal, sing pangguna ora bisa ngetik ~ diikuti dening tindakan liya, kejaba mistakenly, ing kasus iki, bakal mbokmenawa mung nglirwakake asil kasebut.

interaksi {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Bendera -nobuffer ngirim karakter sing cocog karo pola ing ngisor iki menyang proses output minangka karakter sing diwaca.

Iki migunani yen sampeyan pengin ngijini program echo bali pola. Contone, ing ngisor iki bisa digunakake kanggo ngawasi ngendi pangguna wong (mode modem Hayes). Saben wektu "atd" katon script nglebokake liyane baris.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" return puts $ log "[format jam [jam detik]]: diunduh $ interact_out (1, string)"} interact -nobuffer "

Sajrone sesambungan , log_user sadurunge wis diilangi . Utamane, interaksi bakal meksa output sing bisa dicathet (dikirim menyang output standar) awit dianggep pangguna ora pengin interaksi sacara membuta.

Gendéra -o nyebabake sembarang pasangan kunci ing ngisor iki kanggo diterapake kanggo proses proses saiki. Iki bisa migunani, contone, nalika nangani host sing ngirim karakter sing ora dikepengini sajrone sesi telnet.

Secara default, interaksi ngarepake panganggo kanggo nulis stdin lan maca stdout saka proses Nyinau dhewe. Bendhelan -u (kanggo "panganggo") ndadekake sesambungan katon kanggo pangguna minangka proses sing dijenengi argumentasine (sing kudu dadi id anake).

Iki ngidini loro proses sing ora ana hubungane supaya bisa gabung tanpa nggunakake loop eksplisit. Kanggo mbantu debugging, mesthekake diagnostik tansah golek stderr (utawa stdout kanggo informasi logging lan debugging tartamtu). Kanggo alasan sing padha, perintis interpreter bakal maca interaktif saka stdin.

Contone, fragmen ing ngisor iki nggawe proses mlebu. Banjur pangguna pangguna (ora ditampilake), lan pungkasane nyambungake loro kasebut. Mesthi, proses apa wae bisa diganti kanggo mlebu. Cangkang, umpamane, bakal ngidini panganggo bisa tanpa nyedhiyakake akun lan sandhi.

login spawn login set $ spawn_id spawn tip modem # dial back out to user # connect user to login interact -u $ login

Kanggo ngirim output menyang pirang-pirang pangolahan, dhaptar saben dhaptar spawn sing diisi dening bendera- output . Input kanggo klompok uwal spawn output bisa ditemtokake dening dhaptar id sing diawali dening bendera-bendera. (Both -input and -output uga njupuk dhaptar ing wangun sing padha karo flag -i ing perintah sing dikarepake, kajaba sing any_spawn_id ora ateges interaksi .) Kabeh panji lan senar (utawa pola) ing ngisor iki ditrapake kanggo input iki nganti liyane - gendera input katon. Yen ora ana input , -put ngakibatake "-put $ user_spawn_id -output". (Kajaba iku, karo pola sing ora duwe.) Yen salah siji- pangguna kasebut, ngatasi $ user_spawn_id. Yen ditemtokake kaping pindho , nglebokake $ spawn_id. Tambahan-tambahan bendera bisa kasebut.

Kapindho pangaruh pangolahan input gawan kanggo ngasilake output sing ditemtokake minangka $ spawn_id lan $ user_spawn_id (sebaliknya). Menawa tandha- tandha ditampilake kanthi ora ana tandha-tandha , karakter saka proses kasebut dibuwak.

Bendera -i ngenalake panggantos kanggo spawn_id saiki nalika ora ditrapake utawa ditrapake . Bendera A-i nyuguhake gendera -o.

Sampeyan bisa ngganti proses sing diinteractifake kanthi nggunakake iran spawn ora langsung. (Tombol spawn ora langsung diterangake ing bagean ing printah sing dikarepake.) Id iran sing ora langsung bisa ditemtokake karo bendera -i, -u, -put, utawa -output.

interpreter [args]
nyebabake pangguna bisa interaktif dijaluk kanggo pituduh lan Tcl. Asile saben printah dicithak.

Tindakan kayata break lan terus nyebabake struktur kontrol (ie, kanggo , proc ) kanggo nindakake kanthi cara sing biasa. Nanging bali nggawa interpreter kanggo bali menyang panelpon, dene inter_return nyebabake interpreter nyebabake bali menyang panelpon. Contone, yen "proc foo" diarani interpreter kang banjur nglakoni tindakan inter_return , proc foo bakal bali. Saben perintah liyane bakal njarake interpreter supaya terus nganggo perintah anyar.

Secara default, pituduh kasebut ngandhut loro wilangan. Integer pertama nggambarake ambane stack evaluasi (umpamane, kaping pirang-pirang Tcl_Eval wis disebut). Integer kedua yaiku pengenal sejarah Tcl. Pituduh bisa disetel kanthi nemtokake prosedur sing disebut "prompt1" sing nilai bali dadi pituduh sabanjure. Yen pernyataan nduweni kuotasi, parens, kancing, utawa tanda kurung, pituduh sekunder (kanthi standar "+>") ditanggepi marang garis anyar. Prompt sekunder bisa disetel kanthi nemtokake prosedur sing disebut "prompt2".

Sajrone interpreter , mode masak digunakake, sanajan pemanggile nggunakake mode mentah.

Yen stdin ditutup, interpreter bakal bali, kajaba bendera- gunane digunakake, banjur argumen kasebut bakal dijupuk.

log_file [args] [[-a] berkas]
Yen jeneng file diwenehake, log_file bakal ngrekam transkrip sesi (diwiwiti ing titik kasebut) ing file kasebut. log_file bakal mungkasi rekaman yen ora ana pitakonan. Sembarang file log sadurunge wis ditutup.

Tinimbang jeneng filename, pengenal berkas Tcl bisa diwenehake kanthi nggunakake bendera -open utawa -leaveopen . Iki padha karo perintah ngasilake . (Delengen manawa kanggo katrangan liyane.)

Bendera - bendera njeblugake output sing bakal dicathet sing ditindhes dening perintah log_user .

Secara kusus, printah log_file ditambah karo file-file lawas tinimbang ngeculake wong-wong mau, amarga gampang bisa ngowahi logging lan kaping pirang-pirang sajrone sesi. Kanggo truncate file, gunakake flag- notepad .

Bendera -info nimbulaké log_file kanggo ngasilake katrangan bab argumen non-info paling anyar sing diwenehake.

log_user-info | 0 | 1
Secara default, dialog ngirim / nyana wis dicatet kanggo stdout (lan file logam yen mbukak). Pembalakan stdout ora diaktifake kanthi printah "log_user 0" lan dienal ulang nganggo "log_user 1". Logging menyang logfile ora diowahi.

Bendhelan -info nimbulake log_user kanggo ngasilake katrangan bab argumen non-info paling anyar sing diwenehake.

match_max [-d] [-i spawn_id] [size]
nemtokake ukuran buffer (ing byte) sing digunakake kanthi njajal . Tanpa argumen ukuran , ukuran saiki bakal bali.

Kanthi flag -d , ukuran standar disetel. (Default awal 2000.) Kanthi flag -i , ukuran disetel kanggo id anjog sing dijenengi, saupama disetel kanggo proses saiki.

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
nglakoni "program args" ing panggonan program Expect saiki, sing sithik. A argumen alur nada sing kuwat ngudarake hubung ing ngarep jeneng printah kaya-kaya ana cangkang login. Kabeh spawn_ids ditutup kajaba sing dijenengi argumen kasebut. Iki dilakonake ing pengenal file sing jenenge.

Spawn_ids dipetakan kanggo ngenali pengenal kanggo program anyar sing diwenehake. Contone, baris ing ngisor iki nganggo catur lan ngontrol proses saiki - ngendikane, master catur.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id chess

Iki luwih efisien tinimbang "interaksi -u", Nanging, kurban kemampuan kanggo nindakake interaksi sing diprogram wiwit proses Pengarep ora kuwat.

Elinga yen ora ana terminal ngontrol. Mangkono, yen sampeyan medhot utawa ngowahi input standar, program sing ngontrol pekerjaan (cangkang, mlebu, etc) ora bisa dienggo kanthi bener.

paritas [-d] [-i spawn_id] [Nilai]
nemtokake manawa keseimbangan kudu ditahan utawa diudani saka asil pangolahan. Yen nilai punika nol, keseimbangn diprediksi, utawa kasebut ora dilucuti. Tanpa argumen nilai , nilai saiki bakal bali.

Kanthi flag -d , nilai paritas standar disetel. (Default awal 1, kayata, keseimbangn ora dilucuti.) Kanthi flag -i , nilai paritas disetel kanggo id ngenal sing dijenengi, saupama disetel kanggo proses saiki.

remove_nulls [-d] [-i spawn_id] [value]
netepake apa nulls disimpen utawa dibusak saka output pangolahan spawned sadurunge pola cocog utawa nyimpen ing variable expect_out utawa interact_out . Yen angka 1, nulls dibusak. Yen angka 0, nulls ora dibusak. Tanpa argumen nilai , nilai saiki bakal bali.

Kanthi flag -d , nilai default wis disetel. (Default awal yaiku 1, yaiku, nulls dibusak.) Kanthi flag -i , nilai kasebut disetel kanggo id sing dijenengi jenenge, sawayer kasebut disetel kanggo proses saiki.

Apa utawa ora dibungkus nulls, Expect bakal ngrekam byte null menyang log lan stdout.

ngirim string [-ditambah]
Ngirim string menyang proses saiki. Contone, perintah kasebut

kirim "hello world \ r"

ngirim karakter, helloworld menyang proses saiki. (Tcl kalebu printf- like command (disebut format ) sing bisa mbentuk strings arbitrarily rumit.)

Karakter dikirim langsung sanadyan program karo input baris-buffer bakal ora maca karakter nganti karakter bali dikirim. A karakter bali diwatesi "\ r".

Bendera - bendera nimbali argumen sabanjuré kanggo diinterpretasi minangka senar tinimbang gendéra. Saben senar bisa dideleh dening "-" apa bener utawa katon kaya bendera. Iki menehi mekanisme dipercaya kanggo nemtokake strings variabel tanpa ditarik dening sing ora sengaja katon kaya bendera. (Kabeh rentenir sing diawali karo "-" disusun kanggo opsi mangsa ngarep.)

Gendéra-i nyatakaké yèn senar dikirim menyang jeneng spawn_id. Yen spawn_id iku user_spawn_id , lan terminal ing mode mentah, garis-garis anyar ing senar ditransfer menyang urut-urutan anyar supaya bisa katon kaya terminal kasebut ing mode masak. Bendera- bendera ora bisa mbatalake terjemahan iki.

Bendera- bendera ngirim karakter null (0 bait). Secara default, siji ora dikirim. Saben uwong bisa ngetutake -null kanggo nunjukake pirang-pirang nolak kanggo ngirim.

Bendera-break bisa nggawe kondisi break. Iki mung ndadekake arti yen id ngasilake nuduhake piranti tty kabuka liwat "spawn -open". Yen sampeyan wis mrodhuksi proses kayata tip, sampeyan kudu nggunakake konvènsi tip kanggo nggawe break.

Bendera -s bisa ngasilake output sing bakal dikirim "alon", saéngga nyingkirake kahanan umum ing ngendi komputer ngetik soko penyangga input sing dirancang kanggo manungsa sing ora bakal ngetok-entek penyangga sing padha. Output iki dikontrol dening nilai variabel "send_slow" sing njupuk dhaptar unsur loro. Unsur sing pisanan yaiku integer sing nggambarake jumlah byte kanggo ngirim secara atom. Unsur sing nomer loro yaiku nomer nyata sing nggambarake jumlah detik sing ngirim atom dipisahake. Contone, "set send_slow {10 .001}" bakal meksa "ngirim -s" kanggo ngirim senar kanthi 1 milidetik ing antarane saben 10 karakter sing dikirim.

Kapal -h bendera njeblugake output sing dikirim (kaya-kaya) kaya sing bener ngetik. Tenggorokan kaya manungsa katon antarane karakter. (Algoritma iki adhedhasar distribusi Weibull, kanthi modifikasi sing cocog karo aplikasi tartamtu iki.) Output iki dikontrol dening nilai variabel "send_human" sing njupuk daftar lima elemen. Rong unsur kapisan yaiku rata-rata wektu interar wayah sajrone karakter sajrone detik. Pisanan digunakake minangka standar. Kapindho digunakake ing endings tembung, kanggo simulasi jeda subtle sing sok-sok dumadi ing transisi kuwi. Parameter kaping telu yaiku ukuran variasi ing ngendi .1 cukup maneko rupo, 1 bisa cukup maneko rupo, lan 10 isih akeh banget. Ekstrem iku 0 nganti ora ana wates. Paramèter sing pungkasan yaiku, sing diwiwiti kanthi wektu interarrival maksimum lan maksimum. Minimal lan maksimum digunakake pungkasan lan "klip" wektu pungkasan. Rata-rata pokok bisa beda banget saka rata-rata sing diwenehi yen klip minimum lan maksimum cukup nilai.

Minangka conto, printah ing ngisor iki njlimetake ketik lan cepet:

set sendhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

nalika ing ngisor iki bisa uga luwih cocok sawise mabuk:

set send_human {.4 .4 .2 .5 100} kirim -h "Goodd party lash night!"

Elinga yen kasalahan ora disintesis, senadyan sampeyan bisa nyetel kahanan koreksi kesalahan dhewe kanthi ngrampungake kesalahan lan koreksi ing pitakonan ngirim.

Panji kanggo ngirim karakter null, kanggo ngirim break, kanggo meksa output alon lan kanggo output gaya manungsa sing eksklusif. Mung siji sing ditemtokake pungkasan bakal digunakake. Salajengipun, ora ana argumen string sing bisa ditemtokake karo bendera kanggo ngirim karakter null utawa putus.

Iku apik kanggo ndhisakake ngirim pisanan menyang proses dening pangarep-arep. ngarepake bakal ngenteni proses diwiwiti, dene ngirim ora bisa. Utamane, yen dikirim pisanan rampung sadurunge proses mulai mlaku, sampeyan kudu ngalami resiko mangerteni data sampeyan. Ing kahanan ing ngendi program interaktif ora menehi pituduh wiwitan, sampeyan bisa ndhisiki ngirim wektu tundha kaya:

# Supaya ora menehi pitunjuk babagan carane ngobrol, # sistem iki ora njaluk pituduh eksternal. # Tunggu 5 detik kanggo eksekusi kanggo ngrampungake telart teluh banget.secure.gov turu 5 send password \ r

exp_send minangka alias kanggo ngirim. Yen sampeyan nggunakake Expectk utawa sawetara varian liyane sing Nyangka ing lingkungan Tk, kirim ditemtokake dening Tk kanggo tujuan sing beda banget. exp_send disedhiyakake kanggo kompatibilitas antarane lingkungan. Alias ​​padha karo perintah ngirim liyane.

send_error [-flags] senar
kaya kirim , kajaba output dikirim menyang stderr tinimbang proses saiki.

send_log [-] senar
kaya kirim , kajaba string kasebut mung dikirim menyang file log (ndeleng log_file .) Argumen kasebut ora dikepengini manawa ora ana file log mbukak.

send_tty [-flags] senar
kaya kirim , kajaba output dikirim menyang / dev / tty tinimbang proses saiki.

send_user [-flags] senar
kaya kirim , kajaba output dikirim menyang stdout tinimbang proses saiki.

detik sedhela
nyebabake naskah kanggo turu kanggo sawetara detik. Detik bisa dadi nomer desimal. Interrupts (lan acara Tk yen sampeyan nggunakake Expectk) diproses nalika Nyedhaki turu.

spawn [args] program [args]
nggawe proses anyar sing mlaku "program args". Sawijining stdin, stdout lan stderr disambungake menyang Expect, supaya bisa dibaca lan ditulis dening liyane Expect commands. Sambungan ditutup kanthi cedhak utawa yen proses kasebut dhewe nutup sembarang pengenal berkas.

Nalika proses diwiwiti kanthi ngasilake , spawn_id variabel disetel dadi deskriptor sing nuduhake proses kasebut . Proses sing diandharake dening spawn_id dianggep minangka " proses saiki ". spawn_id bisa dibaca utawa ditulis, ing efek nyedhiyakake kontrol proyek.

user_spawn_id minangka variabel global sing ngemot deskriptor sing nuduhake pangguna. Contone, nalika spawn_id disetel kanggo nilai iki, nyana behaves kaya expect_user .

.Iki error_spawn_id minangka variabel global sing ngemot deskriptor sing nuduhake kesalahan standar. Contone, nalika spawn_id disetel kanggo nilai iki, ngirim laku kaya send_error .

tty_spawn_id minangka variabel global sing ngemot deskriptor sing nuduhake / dev / tty. Yen / dev / tty ora ana (kayata ing cron, ing, utawa naskah batch), banjur tty_spawn_id ora ditetepake. Iki bisa dites minangka:

{{/ dev / tty exists} else {# / dev / tty does not exist # probably in cron, batch, or script}

spawn ngasilake id proses UNIX. Yen ora ana proses mlebu , 0 bakal bali. Variabel spawn_out (abdi, jeneng) disetel miturut jeneng piranti budak pty.

Secara default, spawn ngunekke jeneng printah lan argumen. Gendéra -noecho mandheg ngasilake iki.

Gendéma - ingsole nyebabake output console bakal dialihake menyang proses mamber. Iki ora didhukung ing kabeh sistem.

Secara internal, spawn nggunakake pty, diinisialisasi kanthi cara sing padha karo tty pangguna. Iki luwih diinisialisasi supaya kabeh setelan "sane" (miturut stty (1)). Yen variabel stty_init didefinisine, diartekno kanthi gaya argumen minangka konfigurasi luwih lanjut. Contone, "set stty_init mentah" bakal nimbulake terminal pangolahan sing luwih cepet kanggo diwiwiti ing mode mentah. -nottycopy ngliwati initialization adhedhasar tty panganggo. -nottyinit ngliwati wiwitan "sane".

Biasane, spawn njupuk wektu sethithik kanggo hajar. Yen sampeyan ngelingi spawn njupuk wektu sing penting, mesthine bisa ditemokake. Sawetara tes diluncurake kanggo nyingkirake proses-proses sing ora ditepungi. (Iki njupuk 10 detik saben wedged pty.) Running Nyana karo -d opsi bakal nuduhake yen Expect nemu akeh ptys ing negara ganjil. Yen sampeyan ora bisa mateni pangolahan sing ditrapake, sampeyan mung bisa mundur.

Yen program ora bisa diwiwiti kanthi sukses amarga exec (2) gagal (contone nalika program ora ana), pesen kesalahan bakal dibalèkaké liwat interaksi sabanjuré utawa minangka komprèsi nyana kaya program wis mlaku lan ngasilaké pesen kesalahan minangka output. Prilaku iki minangka konsekuensi alami saka implementasi spawn . Ing njero kaloro, tandhing-tandhuran, sawise proses mbangun ora bisa komunikasi karo proses Nyana asli kajaba komunikasi liwat spawn_id.

Bendhelan -pol nyebabake argumentasi sabanjure diinterpretasikake minangka pengenal berkas Tcl (ie, bali kanthi mbukak .) Id ngasilake kasebut bisa digunakake minangka proses sing diwenehake. (Pengenal file ora bisa digunakake maneh.) Iki ngijini sampeyan ngrawat piranti, file, lan pipa mentah minangka proses pangolahan tanpa nggunakake pty. 0 dikembalikan kanggo nunjukake ora ana proses sing gegandhengan. Nalika sambungan menyang proses pamisahan ditutup, mangkono uga pengenal berkas Tcl. Bendhelan -leaveopen mirip karo -bisekna kecuali -leaveopen nyebabake pengenal file dibukak nganti sawisé id ngasilake ditutup.

Bendera -pty nyebabake pty bisa dibuka nanging ora ana proses . 0 dikembalikan kanggo nunjukake ora ana proses sing gegandhengan. Spawn_id disetel kaya biasanipun.

Variabel spawn_out (budak, fd) disetel dadi pengenal file sing cocog karo budak pty. Sampeyan bisa ditutup nganggo "close -lave".

Bendera- bendera jenenge sinyal supaya ora digatekake ing proses mroduksi. Yen ora, sinyal njaluk prilaku standar. Sinyal kasebut dijenengi minangka ing komprèsi trap , kajaba sing saben sinyal mbutuhake bendera kapisah.

tingkat strace
nyebabake pernyataan kasebut dicithak sadurunge dieksekusi. (Tl pratelan jejak Tlacak.) Tingkat nuduhake carane adoh mudhun ing tumpukan telpon kanggo nglacak. Contone, prentah ing ngisor iki lumaku: Nyana nalika ngetutake 4 tingkat panggilan sing pertama, nanging ora ana sing ngisor.

nyana -c "strace 4" script.exp

Ing -info flag nyebabake strace kanggo bali menyang deskripsi argumen non-info paling anyar sing diwenehake.

stty args
ngganti mode terminal kaya-kaya marang printah eksternal.

Secara default, terminal pangontrol bisa diakses. Liyane terminal bisa diakses kanthi appending "Panyuwunan status ngasilake minangka asil perintah. Yen ora ana status sing dikarepake lan terminal kontrol bisa diakses, status atribut atribut mentah lan echo sadurunge diowahi kanthi wujud sing bisa digunakake dening dhawuhe.

Contone, argumen sing mentas utawa disenengi sijine terminal dadi mode mentah. Argumentasi- nyawiji utawa dimasak nempatake terminal menyang modus masak. Argumentasi echo lan -echo ndadekake terminal kasebut dadi mode echo lan noecho.

Conto ing ngisor iki nggambarake cara kanggo mateni sementara ngulang. Iki bisa digunakake ing skrip liya-otomatis supaya ora nglebokake tembung sandhi. (Waca liyane diskusi ing ngisor iki ING TEST HINTS ing ngisor iki.)

stty -echo send_user "Sandi:" expect_user -re "(. *) \ n" nyetel sandi $ expect_out (1, string) stty echo

sistem args
menehi args kanggo sh (1) minangka input, kaya-kaya wis diketik minangka perintah saka sawijining terminal. Nganti nganti nganti cangkang diakhiri. Status bali saka sh ditangani kanthi cara sing padha sing ngurus status bali.

Sacara kontras karo exec sing ngarahake stdin lan stdout menyang skrip, sistem ora ngatonake redirection (liyane saka sing dituduhake dening senar dhewe). Mangkono, sampeyan bisa nggunakake program sing kudu diajak langsung menyang / dev / tty. Kanggo alasan sing padha, asil sistem ora kacathet ing log.

timestamp [args]
ngasilake wektu. Tanpa argumen, jumlah detik wiwit mundur.

Bendera- format ngenalake senar sing dikembalikan nanging karo substitusi digawe miturut aturan POSIX kanggo strftime. Contone% a bakal diganti karo jeneng dhetik sing disingkat (ie, SAT). Liyane yaiku:

% jeneng jam kerjo sing disingkat% Jeneng lengkap tanggal% b singkatan jeneng sasi% B jeneng sasi lengkap% c tanggal wektu kaya: Wed Oct 6 11:45:56 1993% d dina sasi (01-31% H jam (00-23)% Aku jam (01-12)% j dina (001-366)% m sasi (01-12)% M minute (00-59)% p am utawa pm% S second (00-61) % u dina (1-7, Senin pisanan dina minggu)% U minggu (00-53, Minggu pisanan dina pisanan ing minggu siji)% V minggu (01-53, ISO 8601 gaya)% w dina (0- 6)% W minggu (00-53, pisanan dina Senin pisanan dina minggu siji)% tanggal wektu kaya: Wed Oct 6 1993% X wektu kaya: 23:59:59% y taun (00-99) % Y taun kaya: 1993% Z timezone (utawa ora bisa ditemtokake)% persen tandha persen

Spesifikasi% liyane ora ditemtokake. Karakter liyane bakal dilewati liwat sing ora bener. Mung lokal C didukung.

Bendera -second ngenalake sawetara detik wiwit jaman digunakake minangka sumber kanggo format. Yen ora, wektu saiki digunakake.

Bendhelan -gmt ngasilake cap wektu kanggo nggunakake wektu zona wektu GMT . Tanpa flag, wektu zona lokal digunakake.

jeblugan sinyal [[printah]]
nyebabake dhawuhe supaya bisa dileksanakake nalika ditampa ing sinyal kasebut. Printah iki dileksanakake ing ruang lingkup global. Yen ora ana perintah , tandha sinyal bakal dikembalikan. Yen printah punika string SIG_IGN, sinyal kasebut ora dianggep. Yen printah punika string SIG_DFL, sinyal kasebut kasil minangka standar sistem. Sinyal kasebut minangka sinyal siji utawa dhaptar sinyal. Sinyal kasebut bisa ditemtokake sacara numerik utawa sacara simbolis minangka sinyal (3). Aturan "SIG" bisa dilirwakaké.

Kanthi ora ana argumen (utawa argumen -number), jeblugan ngasilake nomer sinyal perintah trap sing saiki dieksekusi.

Bendera kode-kode migunakake kode bali perintah kasebut ing panggonan apa wae kode Tcl arep bali nalika perintah kasebut wiwit mlaku.

Bendhelan - interp nyebabake perintah kasebut bakal dievaluasi kanthi nggunakake interpreter sing aktif nalika dhisike kasebut mulai mlaku tinimbang nalika jeblugan kasebut diumumake.

Bendera -Names nyebabake printah trap kanggo ngasilake jeneng sinyal perintah trap sing saiki dieksekusi.

Bendera -max nyebabake printah trap kanggo ngasilake nomer sinyal paling gedhe sing bisa disetel.

Contone, printah "trap {send_user" Ouch! "} SIGINT" bakal mencetak "Ouch!" saben pangguna nerusake ^ C.

Secara default, SIGINT (sing biasane bisa diduweni kanthi mencet ^ C) lan SIGTERM bakal nyebabake metu. Iki amarga trap ing ngisor iki, digawe kanthi standar nalika Nyedhiyakake diwiwiti.

trap metu {SIGINT SIGTERM}

Yen sampeyan nggunakake flag -D kanggo miwiti debugger, SIGINT di redefined kanggo miwiti debugger interaktif. Iki amarga perangkap ing ngisor iki:

trap {exp_debug 1} SIGINT

Jeblugan debugger bisa diganti kanthi nyetel variabel lingkungan EXPECT_DEBUG_INIT menyang perintah trap anyar.

Sampeyan bisa, mesthi, ngatasi loro kasebut mung nambahi pituduh swara menyang skrip sampeyan. Utamane, yen sampeyan duwe dhewe "trap metu SIGINT", iki bakal ngatasi perangkap debugger. Iki migunani yen sampeyan pengin nyegah kedhaftar supaya ora bisa debugger ing kabeh.

Yen sampeyan pengin nemtokake jebakane dhewe ing SIGINT nanging isih ngebaki debugger nalika isih aktif, gunakake:

yen {! [exp_debug]} {trap mystuff SIGINT}

Utawa, sampeyan bisa ngebaki debugger nggunakake sawetara sinyal liyane.

jeblugan ora bakal nglilani sampeyan nglindhungi tumindak kanggo SIGALRM amarga iki digunakake sacara internal kanggo Nyangka . Printah cetha ngeset SIGALRM menyang SIG_IGN (ignore). Sampeyan bisa reenable iki anggere sampeyan mateni iku sajrone spawn spawn sakteruse.

Deleng sinyal (3) kanggo katrangan liyane.

ngenteni [args]
panundha nganti proses mroduksi (utawa proses saiki yen ora dijenengi) bakal rampung.

Tunggu biasane ngasilake dhaptar papat bilah. Integer pertama yaiku pid proses sing ditunggu. Integer sing kapindho yaiku id ngasilake sing cocog. Integer katelu yaiku -1 yen ana kesalahan sistem operasi, utawa 0 digunakake. Yen integer katelu ana 0, integer papat yaiku status sing dipateni dening proses mulas. Yen integer katelu ana -1, integer papat yaiku nilai errno sing disetel dening sistem operasi. ErrorCode variabel global uga disetel.

Unsur tambahan bisa ditampilake ing pungkasan angka bali saka panunggu . Unsur kelima pilihan ngenali kelas informasi. Saiki, mung nilai sing bisa dimupangatake kanggo elemen iki yaiku CHILDKILLED lan loro nilai sabanjure yaiku jeneng sinyal gaya C lan gambaran teks singkat.

Bendhelan -i ngandharake proses kanggo ngenteni cocog karo jeneng spawn_id (ora proses id). Ing pandhuan SIGCHLD, sampeyan bisa ngenteni proses manawa nganggo spawn id -1.

Gendéra- tosané saiki nimbulaké tunggu kanggo bali kanthi langsung karo tandha tundha sing sukses. Nalika proses metu (mengko), bakal kanthi otomatis ilang tanpa kudu ngenteni eksplisit.

Pangaturan tunggu uga bisa digunakake ngenteni proses forked nggunakake argumen "-i -1". Ora kaya nggunakake pangolahan sing diwiwiti, perintah kasebut bisa dieksekusi kapan wae. Ora ana kontrol sing proses reaped. Nanging, nilai bali bisa dicenthang kanggo id proses .

LIBRARY

Dikarepake kanthi otomatis mangerténi babagan rong perpustakaan sing dibangun kanggo ekspektasi skrip. Iki ditemtokake dening petunjuk sing dijenengi ing variabel exp_library lan exp_exec_library. Loro-lorone ditrapake kanggo ngemot file utilitas sing bisa digunakake dening skrip liya.

exp_library ngandhut file-file arsitèktur. exp_exec_library ngandhut file gumantung saka arsitektur. Gumantung ing sistem sampeyan, loro direktori bisa uga kosong. Anane file $ exp_exec_library / cat-buffer nggambarake manawa sampeyan / bin / cat buffer sacara default.

PRETTY-PRINTING

Dhéfinisi evolusioner kasedhiya kanggo skrip pangarepan sing nyithak. Yen sampeyan nemtokake definisi sing diwenehake kanthi distribusi Expect wis diinstal kanthi bener, sampeyan bisa nggunakake aplikasi kasebut minangka:

Berkas-duplikat vgrind

EXAMPLES

Akeh sing ora ngerti carane nggawe kabeh bebarengan sing wong describes. Aku ngajak sampeyan maca lan nyoba conto ing direktori conto distribusi Expect . Sawetara wong iku program nyata. Liyane mung ilustrasi teknik tartamtu, lan mesthi, saperangan mung hacks cepet. File INSTALL nduweni ringkesan cepet saka program kasebut.

Makalah Harapan (pirsani JAWABAN) uga migunani. Nalika sawetara makalah nggunakna sintaks sing cocog karo versi sing dawa saka Expect, rasionales sing ditemoni isih sah lan golek luwih rinci tinimbang kaca iki.

CAVEATS

Ekstensi bisa bertentangan karo jeneng perintah Expect. Contone, ngirim ditetepake dening Tk kanggo tujuan sing beda banget. Mulane, sebagian besar perintah Expect uga kasedhiya minangka "exp_XXXX". Pandhuan lan variabel sing diwiwiti kanthi "exp", "inter", "spawn", lan "timeout" ora duwe alias. Gunakake jeneng printah lengkap yen sampeyan butuh kompatibilitas kasebut ing antarane lingkungan.

Ngarep-arep njupuk tampilan rada liberal saka scoping. Utamane, variabel sing diwaca dening perintah tartamtu kanggo program Expect bakal ditindakake luwih dhisik saka ruang lingkup lokal, lan yen ora ditemokake, ing lingkup global. Umpamane, iki kudu mbutuhake panggonan "wektu entek global" ing saben prosedur sampeyan nulis sing nggunakake pangarep-arep . Saliyane, variabel sing ditulis tansah ana ing lingkup lokal (kajaba sawijining "global" perintah sing diterbitake). Masalah sing paling umum iki nyebabake yen ngasilake diwiwiti kanthi prosedur. Saliyane prosedur kasebut, spawn_id ora ana maneh, saengga proses produksi ora bisa diakses kanthi gampang mung amarga scoping. Tambah "global spawn_id" kanggo prosedur kasebut.

Yen sampeyan ora bisa ngaktifake kemampuan multispawning (misale, sistem sampeyan ora ndhukung pilih (BSD *. *), Jajak pendapat (SVR> 2), utawa ora ana sing padha), Nyedhiyakake mung bisa ngontrol proses siji ing siji wektu. Ing kasus iki, ora nyoba nyetel spawn_id , utawa ngirim sampeyan ngeksekusi pangolahan liwat eksek nalika proses mecut wis mlaku. Salajengipun, sampeyan ora bakal bisa nyana saka macem-macem proses (kalebu pangguna minangka siji) ing wektu sing padha.

Parameter terminal bisa duwe efek gedhe ing skrip. Contone, yen naskah ditulis kanggo nggoleki, bakal misbehave yen diuripake. Amarga alasan iki, ngira parameter paramèter terminal sane minangka default. Sayange, iki bisa nggawe samubarang ora becik kanggo program liya. Minangka conto, cangkang emacs kepengin ngowahi pemetaan "biasanipun": garis-garis anyar dipetakan menyang garis anyar tinimbang garis-garis enggal-enggal, lan echoing dinonaktifake. Iki ngidini wong nggunakake emacs kanggo ngowahi baris input. Sayange, Expect ora bisa ngira iki.

Sampeyan bisa nyuwun Pangarep supaya ora ngganti setelan gawan paramèter terminal, nanging sampeyan kudu ati-ati banget nalika nulis naskah kanggo lingkungan kasebut. Ing kasus emacs, aja gumantung marang samubarang sing kaya ngono lan pemetaan garis akhir.

Perintah sing nampi argumentasi sing disampurnakake dadi siji dhaptar (varian lan interaksi sing dikarepake ) nggunakake heuristik kanggo nemtokake manawa daftar kasebut minangka salah sawijining argumen utawa akeh. Hehurist bisa gagal mung ing kasus nalika dhaptar bener minangka argumen siji sing nduweni macem-macem ditempelake \ n karo karakter non-whitespace ing antarane. Iki koyone cukup ora mungkin, nanging argumen "-nobrace" bisa digunakake kanggo meksa argumentasi siji kanggo ditangani minangka argumen siji. Iki bisa dipigunaake nggunakake kode Expecting mesin. Demokrasi uga nduwe argumentasi sing bisa ditangani minangka macem-macem pola / tumindak.

BUGS

Iku bener ngagetake kanggo jeneng program "jinis" (kanggo salah siji "Smart EXEC" utawa "Kirim-EXPect"), nanging apik pangertèn (utawa mbok menawa mung Puritanism) prevailed.

Ing sawetara sistem, nalika cangkang diwiwiti, gegayutan ora bisa ngakses tty nanging bisa uga dianggo. Iki tegese sistem sampeyan duwe mekanisme kanggo entuk ngontrol tty sing ora bisa dikarepake. Mangga ngerteni apa iku, lan ngirim informasi iki bali menyang aku.

Ultrix 4.1 (paling ora versi paling anyar watara ing kene) nganggep wektu tebih saka 1000000 dadi setara karo 0.

Digital UNIX 4.0A (lan mbokmenawa uga versi liyane) nolak nyedhiyakake ptys yen sampeyan nemtokake panganggo SIGCHLD. Waca kaca pituduh kanggo katrangan liyane.

IRIX 6.0 ora nangani hak akses kanthi bener supaya menawa Expect nyoba ngalokasi pty sadurunge digunakake dening wong liya, gagal. Nganyarke kanggo IRIX 6.1.

Telnet (wis diverifikasi ing sangisore SunOS 4.1.2) bakal nate yen TERM ora disetel. Iki masalah ing cron, lan ing skrip cgi, sing ora netepake TERM. Mangkono, sampeyan kudu nyetel kanthi tegas - kanggo jinis apa sing biasane ora ana hubungane. Iku mung kudu disetel kanggo soko! Ing ngisor iki mesthine cukup suwe kanggo akeh kasus.

set env (TERM) vt100

Tip (diverifikasi mung ing BSDI BSD / OS 3.1 i386) nyumerepi yen SHELL lan HOME ora disetel. Iki masalah ing cron , lan ing skrip cgi , sing ora netepake variabel lingkungan kasebut. Mangkono, sampeyan kudu nyetel kanthi tegas - kanggo jinis apa sing biasane ora ana hubungane. Iku mung kudu disetel kanggo soko! Ing ngisor iki mesthine cukup suwe kanggo akeh kasus.

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

Sapérangan implementasi saka ptys dirancang supaya kernel mbalèkaké sembarang output sing durung diwaca sawisé 10 nganti 15 detik (nomer nyata minangka dependensi implementasine) sawisé proses wis nutup file deskriptor. Mangkono program Nyedhiyakake kayata

spawn date sleep 20 expect

bakal gagal. Kanggo ngindhari iki, njaluk program non-interaktif karo exec a rather spawn . Nalika kahanan kaya mengkono bisa dipikir, ing laku aku ora tau nemoni kahanan kang output final saka program sing bener interaktif bakal ilang amarga prilaku iki.

Ing tangan liyane, Cray UNICOS bisa mbuwang kabeh output sing durung diwaca sasampunipun proses wis nutup file deskriptor. Aku wis nulis iki menyang Cray lan padha nggarap fix.

Kadhangkala tundha dibutuhake antarane pituduh lan respon, kayata nalika antarmuka tty ngganti setelan UART utawa cocog tingkat baud kanthi nggoleki wiwitan / mandeg bit. Biasane, kabeh iki mbutuhake kanggo turu kanggo liyane utawa loro. Teknik sing luwih apik kanggo dicoba nganti hardware siap nampa input. Conto ing ngisor iki nggunakake strategi:

ngirim "kacepetan 9600 \ r"; turu 1 ngarep {timeout {send "\ r"; exp_continue} $ prompt}

trap -code ora bisa nglakoni perintah apa wae sing lenggah ing loop acara Tcl, kayata turu. Masalah iku ing daur ulang acara, Tcl mbatalake kode bali saka penangan acara async. A workaround kanggo nyetel bendera ing kode trap. Banjur nampilake gendéra sakwisé printah (ie, turu).

Panguwasa expect_background nglirwakake argumen-argumen wektu lan ora duwe konsep wektu entuk ing umum.

& # 34; EXPECT HINTS & # 34;

Ana pirang-pirang perkara babagan Expect sing mungkin ora intuisi. Bagian iki ngupaya ndandani sawetara perkara kasebut kanthi pirang-pirang saran.

Masalah sing dikarepake umum yaiku carane ngakoni asu shell. Awit iki disesuaikan kanthi beda dening wong-wong sing beda-beda lan cangkang sing beda-beda, rlogin njaba otomatis bisa angel tanpa ngerti pituduh kasebut. Konvensi sing cukup yaiku nduwe pengguna nyimpen ekspresi reguler njelasake pitunjuk (utamane, pungkasan) ing variabel lingkungan EXPECT_PROMPT. Kode kaya sing kasebut bisa digunakake. Yen EXPECT_PROMPT ora ana, kode iki isih nduweni kasempatan sing apik kanggo ngoperasikake kanthi bener.

setel pituduh "(% | # | \\ $) $"; # nemu pituduh asli {set prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

Aku ngajak sampeyan nulis pola sing nyana sing nyakup pungkasan apa wae sing sampeyan ngarepake. Iki nyegah kamungkinan njawab pitakonan sadurunge ndeleng kabeh. Kajaba iku, nalika sampeyan bisa uga bisa njawab pitakonan sadurunge ndeleng kabeh mau, yen sampeyan njawab dini, jawaban sampeyan bisa uga ditampilake maneh ing tengah-tengah pitakonan. Ing tembung liya, dialog asil bakal bener nanging katon scrambled.

Panjaluk sing paling dhuwur kalebu karakter spasi ing pungkasan. Contone, pituduh saka ftp yaiku 'f', 't', 'p', '>' lan. Kanggo cocog pituduh iki, sampeyan kudu nglebokake saben karakter kasebut. Kesalahan umum ora kalebu kothong. Lebokake kothong kanthi tegas.

Yen sampeyan nggunakake pola saka wangun X *, * bakal cocog kabeh output sing ditampa saka mburi X kanggo hal pungkasan sing ditampa. Iki muni intuisi nanging bisa dadi rada bingung amarga tembung "pungkasan barang sing ditampa" bisa beda-beda gumantung marang kacepetan komputer lan pangolahan I / O kanthi kernel lan driver piranti.

Secara khusus, manungsa cenderung ndeleng program output sing teka ing potongan gedhe (atom) nalika ing kasunyatan program paling ngasilake output siji baris ing wektu. Kanthi asumsi iki, pola * ing pola paragraf sadurungé mung cocog ing pungkasan garis saiki sanajan ana sing katon luwih, amarga ing wektu pertandhingan kasebut kabeh output sing wis ditampa.

ora bakal mangerteni yen output luwih bakal teka kajaba pola khusus nyatakake.

Malah gumantung ing buffering line-oriented iku ora bener. Ora mung program sing jarang nggawe janjine babagan jinis buffering sing padha, nanging sistem indigestion bisa ngeculake garis output munggah supaya garis break ing panggonan-panggonan sing kerep katon. Mangkono, yen sampeyan bisa ngandhakake sawetara aksara pungkasan nalika panulisan pola, wicaksana nglakoni.

Yen sampeyan ngenteni pola ing output pungkasan saka program lan program ngirimake soko liya, sampeyan ora bakal bisa nemtokake karo tembung kunci wektu entek . Alasanipun yaiku ora bakal entek waktu - tinimbang bakal entuk indikasi. Gunakake kasebut. Malah luwih apik, gunakake loro. Mangkono manawa baris kasebut wis dipindhah, sampeyan ora kudu ngowahi baris kasebut.

Newlines biasane diowahi dadi bali carriage, urutan garisfeed nalika output dening driver terminal. Mangkono, yen sampeyan pengin pola sing tegese cocog karo rong baris, saka, ucapake, printf ("foo \ nbar"), sampeyan kudu nganggo pola "foo \ r \ nbar".

Terjemahan sing padha nalika maca saka pangguna, liwat expect_user . Ing kasus iki, nalika sampeyan menetake bali, bakal diterjemahake menyang garis anyar. Yen Expect banjur lumampah menyang program sing nemtokake sawijining terminal menyang mode mentah (kaya telnet), bakal ana masalah, amarga program kasebut ngarepake bali sing bener. (Sawetara program bener-bener ngapura amarga bakal kanthi otomatis nerjemahake baris-baris anyar kanggo ngasilake, nanging sing paling ora.) Sayange, ora ana cara kanggo mangerteni yen program sijine terminal dadi mode mentah.

Tinimbang kanthi manual ngganti garis-garis anyar kanthi pulangan, solusi kasebut nggunakake perintah "stty mentah", sing bakal mungkasi terjemahan. Elinga, Nanging, iki tegese sampeyan ora bakal entuk fitur editing baris sing dimasak maneh.

interaksi kanthi implisit nyetel terminal menyang mode mentah supaya masalah iki ora bakal muncul banjur.

Asring migunani kanggo nyimpen sandhi (utawa informasi pribadi liyane) ing Tulisan ekspektasi. Iki ora dianjurake wiwit apa-apa sing disimpen ing komputer rentan kanggo diakses dening sapa waé. Mangkono, interpilih mènèhi tembung sandhi saka skrip iku luwih becik tinimbang nglebokaké kanthi harfiah. Nanging, kadhangkala embedding kuwi mung kamungkinan.

Sayange, sistem berkas UNIX ora nduweni cara langsung gawe skrip sing bisa dieksekusi nanging ora bisa diwaca. Sistem sing ndhukung naskah skrip setgid bisa langsung nggambarake kaya iki:

Nggawe naskah Expect (sing ngemot data rahasia) kaya biasanipun. Nggawe ijin kasebut dadi 750 (-rwxr-x ---) lan diduweni dening grup sing dipercaya, yaiku, grup sing diwenehi maca. Yen perlu, gawe grup anyar kanggo tujuan iki. Sabanjure, gawe script / bin / sh karo ijin 2751 (-rwxr-s - x) sing diduweni dening grup sing padha karo sing sadurunge.

Asilé iku naskah sing bisa dieksekusi (lan diwaca) déning sapa waé. Nalika dipratelakake, sampeyan bisa nganggo skrip Expect .

& Nuduhake UTAWA & # 34;

Tcl (3), libexpect (3)
"Njelajah Nyedhiyakake: A Toolkit Tcl-Based for Automating Program Interaktif" dening Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"nyana: Ngobati Ketidakterangan Interaktivitas" dening Don Libes, Konferensi Musim Panas 1990 Konferensi USENIX, Anaheim, California, 11-15 Juni 1990.
. "Nggunakake nyedhiyakake kanggo Automate Tugas Administrasi Sistem" dening Don Libes, Tindakan saka Konferensi Administrasi Sistem Instalasi Gedhe USENIX 1990, Colorado Springs, Colorado, 17-19 Oktober, 1990.
.Ing "Tcl: An Embeddable Command Language" dening John Ousterhout, Prosiding Winter 2008 Konferensi USENIX, Washington, DC, 22-26 Januari 1990. "Aku nyana: Scripts for Controlling Interactive Programs" dening Don Libes, Sistem Komputasi , Vol. 4, No. 2, Jurnal Pamekan Universitas California, Nopember 1991. "Tes Regreso lan Konflik Testing Program Interaktif", dening Don Libes, Pamrentah Konferensi 1992 USENIX Konferensi, pp. 135-144, San Antonio, TX, Juni 12-15, 1992. "Kibitz - Nyambungake Program Interaktif Kanthi", dening Don Libes, Software - Praktik & Pengalaman, John Wiley & Sons, West Sussex, Inggris, Vol.

23, No 5, May, 1993..I "Debugger kanggo Aplikasi Tcl", dening Don Libes, Tindakan ing taun 1993 Tcl / Tk Workshop, Berkeley, CA, 10-11 Juni 1993.

AUTHOR

Don Libes, Institut Standar lan Teknologi Nasional

ACKNOWLEDGMENTS

Thanks kanggo John Ousterhout kanggo Tcl, lan Scott Paisley kanggo inspirasi. Thanks kanggo Rob Savoye kanggo kode autoconfiguration Expect.

Dokumèn dokuméntasi nyathet éwah-éwahan éwah- éwahan . Iku ndadekake maca menarik lan bisa menehi wawasan luwih dhisik kanggo piranti lunak iki. Thanks kanggo wong-wong kasebut ing sing dikirim kula bug koreksi lan menehi pitulungan liyane.

Desain lan implementasi Expect dibayari sebagian dening pamaréntah AS lan mulane ana ing domain publik. Nanging penulis lan NIST seneng kredit yen program lan dokumentasi utawa bagéan mau digunakake.