Harapan Linux / Unix

Jangkakan adalah program yang bercakap dengan program interaktif lain mengikut skrip. Mengikuti skrip, Jangkakan tahu apa yang boleh dijangkakan dari program dan apakah tindak balas yang sepatutnya. Bahasa ditafsirkan menyediakan struktur kawalan cawangan dan peringkat tinggi untuk mengarahkan dialog. Di samping itu, pengguna boleh mengawal dan berinteraksi secara langsung apabila dikehendaki, selepas itu mengembalikan kawalan ke skrip.

Expectk adalah campuran Harapan dan Tk. Ia bertindak seperti jangkaan Harapan dan Tk. Jangkakan juga boleh digunakan secara langsung dalam C atau C ++ tanpa Tcl.

Nama "Harapkan" berasal dari idea menghantar / mengharapkan urutan yang dipopulerkan oleh uucp, kermit dan program kawalan modem lain. Bagaimanapun tidak seperti uucp, Harapan adalah umum sehingga dapat dijalankan sebagai perintah tingkat pengguna dengan program dan tugas apa pun dalam fikiran. Jangkakan boleh bercakap dengan beberapa program pada masa yang sama.

Apa yang Harapkan

Sebagai contoh, berikut adalah beberapa perkara yang boleh dijangkakan:

Terdapat pelbagai alasan kenapa shell tidak dapat melaksanakan tugas ini. Segala-galanya boleh dilakukan dengan Harapan.

Secara umum, Harapan berguna untuk menjalankan sebarang program yang memerlukan interaksi antara program dan pengguna. Apa yang perlu ialah interaksi boleh ditonjolkan secara programatik. Jangkakan juga boleh memberikan kawalan balik kepada pengguna tanpa menghentikan program yang dikendalikan. Begitu juga, pengguna boleh mengembalikan kawalan ke skrip pada bila-bila masa.

Penggunaan

Jangkakan membaca cmdfile untuk senarai arahan untuk dilaksanakan. Jangkakan boleh digunakan secara implisit pada sistem yang menyokong #! notasi dengan menandakan skrip sebagai boleh laku dan membuat baris pertama dalam skrip:

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

Sudah tentu, jalan mesti menerangkan dengan tepat di mana Harapan kehidupan. / usr / local / bin hanyalah satu contoh.

Bendera -c prefaces perintah yang akan dilaksanakan sebelum ada dalam skrip. Perintah tersebut hendaklah dipetik untuk mengelakkan dipecahkan oleh shell. Pilihan ini boleh digunakan beberapa kali. Perintah berbilang boleh dijalankan dengan satu -c dengan memisahkannya dengan titik koma. Perintah dilaksanakan mengikut perintah yang dipaparkan. Apabila menggunakan Expectk, pilihan ini dinyatakan sebagai-arahan.

Bendera -d membolehkan beberapa output diagnostik, yang terutama melaporkan aktiviti dalaman arahan seperti mengharapkan dan berinteraksi. Bendera ini mempunyai kesan yang sama seperti "exp_internal 1" pada permulaan skrip Harapan, ditambah versi Harapan dicetak.

Bendera -D membolehkan debugger interaktif. Nilai integer mesti diikuti. Debugger akan mengambil alih sebelum prosedur Tcl berikutnya jika nilai tidak sifar atau jika a ^ C ditekan atau titik putus dipukul, atau perintah debugger yang lain muncul dalam skrip. Apabila menggunakan Expectk, opsyen ini ditentukan sebagai - Debug.

Bendera -f memaparkan fail dari mana untuk membaca arahan. Bendera itu sendiri adalah pilihan kerana ia hanya berguna apabila menggunakan #! notasi, supaya hujah lain boleh dibekalkan pada baris arahan. Apabila menggunakan Expectk, opsyen ini ditentukan sebagai fail -file.

Secara lalai, fail arahan dibaca ke dalam memori dan dilaksanakan secara keseluruhannya. Ia kadang-kadang wajar untuk membaca fail satu baris pada satu masa. Untuk memaksa fail sewenang-wenangnya ditangani dengan cara ini, gunakan bendera -b. Apabila menggunakan Expectk, pilihan ini ditentukan sebagai -buffer.

Jika rentetan "-" dibekalkan sebagai nama fail, input standard dibaca sebaliknya. Gunakan "./-" untuk membaca dari fail yang sebenarnya dinamakan "-".

The -i flag menyebabkan Expect to interactively prompt for commands instead of reading them from file. Prompting ditamatkan melalui perintah keluar atau EOF. Bendera -i diandaikan jika tiada fail arahan dan -c digunakan. Apabila menggunakan Expectk, opsyen ini ditentukan sebagai -interaktif.

- boleh digunakan untuk membataskan pilihan. Ini berguna jika anda ingin lulus hujah pilihan seperti skrip anda tanpa ia ditafsirkan oleh Harapan. Ini berguna untuk diletakkan di #! garis untuk mengelakkan tafsiran seperti bendera oleh Harapan. Contohnya, perkara berikut akan meninggalkan hujah asal termasuk nama skrip dalam argv pemboleh ubah.

#! / usr / local / bin / expect -

Perhatikan bahawa getopt biasa (3) dan melaksanakan (2) konvensyen mesti diperhatikan apabila menambah argumen kepada #! talian.

Fail $ exp_library / expect.rc diperoleh secara automatik jika ada, melainkan bendera -N digunakan. (Apabila menggunakan Expectk, opsyen ini ditentukan sebagai -NORC.) Segera selepas ini, fail ~ / .expect.rc akan diperoleh secara automatik, kecuali bendera -n digunakan. Sekiranya pembolehubah persekitaran DOTDIR ditakrifkan, ia dianggap sebagai direktori dan .expect.rc dibaca dari sana. Apabila menggunakan Expectk, opsyen ini ditentukan sebagai -norc. Suntikan ini berlaku hanya selepas melaksanakan sebarang bendera -c.

-v menyebabkan Berharap untuk mencetak nombor versi dan keluar. Bendera yang sama di Expectk, yang menggunakan nama bendera panjang, adalah -versi.

Arg argumen dibina ke dalam senarai dan disimpan dalam pembolehubah bernama argv dan. argc diasaskan kepada panjang argv.

Argv0 ditakrifkan sebagai nama skrip atau binary jika skrip tidak digunakan. Sebagai contoh, berikut mencetak nama skrip dan tiga argumen pertama:

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

Perintah

Jangkakan menggunakan Bahasa Peranti Alat. Tcl menyediakan aliran kawalan (jika, untuk, pecah), penilaian ungkapan dan beberapa ciri lain seperti definisi rekursi dan prosedur. Perintah yang digunakan di sini tetapi tidak ditakrifkan (set, jika, exec) adalah perintah Tcl. Jangkakan menyokong perintah tambahan. Kecuali dinyatakan sebaliknya, arahan mengembalikan tali kosong.

Perintah disenaraikan mengikut abjad supaya mereka dapat dengan cepat ditempatkan. Walau bagaimanapun, pengguna baru mungkin lebih mudah untuk memulakan dengan membaca deskripsi bertelur, menghantar, mengharapkan, dan berinteraksi, dalam perintah itu.

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

menutup sambungan ke proses semasa. Kebanyakan program interaktif akan mengesan EOF pada stdin dan keluar mereka; Oleh itu, rapat biasanya cukup untuk membunuh proses itu juga. Bendera -i mengisytiharkan proses untuk menutup sepadan dengan bernama spawn_id.

Kedua-duanya mengharapkan dan berinteraksi akan mengesan apabila proses semasa keluar dan secara tersirat melakukan penutupan, tetapi jika anda membunuh proses dengan, katakan, "kill kill $ pid", anda perlu panggilan secara jelas .

Bendera-satuxec menentukan sama ada idjel tertutup dalam mana-mana proses yang baru ditanam atau jika prosesnya dilapisi. Untuk meninggalkan id bertelur terbuka, gunakan nilai 0. Nilai integer bukan sifar memaksa spawn ditutup dalam sebarang proses baru.

Bendera-bendera menutup hamba yang dikaitkan dengan id bertelur. Apabila sambungan ditutup, hamba ditutup secara automatik juga jika ia masih terbuka.

Tidak kira sama ada sambungan ditutup secara tersurat atau secara eksplisit, anda perlu menelefon menunggu untuk membersihkan slot proses kernel yang sepadan. Perintah tutup tidak memanggil menunggu kerana tidak ada jaminan bahawa penutupan sambungan proses akan menyebabkannya keluar.

debug [[-now] 0 | 1]

mengawal debugger Tcl yang membolehkan anda melangkah melalui penyataan dan menetapkan titik putus.

Dengan tiada hujah, 1 dikembalikan jika debugger tidak berjalan, jika tidak 0 dikembalikan.

Dengan argumen 1, debugger dimulakan. Dengan argumen 0, debugger dihentikan. Sekiranya hujah 1 didahului oleh bendera baru, debugger dimulakan dengan segera. Jika tidak, debugger bermula dengan pernyataan Tcl yang seterusnya.

Perintah debug tidak mengubah sebarang perangkap. Bandingkan ini untuk bermula Mengharapkan dengan bendera -D.

Perintah cabut memutuskan sambungan proses bercabang dari terminal . Ia terus berjalan di latar belakang. Proses ini diberikan kepada kumpulan prosesnya sendiri. Standard I / O diarahkan ke / dev / null .

Fragmen berikut menggunakan putus sambungan untuk terus menjalankan skrip di latar belakang.

jika {[fork]! = 0} keluar putus hubungan. . .

Skrip berikut membaca kata laluan dan kemudian menjalankan program setiap jam yang menuntut kata laluan setiap kali ia dijalankan. Skrip membekalkan kata laluan supaya anda hanya perlu menaipnya sekali.

send_user "kata laluan?" expect_user -re "(. *) \ n" untuk {} 1 {} {if { 1, rentetan) \ r ". . . keluar}

Satu kelebihan untuk menggunakan putus sambungan ke atas ciri proses tak segerak shell (&) ialah Jangkaan dapat menjimatkan parameter terminal sebelum pemotongan dan kemudian kemudian menerapkannya ke pustaka baru. Dengan &, Jangka tidak mempunyai peluang untuk membaca parameter terminal kerana terminal telah terputus oleh masa yang Diharapkan menerima kawalan.

keluar [-opsi] [status]

menyebabkan jangkaan untuk keluar atau sebaliknya bersedia untuk berbuat demikian.

Bendera- satuxit menyebabkan hujah seterusnya digunakan sebagai pengendali keluar. Tanpa hujah, pengendali keluar semasa dikembalikan.

Bendera -noexit menyebabkan Berharap untuk bersiap sedia untuk keluar tetapi berhenti daripada mengembalikan kawalan sebenar ke sistem operasi. Pengendali keluar yang ditetapkan pengguna dijalankan dan juga pengendali dalaman yang Diharapkan. Tidak lagi Mengharapkan arahan harus dilaksanakan. Ini berguna jika anda menjalankan Mengharapkan dengan sambungan Tcl yang lain. Jurubahasa semasa (dan tetingkap utama jika dalam persekitaran Tk) kekal supaya sambungan Tcl yang lain dapat dibersihkan. Sekiranya keluar dari Expect dipanggil sekali lagi (namun ini mungkin berlaku), pengendali tidak akan mengulang semula.

Apabila keluar, semua sambungan ke proses melahirkan ditutup. Penutupan akan dikesan sebagai EOF dengan menghasilkan proses. keluar tidak mengambil tindakan lain melampaui prosedur _exit (2) biasa. Oleh itu, proses pengeluaran yang tidak memeriksa EOF mungkin terus dijalankan. (Pelbagai syarat adalah penting untuk menentukan, sebagai contoh, apa isyarat yang dihasilkan akan dihantar, tetapi ini bergantung kepada sistem, biasanya didokumenkan di bawah exit (3).) Proses melahirkan yang terus berjalan akan diwarisi oleh init.

status (atau 0 jika tidak ditentukan) dikembalikan sebagai status keluar dari Yang Diharapkan . keluar secara tersirat dilaksanakan jika akhir skrip dicapai.

exp_continue [-continue_timer]
Perintah exp_continue membolehkan mengharapkan dirinya untuk terus melaksanakan dan bukannya kembali seperti biasanya. Secara lalai exp_continue menetapkan semula pemasa habis masa. Bendera -continue_timer menghalang pemasa daripada dimulakan semula. (Lihat mengharapkan lebih banyak maklumat.)

nilai exp_internal [-f file]
menyebabkan arahan selanjutnya untuk menghantar maklumat diagnostik dalaman kepada Jangkaan untuk stderr jika nilai tidak sifar. Output ini dilumpuhkan jika nilai adalah 0. Maklumat diagnostik termasuk setiap watak yang diterima, dan setiap percubaan dibuat untuk menyesuaikan output semasa terhadap corak.

Jika fail pilihan dibekalkan, semua output normal dan penyahpepijatan ditulis ke fail tersebut (tanpa mengira nilai nilai ). Sebarang fail output diagnostik terdahulu ditutup.

Bendera -info menimbulkan exp_internal untuk mengembalikan keterangan hujah-hujah bukan maklumat terbaru yang diberikan.

exp_open [args] [-i spawn_id]
mengembalikan pengenal fail Tcl yang sepadan dengan idjaan asal yang asal. Pengecam fail kemudian boleh digunakan seolah-olah ia dibuka oleh perintah terbuka Tcl. (Spawn id tidak boleh digunakan lagi. Tunggu tidak boleh dilaksanakan.

Bendera -leaveopen meninggalkan id bertelur terbuka untuk akses melalui Harapan arahan. Tunggu hendaklah dilaksanakan pada id yang bertelur.

exp_pid [-i spawn_id]
mengembalikan proses id sepadan dengan proses yang sedang ditanam. Jika bendera -i digunakan, pid yang kembali sepadan dengan id yang diberi spawn.

exp_send
adalah alias untuk dihantar .

exp_send_error
adalah alias untuk send_error .

exp_send_log
adalah alias untuk send_log .

exp_send_tty
adalah alias untuk send_tty .

exp_send_user
adalah alias untuk send_user .

exp_version [[-exit] version]
berguna untuk meyakinkan bahawa skrip itu bersesuaian dengan versi yang Diharapkan.

Tanpa hujah-hujah, versi Expect saat ini dikembalikan. Versi ini kemudian boleh dikodkan dalam skrip anda. Jika anda benar-benar tahu bahawa anda tidak menggunakan ciri versi terkini, anda boleh menentukan versi terdahulu.

Versi terdiri daripada tiga nombor yang dipisahkan oleh titik. Pertama adalah nombor utama. Skrip yang ditulis untuk versi Harapan dengan nombor utama yang berbeza hampir pasti tidak berfungsi. exp_version mengembalikan ralat jika nombor utama tidak sepadan.

Kedua adalah nombor kecil. Skrip yang ditulis untuk versi yang mempunyai bilangan kecil yang lebih kecil daripada versi semasa mungkin bergantung kepada beberapa ciri baru dan mungkin tidak dijalankan. exp_version mengembalikan ralat jika nombor utama sepadan, tetapi jumlah skrip yang kecil lebih besar daripada yang diharapkan .

Ketiga ialah nombor yang tidak memainkan peranan dalam perbandingan versi. Walau bagaimanapun, ia bertambah apabila taburan perisian Harapan diubah dengan cara apapun, seperti dengan dokumentasi tambahan atau pengoptimuman. Ia ditetapkan semula kepada 0 pada setiap versi kecil baru.

Dengan bendera -exit , Harapkan mencetak ralat dan keluar jika versi sudah lapuk.

jangkakan [[-opts] pat1 body1] ... [-opts] patn [bodyn]
menunggu sehingga salah satu corak sepadan dengan keluaran proses melahirkan, tempoh masa tertentu telah berlalu, atau fail akhir dilihat. Sekiranya badan terakhir kosong, ia boleh ditinggalkan.

Corak dari arahan expect_before yang paling terkini digunakan secara tersirat sebelum corak lain. Corak dari perintah expect_after paling terkini digunakan secara tersirat selepas corak lain.

Sekiranya hujah-hujah terhadap keseluruhan kenyataan mengharapkan memerlukan lebih daripada satu baris, semua hujah-hujah boleh "disandarkan" menjadi satu untuk mengelakkan mengakhiri setiap baris dengan garis belakang. Dalam satu kes ini, penggantian Tcl biasa akan berlaku walaupun penyokong gigi.

Sekiranya corak adalah kata kunci kata kunci, badan yang bersesuaian dilaksanakan pada akhir fail. Sekiranya corak adalah masa tamat kata kunci, badan yang bersamaan akan dilaksanakan pada masa tamat. Sekiranya tiada kata kunci masa tamat digunakan, tindakan null implisit dilaksanakan pada waktu tamat. Tempoh tamat lalai adalah 10 saat tetapi mungkin ditetapkan, sebagai contoh kepada 30, dengan arahan "menetapkan masa tunggu 30". Masa tamat tak terhingga boleh ditetapkan oleh nilai -1. Sekiranya corak adalah lalai kata kunci, badan yang bersesuaian dilaksanakan pada waktu tamat atau akhir fail.

Sekiranya corak sepadan, maka badan yang sama akan dilaksanakan. jangkaan mengembalikan hasil badan (atau rentetan kosong jika tiada pola dipadankan). Sekiranya beberapa pola sepadan, yang pertama muncul digunakan untuk memilih badan.

Setiap kali output baru tiba, ia dibandingkan dengan setiap corak dalam susunan yang disenaraikan. Oleh itu, anda boleh menguji ketiadaan perlawanan dengan membuat corak terakhir sesuatu yang dijamin muncul, seperti pantas. Dalam keadaan di mana tidak ada tindakan segera, anda mesti menggunakan masa tunggu (sama seperti yang anda lakukan jika anda berinteraksi secara manual).

Corak dinyatakan dalam tiga cara. Secara lalai, corak ditentukan dengan arahan perlawanan rentetan Tcl. (Corak sedemikian juga sama dengan ekspresi biasa C-shell yang biasanya dirujuk sebagai corak "glob"). Bendera -gl mungkin digunakan untuk melindungi corak yang mungkin sepadan dengan bendera yang diharapkan daripada berbuat demikian. Sebarang corak yang bermula dengan "-" harus dilindungi dengan cara ini. (Semua rentetan bermula dengan "-" dikhaskan untuk pilihan masa hadapan.)

Sebagai contoh, serpihan berikut mencari log masuk yang berjaya. (Perhatikan bahawa membatalkan dianggap sebagai prosedur yang ditakrifkan di tempat lain dalam skrip.)

mengharapkan {sibuk {meletakkan sibuk \ n; exp_continue} gagal membatalkan "kata laluan tidak sah" abort timeout abort disambungkan}

Petikan adalah perlu pada corak keempat kerana ia mengandungi ruang, yang sebaliknya akan memisahkan corak dari tindakan. Corak dengan tindakan yang sama (seperti ke-3 dan ke-4) memerlukan penyenaraian semula tindakan. Ini boleh dielakkan dengan menggunakan corak gaya regexp (lihat di bawah). Maklumat lanjut tentang membentuk corak gaya glob boleh didapati dalam manual Tcl.

Corak gaya regexp mengikuti sintaks yang ditakrifkan oleh registri Tcl (pendek untuk "ungkapan biasa") perintah. corak regexp diperkenalkan dengan bendera -re . Contoh terdahulu boleh ditulis semula menggunakan regexp sebagai:

mengharapkan {sibuk {meletakkan sibuk \ n; exp_continue} -re "gagal | kata laluan tidak sah" abort timeout abort disambungkan}

Kedua-dua jenis corak adalah "unanchored". Ini bermakna corak tidak sepadan dengan keseluruhan rentetan, tetapi boleh memulakan dan menamatkan perlawanan di mana-mana dalam rentetan (selagi segala yang lain sepadan). Gunakan ^ untuk memadankan permulaan rentetan, dan $ untuk memadankan hujungnya. Ambil perhatian bahawa jika anda tidak menunggu akhir rentetan, respons anda dapat dengan mudah berakhir di tengah tali kerana mereka bergema dari proses yang dihasilkan. Walaupun masih menghasilkan keputusan yang betul, output boleh kelihatan tidak wajar. Oleh itu, penggunaan $ digalakkan jika anda betul-betul dapat menggambarkan watak-watak pada akhir rentetan.

Perhatikan bahawa dalam banyak editor, ^ dan $ sepadan dengan permulaan dan akhir baris masing-masing. Walau bagaimanapun, kerana jangkaan tidak berorientasikan garis, watak-watak ini sepadan dengan permulaan dan akhir data (berbanding dengan baris) pada masa ini dalam penampan sepadan yang diharapkan. (Juga, lihat nota di bawah pada "masalah pencernaan sistem.")

Bendera -ex menyebabkan pola dipadankan sebagai rentetan "tepat". Tiada tafsiran *, ^, dan sebagainya dibuat (walaupun konvensyen Tcl biasa masih harus diperhatikan). Corak yang tepat sentiasa tidak disahkan.

Bendera-bendera menyebabkan huruf besar output untuk membandingkan seolah-olah mereka huruf kecil. Corak tidak terjejas.

Semasa membaca output, lebih daripada 2000 bait boleh memaksa bait lebih awal untuk "dilupakan". Ini boleh diubah dengan match_max fungsi. (Perhatikan bahawa nilai yang berlebihan boleh melambatkan pemadanan corak.) Jika patlist adalah full_buffer , badan yang bersesuaian dilaksanakan jika byte match_max telah diterima dan tiada pola lain yang dipadankan. Sama ada kata kunci full_buffer digunakan, watak-watak yang dilupakan dituliskan kepada expect_out (penampan).

Jika patlist adalah kata kunci batal , dan nulls dibenarkan (melalui perintah remove_nulls ), badan yang bersamaan dijalankan jika satu ASCII 0 dipadankan. Tidak dapat dipadankan 0 byte melalui pola glob atau regexp.

Apabila memadankan corak (atau eof atau full_buffer), output yang hampir sama dan tidak dapat ditandingi akan disimpan dalam variable expect_out (penampan) . Sehingga 9 perlawanan substring regexp disimpan dalam variable expect_out (1, string) melalui expect_out (9, string) . Jika bendera -indeks digunakan sebelum corak, indeks bermula dan berakhir (dalam bentuk yang sesuai untuk lrange ) daripada 10 rentetan disimpan dalam variabel expect_out (X, bermula) dan expect_out (X, akhir) di mana X adalah digit, sepadan dengan kedudukan substring dalam penampan. 0 merujuk kepada rentetan yang sepadan dengan keseluruhan corak dan dihasilkan untuk corak glob serta corak regexp. Contohnya, jika proses menghasilkan output "abcdefgh \ n", hasil daripada:

mengharapkan "cd"

seolah-olah pernyataan berikut telah dilaksanakan:

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

dan "efgh \ n" dibiarkan dalam penampan output. Jika suatu proses menghasilkan output "abbbcabkkkka \ n", hasil daripada:

mengharapkan -indeks -re "b (b *). * (k +)"

seolah-olah pernyataan berikut telah dilaksanakan:

set expect_out (0, bermula) set set expect_out (0, string) bbbcabkkkk set expect_out (1, mulakan) 2 set expect_out (1, mulakan) (2, mulakan) 10 set expect_out (2, akhir) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

dan "a \ n" dibiarkan dalam penampan output. Corak "*" (dan -re ". *") Akan mengepam penimbal output tanpa membaca lebih banyak output daripada proses.

Biasanya, output yang dipadankan dibuang dari buffer dalaman Harapan. Ini boleh dihalang dengan menggunakan pola dengan bendera- nransfer . Bendera ini amat berguna dalam eksperimen (dan boleh disingkat ke "-not" untuk kemudahan semasa bereksperimen).

The spawn id yang berkaitan dengan output yang sepadan (atau eof atau full_buffer) disimpan dalam expect_out (spawn_id) .

The -timeout flag menyebabkan arahan mengharapkan semasa untuk menggunakan nilai berikut sebagai timeout dan bukannya menggunakan nilai pembolehubah timeout.

Secara lalai, pola dipadankan dengan output daripada proses semasa, namun bendera -i mengisytiharkan output dari senarai bernama spawn_id dipadankan dengan pola berikut (sehingga ke -i seterusnya). Senarai spawn_id mestilah menjadi ruang spasi yang berasingan dipisahkan daripada spawn_ids atau pembolehubah yang merujuk kepada senarai spawn_id semacam itu.

Sebagai contoh, contoh berikut menunggu "disambungkan" dari proses semasa, atau "sibuk", "gagal" atau "kata laluan tidak sah" dari spawn_id yang dinamakan oleh $ proc2.

menjangka {-i $ proc2 sibuk {meletakkan sibuk \ n; exp_continue} -re "gagal | kata laluan tidak sah" abort timeout abort disambungkan}

Nilai pembolehubah global any_spawn_id boleh digunakan untuk memadankan pola kepada mana-mana spawn_ids yang dinamakan dengan semua bendera -i dalam perintah jangkaan semasa. The spawn_id dari bendera ai tanpa corak yang berkaitan (iaitu, diikuti dengan segera oleh yang lain -i ) disediakan kepada mana-mana corak lain dalam arahan jangkaan yang sama yang berkaitan dengan any_spawn_id.

Bendera -i juga boleh menamakan pembolehubah global di mana pembolehubah dibaca untuk senarai ungu bertelur. Pembolehubah dibaca semula apabila ia berubah. Ini memberikan satu cara untuk menukar sumber I / O sementara arahan sedang dilaksanakan. Ion ular yang disediakan dengan cara ini dinamakan id yang tidak langsung.

Tindakan seperti memecahkan dan terus menyebabkan struktur kawalan (iaitu, untuk , proc ) untuk berkelakuan dengan cara yang biasa. Perintah exp_continue membolehkan mengharapkan dirinya untuk terus melaksanakan dan bukannya kembali seperti biasanya.

Ini berguna untuk mengelakkan gelung yang jelas atau mengulangi kenyataan yang diharapkan. Contoh berikut adalah sebahagian daripada fragmen untuk mengautomasikan rlogin. Exp_continue mengelakkan daripada menulis pernyataan jangkaan kedua (untuk mencari kembali lagi) jika rlogin meminta kata laluan.

mengharapkan {password: {stty -echo send_user "kata laluan (untuk $ pengguna) di $ host:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out (1, string) echo exp_continue} tidak sah {send_user "kata laluan tidak sah atau akaun \ n" exit} sambungan jangka masa {send_user "kepada tuan rumah $ habis masa \ n" keluar} sambungan eo {send_user \ "ke hos gagal: $ expect_out (penampan) re $ prompt}

Sebagai contoh, serpihan berikut mungkin membantu pengguna membimbing interaksi yang sudah benar-benar automatik. Dalam kes ini, terminal dimasukkan ke dalam mod mentah. Sekiranya pengguna menekan "+", pembolehubah dilanjutkan. Jika "p" ditekan, beberapa pulangan dihantar ke proses, mungkin untuk mencubit dalam beberapa cara, dan "i" membolehkan pengguna berinteraksi dengan proses, dengan berkesan mencuri kawalan dari skrip. Dalam setiap kes, exp_continue membenarkan jangkaan semasa untuk meneruskan pencocokan padanan selepas melaksanakan tindakan semasa.

stty mentah -echo expect_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {berinteraksi; exp_continue} "berhenti" keluar}

Secara lalai, exp_continue menetapkan semula pemasa habis masa. Pemasa tidak dimulakan semula, jika exp_continue dipanggil dengan flag -continue_timer .

expect_after [expect_args]
berfungsi dengan identik dengan harapan_sebelumnya kecuali jika corak dari kedua-dua mengharapkan dan expect_after dapat dipadankan, corak yang diharapkan digunakan. Lihat arahan expect_before untuk maklumat lanjut.

expect_background [expect_args]
mengambil hujah yang sama seperti yang diharapkan , namun ia kembali dengan segera. Corak diuji setiap kali input baru tiba. Masa tamat dan lalai corak tidak bermakna kepada expect_background dan dibuang secara senyap. Jika tidak, arahan expect_background menggunakan expect_before dan expect_after pola seperti yang diharapkan .

Apabila tindakan expect_background sedang dievaluasi, pemprosesan latar belakang untuk id bertelur yang sama disekat. Pemprosesan latar belakang disekat apabila tindakan selesai. Walaupun pemprosesan latar belakang disekat, adalah mungkin untuk melakukan (latar depan) mengharapkan pada id bertelur yang sama.

Ia tidak mustahil untuk melaksanakan jangkaan sementara expect_background dibatalkan. expect_background untuk id tajam tertentu dipadamkan dengan mengisytiharkan expect_background baru dengan id bertelur yang sama. Mengisytiharkan expect_background tanpa pola menghilangkan spawn spawn yang diberikan dari kemampuan untuk mencocokkan corak di latar belakang.

expect_before [expect_args]
mengambil hujah yang sama seperti yang diharapkan , namun ia kembali dengan segera. Pasangan corak-tindakan dari expect_before yang paling terkini dengan id bertelur yang sama secara tersirat ditambahkan pada mana-mana arahan yang diharapkan . Sekiranya coraknya sepadan, ia diperlakukan seolah-olah ia telah ditentukan dalam arahan jangkaan itu sendiri, dan badan bersekutu dilaksanakan dalam konteks perintah yang diharapkan . Sekiranya corak dari harapan dan jangkaan kedua dapat dipadankan, corak expect_before digunakan.

Sekiranya tiada corak ditentukan, id bertelur tidak diperiksa untuk sebarang corak.

Kecuali ditinggikan oleh bendera ai , expect_before pola sepadan dengan id bertelur yang ditakrifkan pada masa arahan expect_before dilaksanakan (bukan apabila coraknya dipadankan).

Bendera -info menyebabkan harapan_before untuk mengembalikan spesifikasi semasa pola apa yang akan dipadankan. Secara lalai, ia melaporkan id bertelur semasa. Spesifikasi id bertelur pilihan boleh diberikan untuk maklumat mengenai id bertelur itu. Sebagai contoh

expect_before -info -i $ proc

Paling banyaknya satu spesifikasi spawn id dapat diberikan. Secara langsung, bendera itu menafikan id ula langsung yang hanya datang dari spesifikasi tidak langsung.

Daripada spesifikasi id bertelur, bendera "-all" akan menyebabkan "-info" melaporkan pada semua ungu bertelur.

Output bendera -info boleh digunakan semula sebagai hujah yang diharapkan_before.

expect_tty [expect_args]
adalah seperti jangkaan tetapi ia membaca aksara dari / dev / tty (iaitu ketukan kekunci dari pengguna). Secara lalai, bacaan dilakukan dalam mod yang dimasak. Oleh itu, garisan mesti berakhir dengan pengembalian agar dapat melihatnya. Ini boleh diubah melalui stty (lihat arahan stty di bawah).

expect_user [expect_args]
seperti jangkaan tetapi ia membaca aksara dari stdin (iaitu ketukan kekunci dari pengguna). Secara lalai, bacaan dilakukan dalam mod yang dimasak. Oleh itu, garisan mesti berakhir dengan pengembalian agar dapat melihatnya. Ini boleh diubah melalui stty (lihat arahan stty di bawah).

garpu
mewujudkan satu proses baru. Proses baru adalah salinan sebenar proses Harapan semasa. Pada kejayaan, garpu mengembalikan 0 ke proses (anak) baru dan mengembalikan ID proses proses kanak-kanak kepada proses induk. Kegagalan (selalu disebabkan kekurangan sumber, contohnya, ruang swap, memori), garpu mengembalikan -1 ke proses induk, dan tidak ada proses anak dibuat.

Proses pemisahan keluar melalui arahan keluar , sama seperti proses asal. Proses yang dipecahkan dibenarkan untuk menulis ke fail log. Jika anda tidak melumpuhkan penyahpepijatan atau pembalakan dalam kebanyakan proses, hasilnya dapat mengelirukan.

Sesetengah pelaksanaan pty mungkin dikelirukan oleh berbilang pembaca dan penulis, walaupun seketika. Oleh itu, ia adalah yang paling selamat untuk bernafasan sebelum proses pemijahan.

berinteraksi [string1 body1] ... [stringn [bodyn]]
memberikan kawalan proses semasa kepada pengguna, supaya ketukan kekunci dihantar ke proses semasa, dan stdout dan stderr proses semasa dikembalikan.

Pasangan rentetan badan boleh ditentukan sebagai argumen, di mana badan dijalankan apabila rentetan yang sama dimasukkan. (Secara lalai, rentetan tidak dihantar ke proses semasa.) Perintah juru bahasa diandaikan, jika badan terakhir hilang.

Sekiranya hujah-hujah terhadap keseluruhan pernyataan berinteraksi memerlukan lebih daripada satu baris, semua hujah boleh "disandarkan" menjadi satu untuk mengelakkan mengakhiri setiap baris dengan garis belakang. Dalam satu kes ini, penggantian Tcl biasa akan berlaku walaupun penyokong gigi.

Sebagai contoh, arahan berikut berjalan berinteraksi dengan pasangan rentetan-bentuk berikut yang ditakrifkan: Apabila ^ Z ditekan, Diharapkan digantung. (Bendera resit mengembalikan mod terminal.) Apabila ^ A ditekan, pengguna melihat "anda menaip kawalan-A" dan proses dihantar ^ A. Apabila $ ditekan, pengguna melihat tarikhnya. Apabila ^ C ditekan, Harapkan keluar. Jika "foo" dimasukkan, pengguna melihat "bar". Apabila ~ ~ ditekan, jurubahasa Jangka berjalan secara interaktif.

tetapkan CTRLZ \ 032 berinteraksi {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "anda menaip kawalan-A \ n"; hantar "\ 001"} $ {send_user "Tarikh itu [format jam [jam saat]]."} \ 003 exit foo {send_user "bar"} ~~}

Dalam pasangan rentetan badan, rentetan dipadankan dengan urutan yang disenaraikan sebagai argumen. Strings yang sepadan dengan sepadan tidak dihantar ke proses semasa dengan menjangka selebihnya akan datang. Jika watak-watak kemudian dimasuki supaya tidak lagi mungkin perlawanan, hanya bahagian rentetan akan dihantar ke proses yang mungkin tidak dapat memulakan satu lagi perlawanan. Oleh itu, rentetan yang substrings perlawanan separa boleh dipadankan kemudian, jika rentetan asal yang cuba dipadankan akhirnya gagal.

Secara lalai, padanan rentetan adalah tepat tanpa kad liar . (Sebaliknya, arahan mengharapkan menggunakan corak gaya glob secara lalai.) Bendera -ex boleh digunakan untuk melindungi corak yang mungkin sepadan dengan bendera berinteraksi daripada berbuat demikian. Sebarang corak yang bermula dengan "-" harus dilindungi dengan cara ini. (Semua rentetan bermula dengan "-" dikhaskan untuk pilihan masa hadapan.)

The -re flag memaksa rentetan itu ditafsirkan sebagai corak gaya regexp. Dalam kes ini, subzip yang sepadan disimpan dalam variabel interact_out sama dengan cara yang diharapkan menyimpan outputnya dalam variable expect_out . Bendera -indeks juga disokong.

Pola eof memperkenalkan tindakan yang dilaksanakan pada akhir fail. Corak eo yang berasingan juga boleh mengikuti bendera- output yang mana ia dipadankan jika eof dikesan semasa menulis output. Tindakan default adalah "kembali", sehingga berinteraksi dengan mudah kembali ke mana-mana EOF.

Waktu tamat pola memperkenalkan waktu tunggu (dalam saat) dan tindakan yang dilaksanakan setelah tiada aksara telah dibaca untuk masa yang diberikan. Corak masa tamat terpakai untuk proses yang paling baru-baru ini. Tiada masa tamat lalai. Pembolehubah khas "tamat masa" (digunakan oleh perintah jangkaan ) tidak menjejaskan masa tamat ini.

Sebagai contoh, pernyataan berikut boleh digunakan untuk pengguna autologout yang tidak menaip apa-apa selama satu jam tetapi yang masih menerima mesej sistem kerap:

berinteraksi -input $ user_spawn_id timeout 3600 return -output \ $ spawn_id

Sekiranya corak adalah kata kunci batal , dan nulls dibenarkan (melalui perintah remove_nulls ), badan yang bersamaan akan dilaksanakan jika satu ASCII 0 dipadankan. Tidak dapat dipadankan 0 byte melalui pola glob atau regexp.

Memperkenalkan corak dengan flag -iwrite menyebabkan pembolehubah interact_out (spawn_id) ditetapkan ke spawn_id yang cocok dengan pola (atau eof).

Tindakan seperti memecahkan dan terus menyebabkan struktur kawalan (iaitu, untuk , proc ) untuk berkelakuan dengan cara yang biasa. Walau bagaimanapun, pulangan menyebabkan berinteraksi untuk kembali kepada penelponnya , sementara inter_return menyebabkan berinteraksi untuk menyebabkan pulangan dalam pemanggilnya. Contohnya, jika "proc foo" dipanggil berinteraksi yang kemudiannya melaksanakan tindakan inter_return , proc foo akan kembali. (Ini bermakna jika interaksi panggilan interpreter berinteraksi secara menaip akan menyebabkan interaksi diteruskan, sementara inter_return akan menyebabkan interaksi itu kembali kepada pemanggilnya.)

Semasa berinteraksi , mod mentah digunakan supaya semua aksara dapat disampaikan kepada proses semasa. Jika proses semasa tidak menangkap isyarat kawalan kerja, ia akan berhenti jika menghantar isyarat berhenti (secara lalai ^ Z). Untuk memulakannya semula, hantar isyarat terus (seperti dengan "kill -CONT"). Sekiranya anda benar-benar mahu menghantar SIGSTOP ke proses tersebut (oleh ^ Z), pertimbangkan cawangan pemula pertama dan kemudian menjalankan program anda. Sebaliknya, jika anda mahu menghantar SIGSTOP ke Harapkan sendiri, interpreter panggilan pertama (mungkin dengan menggunakan aksara melarikan diri), dan kemudian tekan ^ Z.

Pasangan rentetan badan boleh digunakan sebagai singkatan untuk mengelakkan diri daripada memasuki penterjemah dan melaksanakan perintah secara interaktif. Mod terminal sebelumnya digunakan semasa badan pasangan rentetan badan sedang dijalankan.

Untuk kelajuan, tindakan dilaksanakan dalam mod mentah secara lalai. Bendera -reset mengeset semula terminal ke mod yang dimiliki sebelum beraksi dijalankan (selalu, mod yang dimasak). Ambil perhatian bahawa aksara yang dimasukkan apabila mod sedang dihidupkan mungkin hilang (ciri malang bagi pemandu terminal pada sesetengah sistem). Satu-satunya sebab untuk menggunakan -reset adalah jika tindakan anda bergantung pada berjalan dalam mod yang dimasak.

Bendera -echo menghantar watak-watak yang sepadan dengan corak berikut kembali kepada proses yang menghasilkannya kerana setiap watak dibaca. Ini mungkin berguna apabila pengguna perlu melihat maklum balas daripada corak sebahagian yang ditaip.

Sekiranya corak sedang bergema tetapi akhirnya tidak dapat dipadankan, watak-watak dihantar ke proses melahirkan. Sekiranya proses melahirkan itu menggema mereka, pengguna akan melihat aksara dua kali. -echo mungkin hanya sesuai dalam situasi di mana pengguna tidak mungkin menyelesaikan pola tersebut. Sebagai contoh, petikan berikut adalah dari rftp, skrip rekursif-ftp, di mana pengguna diminta memasukkan ~ g, ~ p, atau ~ l, untuk mendapatkan, meletakkan, atau menyenaraikan direktori semasa secara rekursif. Ini jauh dari arahan normal ftp, bahawa pengguna tidak mungkin mengetik ~ diikuti dengan apa-apa lagi, kecuali tersilap, dalam hal ini, mereka mungkin akan mengabaikan hasilnya pula.

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

Bendera -nobuffer menghantar aksara yang sepadan dengan corak berikut ke proses keluaran apabila aksara dibaca.

Ini berguna apabila anda ingin membiarkan program menggema semula corak. Sebagai contoh, berikut mungkin digunakan untuk memantau di mana seseorang sedang mendail (modem gaya Hayes). Setiap kali "atd" dilihat skrip log selebihnya.

[log masuk] "{interact -nobuffer -re" (. *) \ r "mengembalikan log $" [format jam [jam saat]]: dipanggil $ interact_out (1, string) "} interact -nobuffer"

Semasa berinteraksi , penggunaan sebelumnya log_user diabaikan. Khususnya, berinteraksi akan memaksa outputnya dilog (dihantar ke output standard) kerana dianggap pengguna tidak ingin berinteraksi secara membabi buta.

The -o flag menyebabkan mana-mana pasangan kunci utama untuk digunakan pada keluaran proses semasa. Ini boleh berguna, contohnya, apabila berurusan dengan tuan rumah yang menghantar aksara yang tidak diingini semasa sesi telnet.

Secara lalai, berinteraksi mengharapkan pengguna untuk menulis stdin dan membaca stdout proses Harapan itu sendiri. Bendera -u (untuk "pengguna") membuat berinteraksi mencari pengguna sebagai proses yang dinamakan oleh hujahnya (yang mesti menjadi id yang dihasilkan).

Ini membolehkan dua proses yang tidak berkaitan untuk disatukan tanpa menggunakan gelung eksplisit. Untuk membantu penyahpepijatan, Harapkan diagnostik selalu pergi ke stderr (atau stdout untuk maklumat penebangan dan debugging tertentu). Atas sebab yang sama, arahan interpreter akan dibaca secara interaktif dari stdin.

Sebagai contoh, serpihan berikut mencipta proses log masuk. Kemudian ia mendail pengguna (tidak dipaparkan), dan akhirnya menghubungkan keduanya bersama-sama. Sudah tentu, sebarang proses boleh digantikan untuk login. Sebagai shell, misalnya, akan membolehkan pengguna berfungsi tanpa membekalkan akaun dan kata laluan.

login spawn set login $ spawn_id spawn tip modem # dail kembali ke user # connect user to login interact -u $ login

Untuk menghantar output ke pelbagai proses, senaraikan senarai id bertelur yang diisi oleh bendera a- output . Input bagi sekumpulan keluaran spawn keluaran boleh ditentukan oleh senarai id bertelur yang diikuti oleh bendera-bendera. (Both -input dan -output mungkin mengambil senarai dalam bentuk yang sama seperti bendera -i dalam perintah jangkaan , kecuali bahawa any_spawn_id tidak bermakna dalam berinteraksi .) Semua bendera dan rentetan (atau corak berikut) berlaku untuk input ini sehingga yang lain - bendera input muncul. Jika tiada input , -putput bermakna "-input $ user_spawn_id -output". (Begitu juga, dengan corak yang tidak mempunyai input ). Jika satu perputaran ditentukan, ia akan mengatasi $ user_spawn_id. Sekiranya input kedua ditentukan, ia mengatasi $ spawn_id. Bendera tambahan boleh ditentukan.

Kedua-dua proses input tersirat adalah lalai untuk mempunyai output yang ditentukan sebagai $ spawn_id dan $ user_spawn_id (sebaliknya). Jika bendera di -put muncul dengan bendera tiada- output , aksara dari proses itu dibuang.

Bendera -i memperkenalkan pengganti untuk spawn_id semasa apabila tiada bendera atau output yang lain digunakan. Bendera A -i menyiratkan bendera -o.

Adalah mungkin untuk mengubah proses-proses yang sedang berinteraksi dengan menggunakan ungung tidak langsung. (Tompok engkol tidak langsung dijelaskan dalam bahagian pada arahan jangkaan.) Ijau tidak langsung boleh ditentukan dengan bendera -i, -u, -input, atau -output.

jurubahasa [args]
menyebabkan pengguna menjadi diminta secara interaktif untuk arahan Harapan dan Tcl. Hasil setiap arahan dicetak.

Tindakan seperti memecahkan dan terus menyebabkan struktur kawalan (iaitu, untuk , proc ) untuk berkelakuan dengan cara yang biasa. Walau bagaimanapun, pengembalian menyebabkan jurubahasa kembali kepada pemanggilnya, sementara inter_return menyebabkan jurubahasa menyebabkan pulangan dalam pemanggilnya. Sebagai contoh, jika "proc foo" dipanggil jurubahasa yang kemudian melaksanakan tindakan inter_return , proc foo akan kembali. Sebarang arahan lain menyebabkan jurubahasa terus menerus mendorong arahan baru.

Secara lalai, petikan mengandungi dua bulat. Integer pertama menggambarkan kedalaman timbunan penilaian (iaitu, berapa kali Tcl_Eval telah dipanggil). Integer kedua ialah pengenal sejarah Tcl. Gesaan boleh ditetapkan dengan menentukan prosedur yang dipanggil "prompt1" yang nilai pulangannya menjadi petanda seterusnya. Sekiranya pernyataan mempunyai sebut harga terbuka, parens, pendakap, atau tanda kurung, perbaruan sekunder (secara lalai "+>") dikeluarkan pada baris baru. Permintaan sekunder boleh ditetapkan dengan menentukan prosedur yang dipanggil "prompt2".

Semasa jurubahasa , mod yang dimasak digunakan, walaupun pemanggilnya menggunakan mod mentah.

Sekiranya stdin ditutup, jurubahasa akan kembali melainkan jika bendera-bendera digunakan, di mana hujah berikutnya dipanggil.

log_file [args] [[-a] fail]
Jika nama fail disediakan, log_file akan merakam transkrip sesi (bermula pada titik itu) dalam fail. log_file akan berhenti merakam jika tiada hujah diberikan. Sebarang fail log terdahulu ditutup.

Daripada nama fail, pengenalpasti fail Tcl boleh disediakan dengan menggunakan bendera- buka atau bendera- putaran . Ini sama dengan perintah bertelur . (Lihat bertelur untuk maklumat lanjut.)

The -a flag forces output to be logged that was suppressed by log_user command.

Secara lalai, arahan log_file ditambahkan pada fail lama dan bukannya memotong mereka, untuk kemudahan dapat mematikan log masuk dan berbilang kali dalam satu sesi. Untuk memangkas fail, gunakan bendera -nampak .

Bendera-info menimbulkan log_file untuk mengembalikan keterangan hujah bukan maklumat terbaru yang diberikan.

log_user -info | 0 | 1
Secara lalai, dialog hantar / mengharapkan login untuk stdout (dan fail log jika dibuka). Pembalakan ke stdout dilumpuhkan oleh perintah "log_user 0" dan dibolehkan semula oleh "log_user 1". Log masuk ke fail log tidak berubah.

Bendera -info menimbulkan log_user untuk mengembalikan keterangan hujah bukan maklumat terbaru yang diberikan.

match_max [-d] [-i spawn_id] [size]
mentakrifkan saiz penampan (dalam bait) yang digunakan secara dalaman oleh jangkaan . Tanpa hujah saiz , saiz semasa dikembalikan.

Dengan bendera -d , saiz lalai ditetapkan. (Default default adalah 2000.) Dengan bendera -i , saiz ditetapkan untuk id yang bernama bernama, jika tidak, ia ditetapkan untuk proses semasa.

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
melaksanakan "program args" sebagai ganti program Harapan semasa, yang tamat. Argumen hipetan kosong menimbulkan tanda hubung di depan nama arahan seolah-olah ia merupakan shell masuk. Semua spawn_ids ditutup kecuali bagi mereka yang dinamakan sebagai argumen. Ini dipetakan ke pengenal fail bernama.

Spawn_ids dipetakan ke pengenal fail untuk program baru untuk mewarisi. Contohnya, baris berikut menjalankan catur dan membolehkannya dikawal oleh proses semasa - katakanlah, tuan catur.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id catur

Ini lebih berkesan daripada "berinteraksi -u", bagaimanapun, ia mengorbankan keupayaan untuk melakukan interaksi yang diprogramkan kerana proses Harapan tidak lagi terkawal.

Perhatikan bahawa tiada terminal kawalan disediakan. Oleh itu, jika anda memutuskan sambungan atau remap input standard, program yang melakukan kawalan kerja (kerang, login, dll) tidak berfungsi dengan baik.

pariti [-d] [-i spawn_id] [nilai]
mentakrifkan sama ada pariti perlu dikekalkan atau dilucutkan dari keluaran proses pengeluaran. Jika nilai sifar, pariti dilucutkan, jika tidak, ia tidak dilucutkan. Tanpa hujah nilai , nilai semasa dikembalikan.

Dengan bendera -d , nilai pariti lalai ditetapkan. (Lalai awal adalah 1, iaitu pariti tidak dilucutkan.) Dengan bendera -i , nilai pariti ditetapkan untuk id yang bertulis, jika tidak, ia ditetapkan untuk proses semasa.

remove_nulls [-d] [-i spawn_id] [value]
mentakrifkan sama ada batal ditahan atau dikeluarkan daripada output proses yang dihasilkan sebelum pencocokan corak atau menyimpan dalam variable expect_out atau interact_out . Jika nilai adalah 1, batal akan dikeluarkan. Jika nilai adalah 0, null tidak dikeluarkan. Tanpa hujah nilai , nilai semasa dikembalikan.

Dengan bendera -d , nilai lalai ditetapkan. (Lalai asal ialah 1, iaitu, nulls dikeluarkan.) Dengan bendera -i , nilai ditetapkan untuk id yang bertulis, jika tidak, ia ditetapkan untuk proses semasa.

Sama ada batal atau tidak dikeluarkan, Harapan akan merakam batal baki ke log dan stdout.

hantar rentetan [-flags]
Menghantar rentetan ke proses semasa. Sebagai contoh, arahan itu

hantar "hello world \"

menghantar aksara, helloworld ke proses semasa. (Tcl termasuk arahan printf- seperti ( format yang dipanggil) yang boleh membina rentetan yang rumit.)

Watak dihantar dengan serta-merta walaupun program dengan input baris buffer tidak akan membaca aksara sehingga aksara kembali dihantar. Sifat pemulangan dilambangkan "\ r".

- Bendera memaksa hujah seterusnya untuk ditafsirkan sebagai rentetan dan bukan bendera. Sebarang rentetan boleh didahului dengan "-" sama ada ia kelihatan seperti bendera atau tidak. Ini menyediakan mekanisme yang boleh dipercayai untuk menentukan rentetan berubah tanpa terperangkap oleh orang-orang yang kelihatan seperti bendera tidak sengaja. (Semua rentetan bermula dengan "-" dikhaskan untuk pilihan masa hadapan.)

Bendera -i mengisytiharkan bahawa rentetan akan dihantar ke spawn_id yang dinamakan. Jika spawn_id adalah user_spawn_id , dan terminal dalam mod mentah, baris baru dalam rentetan itu diterjemahkan untuk mengembalikan urutan baru-baru supaya ia muncul seolah-olah terminal itu dalam mod yang dimasak. Bendera bendalir melumpuhkan terjemahan ini.

Bendera-bendera menghantar aksara null (0 bait). Secara lalai, satu batal dihantar. Integer boleh mengikuti -null untuk menunjukkan berapa banyak batal untuk dihantar.

Bendera-pecah menjana keadaan putus. Ini hanya masuk akal jika id bertelur merujuk kepada peranti tty yang dibuka melalui "spawn -open". Sekiranya anda telah menghasilkan proses seperti tip, anda harus menggunakan konvensyen tip untuk menjana rehat.

Bendera-bendera memaksa output dihantar "perlahan-lahan", oleh itu elakkan situasi biasa di mana komputer mengesan penimbal input yang direka untuk manusia yang tidak akan mengecewakan penyangga yang sama. Output ini dikawal oleh nilai pembolehubah "send_slow" yang mengambil dua senarai elemen. Elemen pertama adalah integer yang menggambarkan bilangan bait untuk dihantar secara atom. Unsur kedua adalah nombor nyata yang menggambarkan bilangan detik yang dihantar oleh atom yang mesti dipisahkan. Sebagai contoh, "set send_slow {10 .001}" akan memaksa "menghantar -s" untuk menghantar rentetan dengan 1 milisekon di antara setiap 10 aksara yang dihantar.

The -h bendera memaksa output dihantar (agak) seperti manusia sebenarnya menaip. Kelewatan seperti manusia muncul di antara watak-watak. (Algoritma ini berdasarkan kepada pengedaran Weibull, dengan pengubahsuaian yang sesuai dengan aplikasi tertentu ini.) Output ini dikawal oleh nilai pembolehubah "send_human" yang mengambil lima senarai elemen. Kedua-dua elemen pertama adalah masa perarakan rata-rata aksara dalam masa beberapa saat. Yang pertama digunakan secara lalai. Yang kedua digunakan pada ujung kata, untuk mensimulasikan jeda halus yang kadang-kadang terjadi pada peralihan tersebut. Parameter ketiga adalah ukuran variabiliti di mana .1 adalah agak berubah, 1 adalah pemboleh ubah yang semunasabahnya, dan 10 adalah agak invariable. Keterlaluan adalah 0 hingga infiniti. Dua parameter terakhir adalah masing-masing, waktu interarrival minimum dan maksimum. Minimum dan maksimum digunakan terakhir dan "klip" masa terakhir. Purata muktamad boleh agak berbeza dari purata yang diberikan jika klip minimum dan maksimum cukup nilai.

Sebagai contoh, arahan berikut memberi emel yang cepat dan konsisten:

set send_human {.1 .3 1 .05 2} hantar -h "Saya lapar, makan siang."

manakala yang berikut mungkin lebih sesuai selepas mabuk:

set send_human {.4 .4 .2 .5 100} kirimkan -h "Selamat malam pesta Goodd!"

Perhatikan bahawa ralat tidak disimulasikan, walaupun anda boleh menetapkan situasi pembetulan ralat sendiri dengan membenamkan kesilapan dan pembetulan dalam hujalan hantar.

Bendera untuk menghantar aksara null, untuk menghantar rehat, untuk memaksa output perlahan dan untuk output gaya manusia adalah saling eksklusif. Hanya yang dinyatakan terakhir akan digunakan. Selain itu, tiada hujah rentetan boleh ditentukan dengan bendera untuk menghantar aksara atau pecahan null.

Adalah idea yang baik untuk mendahului penghantaran pertama ke proses dengan harapan . menjangkakan akan menunggu proses bermula, sementara hantar tidak boleh. Khususnya, jika penghantaran pertama selesai sebelum proses dijalankan, anda menjalankan risiko untuk mengabaikan data anda. Dalam situasi di mana program interaktif menawarkan tiada permulaan awal, anda boleh mendahului menghantar kelewatan seperti:

# Untuk mengelakkan memberi petunjuk penggodam mengenai cara memecah masuk, # sistem ini tidak meminta kata laluan luaran. # Tunggu selama 5 saat untuk melaksanakan untuk menyelesaikan telnet telanjang sangat.secure.gov tidur 5 hantar kata laluan \ r

exp_send adalah alias untuk dihantar. Jika anda menggunakan Expectk atau beberapa variasi lain yang Diharapkan dalam persekitaran Tk, penghantaran ditakrifkan oleh Tk untuk tujuan yang sama sekali berbeza. exp_send disediakan untuk kesesuaian antara persekitaran. Alias ​​serupa disediakan untuk arahan hantar lain yang lain.

string send_error [-flags]
seperti menghantar , kecuali output dihantar ke stderr daripada proses semasa.

send_log [-] rentetan
seperti menghantar , kecuali rentetan hanya dihantar ke fail log (lihat log_file .) Argumen tidak diendahkan jika tiada fail log terbuka.

send_tty [-flags] rentetan
seperti menghantar , kecuali output dihantar ke / dev / tty daripada proses semasa.

send_user [-flags] rentetan
seperti menghantar , kecuali output dihantar ke stdout daripada proses semasa.

tidur detik
menyebabkan skrip tidur untuk bilangan detik yang diberikan. Seconds boleh menjadi nombor perpuluhan. Interput (dan acara Tk jika anda menggunakan Expectk) diproses sementara Harapkan tidur.

menanam [args] program [args]
mewujudkan proses baru yang menjalankan " args program ". Stdin, stdout dan stderrnya disambungkan kepada Harapan, supaya mereka dapat dibaca dan ditulis oleh perintah Harapan lain. Sambungan dipecahkan secara dekat atau jika proses itu sendiri menutup mana-mana pengenalpasti fail.

Apabila proses dimulakan dengan bertelur , spawn_id berubah menjadi set deskriptor merujuk kepada proses tersebut . Proses yang dijelaskan oleh spawn_id dianggap sebagai " proses semasa ". spawn_id boleh dibaca atau ditulis, dengan berkesan menyediakan kawalan kerja.

user_spawn_id adalah pemboleh ubah global yang mengandungi deskriptor yang merujuk kepada pengguna. Sebagai contoh, apabila spawn_id ditetapkan kepada nilai ini, mengharapkan berlarutan seperti expect_user .

. Error_spawn_id adalah pembolehubah global yang mengandungi deskriptor yang merujuk kepada ralat standard. Sebagai contoh, apabila spawn_id ditetapkan kepada nilai ini, hantar berkelakuan seperti send_error .

tty_spawn_id adalah pembolehubah global yang mengandungi deskriptor yang merujuk kepada / dev / tty. Jika / dev / tty tidak wujud (seperti dalam cron, at, atau skrip batch), maka tty_spawn_id tidak ditakrifkan. Ini boleh diuji sebagai:

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

spawn mengembalikan id proses UNIX. Sekiranya tiada proses yang dihasilkan, 0 dikembalikan. Variabel spawn_out (hamba, nama) ditetapkan kepada nama peranti hamba pty.

Secara lalai, spawn menggema nama dan argumen arahan. Bendera -noecho berhenti bertelur daripada melakukan ini.

Bendera -console menyebabkan output konsol diarahkan semula ke proses melahirkan. Ini tidak disokong pada semua sistem.

Secara dalaman, spawn menggunakan pty, memulakan cara yang sama seperti tty pengguna. Ini selanjutnya dimulakan supaya semua tetapan "waras" (mengikut stty (1)). Jika pembolehubah stty_init ditakrifkan, ia ditafsirkan dalam gaya argumen stty sebagai konfigurasi lebih lanjut. Contohnya, "set stty_init mentah" akan menyebabkan terminal proses penambahan selanjutnya bermula dalam mod mentah. -notikopi melangkau inisialisasi berdasarkan tty pengguna. -nottyinit melangkau inisiasi "waras".

Biasanya, spawn memerlukan sedikit masa untuk dilaksanakan. Sekiranya anda perasan ubat-ubatan yang mengambil masa yang besar, kemungkinan besar terdapat masalah yang timbul. Sejumlah ujian dijalankan pada ptys untuk mengelakkan sebarang masalah dengan proses yang salah. (Ini mengambil masa 10 saat setiap pd.) Running Mengharapkan dengan pilihan -d akan menunjukkan jika Expect menghadapi banyak ptys dalam keadaan ganjil. Sekiranya anda tidak boleh membunuh proses-proses yang telah dilampirkan, maka satu-satunya cara anda untuk reboot.

Sekiranya program tidak dapat dihasilkan dengan berkesan kerana exec (2) gagal (misalnya apabila program tidak wujud), mesej ralat akan dikembalikan oleh interaksi seterusnya atau mengharapkan perintah seolah-olah program telah berjalan dan menghasilkan mesej ralat sebagai output. Tingkah laku ini adalah akibat semulajadi pelaksanaan spawn . Secara dalaman, garpu bertelur, selepas itu proses pemijatan tidak dapat berkomunikasi dengan proses Harapan asal kecuali melalui komunikasi melalui spawn_id.

Bendera -buka menyebabkan hujah seterusnya ditakrifkan sebagai pengenal fail Tcl (iaitu, dikembalikan dengan terbuka .) Id bertelur kemudian boleh digunakan seolah-olah ia adalah proses melahirkan. (Pengecam fail tidak lagi digunakan.) Ini membolehkan anda merawat peranti mentah, fail dan saluran paip sebagai proses melahirkan tanpa menggunakan pty. 0 dikembalikan untuk menunjukkan tiada proses yang berkaitan. Apabila sambungan ke proses melahirkan ditutup, begitu juga pengenalpasti fail Tcl. Bendera -leaveopen adalah serupa dengan -buka kecuali bahawa -lembus menyebabkan pengenal fail dibiarkan terbuka walaupun id bertelur ditutup.

Bendera -pty menyebabkan pty dibuka tetapi tiada proses yang dihasilkan. 0 dikembalikan untuk menunjukkan tiada proses yang berkaitan. Spawn_id ditetapkan seperti biasa.

Variabel spawn_out (hamba, fd) ditetapkan kepada pengenal fail sepadan dengan hamba pty. Ia boleh ditutup menggunakan "close -lave".

Bendera-bendera menandakan isyarat untuk diabaikan dalam proses melahirkan. Jika tidak, isyarat mendapatkan kelakuan lalai. Isyarat dinamakan dalam perintah perangkap , kecuali setiap isyarat memerlukan bendera yang berasingan.

tahap strace
menyebabkan penyataan berikut dicetak sebelum dilaksanakan. (Arahan jejak Tcl mengesan pembolehubah.) Tahap menunjukkan sejauh mana dalam tangkapan panggilan untuk mengesan. Sebagai contoh, arahan berikut berjalan Menjangkakan semasa menjejak 4 tahap panggilan pertama, tetapi tidak ada di bawah itu.

mengharapkan -c "strace 4" script.exp

The -info flag menyebabkan strace untuk kembali penerangan hujah bukan maklumat terbaru yang diberikan.

stty args
mengubah mod terminal sama seperti arahan stty luar.

Secara lalai, terminal kawalan dapat diakses. Terminal lain boleh diakses dengan memasukkan "Permintaan untuk mengembalikan statusnya sebagai hasil daripada perintah itu. Jika status tidak diminta dan terminal kawalan diakses, status atribut mentah dan echo sebelumnya dikembalikan dalam bentuk yang kemudiannya dapat digunakan oleh perintah itu.

Sebagai contoh, hujah - hujah yang mentah atau dimakan meletakkan terminal itu menjadi mod mentah. Argumen- rok atau dimasak meletakkan terminal ke dalam mod yang dimasak. Argumen echo dan -echo meletakkan terminal ke dalam mod echo dan noecho masing-masing.

Contoh berikut menggambarkan bagaimana untuk melumpuhkan penggera buat sementara waktu. Ini boleh digunakan dalam skrip yang tidak automatik untuk mengelakkan memasukkan kata laluan di dalamnya. (Lihat lebih banyak perbincangan tentang perkara ini di bawah EXPECT HINTS di bawah.)

stty -echo send_user "Kata Laluan:" expect_user -re "(. *) \ n" tetapkan kata laluan $ expect_out (1, string) stech echo

sistem args
memberikan args kepada sh (1) sebagai input, seolah-olah ia telah ditaip sebagai arahan dari terminal. Berharap menunggu sehingga shell berakhir. Status pulangan dari sh dikendalikan dengan cara yang sama yang menjalankan tugas mengembalikan statusnya.

Berbeza dengan exec yang mengalihkan stdin dan stdout ke skrip, sistem tidak melakukan redirection (selain dari yang ditunjukkan oleh string itu sendiri). Oleh itu, adalah mungkin untuk menggunakan program yang mesti bercakap terus dengan / dev / tty. Atas sebab yang sama, hasil sistem tidak direkodkan dalam log.

cap waktu [args]
mengembalikan cap waktu. Dengan tiada hujah, bilangan saat sejak zaman itu dikembalikan.

Bendera -format memperkenalkan rentetan yang dikembalikan tetapi dengan penggantian yang dibuat mengikut peraturan POSIX untuk strftime. Sebagai contoh% a digantikan dengan nama hari kerja ringkas (iaitu, Sabtu). Lain-lain ialah:

% nama lengkap hari kerja% Nama penuh hari kerja% b disingkat nama bulan% B nama bulan penuh% c tarikh masa seperti: Wed Oct 6 11:45:56 1993% d hari bulan (01-31% H jam (00-23)% I jam (01-12)% j hari (001-366)% m bulan (01-12)% M minit (00-59) % u hari (1-7, Isnin ialah hari pertama minggu)% U minggu (00-53, minggu pertama hari pertama minggu pertama)% minggu minggu (01-53, gaya ISO 8601) 6)% W minggu (00-53, hari pertama Isnin adalah hari pertama minggu)% x tarikh masa seperti: Wed Oct 6 1993% X masa seperti: 23:59:59% y tahun (00-99) % Y tahun seperti: 1993% Z zon waktu (atau tiada jika tidak dapat ditentukan) %% tanda tanda kosong

Spesifikasi% lain tidak jelas. Watak-watak lain akan dilalui tanpa disentuh. Hanya tempat C disokong.

Bendera kedua-dua itu memperkenalkan beberapa saat sejak zaman digunakan sebagai sumber dari mana formatnya. Jika tidak, masa semasa digunakan.

Bendera -gmt memaksimumkan cap waktu untuk menggunakan zon masa GMT . Tanpa bendera, zon masa setempat digunakan.

perangkap isyarat [[perintah]]
menyebabkan perintah yang diberikan akan dilaksanakan pada penerimaan masa depan mana-mana isyarat yang diberikan. Perintah ini dilaksanakan dalam skop global. Sekiranya arahan tidak hadir, tindakan isyarat dikembalikan. Jika arahan adalah tali SIG_IGN, isyarat tidak diendahkan. Sekiranya arahan adalah rentetan SIG_DFL, isyarat-isyarat yang terhasil kepada sistem lalai. isyarat adalah isyarat tunggal atau senarai isyarat. Isyarat boleh dinyatakan secara numerik atau simbol seperti isyarat (3). Awalan "SIG" boleh ditinggalkan.

Dengan tiada argumen (atau hujah-jumlah), perangkap mengembalikan nombor isyarat arahan perangkap yang sedang dilaksanakan.

Bendera-kod menggunakan kod pemulangan arahan di mana kod Tcl akan kembali apabila arahan mula berjalan.

Bendera- interp menyebabkan perintah itu dinilai dengan menggunakan penterjemah yang aktif pada masa perintah itu mula berjalan dan bukannya apabila perangkap itu diisytiharkan.

Bendera nama-nama menyebabkan arahan perangkap untuk mengembalikan nama isyarat arahan perangkap yang sedang dilaksanakan.

Bendera -max menyebabkan arahan perangkap untuk mengembalikan nombor isyarat terbesar yang boleh ditetapkan.

Contohnya, perangkap "perangkap {send_user" Ouch! "} SIGINT" akan mencetak "Ouch!" setiap kali pengguna menekan ^ C.

Secara lalai, SIGINT (yang biasanya boleh dijana dengan menekan ^ C) dan penyebab SIGTERM Berharap untuk keluar. Ini disebabkan perangkap berikut, yang dibuat secara lalai apabila Harapan bermula.

perangkap keluar {SIGINT SIGTERM}

Jika anda menggunakan bendera -D untuk memulakan penyahpepijat, SIGINT ditakrifkan semula untuk memulakan debugger interaktif. Ini disebabkan perangkap berikut:

perangkap {exp_debug 1} SIGINT

Perangkap debugger dapat diubah dengan menetapkan variabel lingkungan EXPECT_DEBUG_INIT ke perangkap baru.

Anda tentu saja boleh mengatasi kedua-dua ini dengan menambah perangkap perangkap ke skrip anda. Khususnya, jika anda mempunyai "perangkap keluar SIGINT" anda sendiri, ini akan mengatasi perangkap debugger. Ini berguna jika anda mahu menghalang pengguna daripada mendapat debugger sama sekali.

Jika anda ingin menentukan perangkap anda sendiri di SIGINT tetapi masih perangkap pada debugger semasa sedang berjalan, gunakan:

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

Sebagai alternatif, anda boleh memerangkap debugger menggunakan beberapa isyarat lain.

perangkap tidak akan membiarkan anda menimpa tindakan untuk SIGALRM kerana ini digunakan secara dalaman untuk Diharapkan . Perintah cabut menetapkan SIGALRM kepada SIG_IGN (abaikan). Anda boleh menghidupkan semula ini selagi anda melumpuhkannya semasa perintah bertintuk berikutnya.

Lihat isyarat (3) untuk maklumat lanjut.

tunggu [args]
penangguhan sehingga satu proses melahirkan (atau proses semasa jika tiada bernama) tamat.

tunggu biasanya mengembalikan senarai empat bulat. Integer pertama adalah pid proses yang sedang menunggu. Integer kedua ialah id bertelur yang sama. Integer ketiga adalah -1 jika ralat sistem operasi berlaku, atau 0 sebaliknya. Sekiranya integer ketiga adalah 0, integer keempat adalah status yang dikembalikan oleh proses yang dihasilkan. Jika integer ketiga adalah -1, integer keempat ialah nilai errno yang ditetapkan oleh sistem operasi. ErrorCode variabel global juga ditetapkan.

Elemen tambahan mungkin muncul pada akhir nilai pulangan daripada menunggu . Satu unsur kelima pilihan mengenal pasti kelas maklumat. Pada masa ini, satu-satunya nilai yang mungkin untuk elemen ini adalah CHILDKILLED di mana dua nilai seterusnya ialah nama isyarat C-gaya dan penerangan teks ringkas.

Bendera -i mengisytiharkan proses untuk menunggu sepadan dengan bernama spawn_id (BUKAN id proses ). Di dalam pengendali SIGCHLD, ada kemungkinan untuk menunggu apa-apa proses yang dihasilkan dengan menggunakan spawn id -1.

Bendera-sekarang ini menyebabkan menunggu untuk kembali segera dengan menunjukkan penantian yang berjaya. Apabila proses keluar (kemudian), ia akan hilang secara automatik tanpa memerlukan menunggu eksplisit.

Perintah tunggu juga boleh digunakan menunggu proses bercabang menggunakan argumen "-i -1". Tidak seperti penggunaannya dengan proses yang dihasilkan, perintah ini boleh dilaksanakan pada bila-bila masa. Tiada kawalan ke atas proses yang dituai. Walau bagaimanapun, nilai pulangan boleh diperiksa untuk id proses .

PERPUSTAKAAN

Jangkakan secara automatik mengetahui tentang dua perpustakaan terbina untuk Skrip Harapan. Ini ditakrifkan oleh direktori yang dinamakan dalam pembolehubah exp_library dan exp_exec_library. Kedua-duanya bertujuan untuk memuatkan fail utiliti yang boleh digunakan oleh skrip lain.

exp_library mengandungi fail bebas seni bina. exp_exec_library mengandungi fail bergantung kepada seni bina. Bergantung pada sistem anda, kedua-dua direktori mungkin benar-benar kosong. Kewujudan fail $ exp_exec_library / cat-buffer menerangkan sama ada penanda / bin / cat buffer secara lalai.

PRINTING PRETTY

Takrifan vgrind tersedia untuk skrip yang cukup mencetak. Dengan mengandaikan takrifan yang dibekalkan dengan pengedaran Harapan dipasang dengan betul, anda boleh menggunakannya sebagai:

vgrind -lexpect file

CONTOH

Banyak yang tidak jelas bagaimana untuk meletakkan semuanya bersama-sama bahawa halaman lelaki menggambarkan. Saya menggalakkan anda untuk membaca dan mencuba contoh dalam direktori contoh pengagihan Harapan . Sesetengah daripada mereka adalah program sebenar. Yang lain hanya menggambarkan teknik-teknik tertentu, dan tentu saja, pasangan hanya hacks cepat. Fail INSTALL mempunyai gambaran ringkas mengenai program-program ini.

Kertas Harapan (lihat LIHAT JUGA) juga berguna. Walaupun sesetengah makalah menggunakan sintaks yang sepadan dengan versi Harapan yang terdahulu, rasional yang disertakan masih sah dan menjadi lebih terperinci daripada halaman lelaki ini.

CAVEATS

Pelanjutan boleh bertembung dengan nama arahan Harapan. Sebagai contoh, penghantaran ditakrifkan oleh Tk untuk tujuan yang sama sekali berbeza. Atas sebab ini, kebanyakan arahan yang Diharapkan juga tersedia sebagai "exp_XXXX". Perintah dan pemboleh ubah yang bermula dengan "exp", "inter", "spawn", dan "timeout" tidak mempunyai alias. Gunakan nama perintah lanjutan jika anda memerlukan keserasian ini di antara persekitaran.

Jangkakan mengambil pandangan yang agak liberal mengenai peluasan. Khususnya, pembolehubah yang dibaca oleh arahan yang khusus untuk program Jangkaan akan dicari pertama dari skop tempatan, dan jika tidak dijumpai, dalam skop global. Sebagai contoh, ini meniadakan keperluan untuk meletakkan "masa tamat global" dalam setiap prosedur yang anda tulis yang menggunakan jangkaan . Sebaliknya, pembolehubah yang ditulis sentiasa berada dalam skop setempat (kecuali arahan "global" telah dikeluarkan). Masalah yang paling biasa penyebab ini adalah apabila spawn dilaksanakan dalam prosedur. Di luar prosedur, spawn_id tidak lagi wujud, jadi proses pengawalan tidak lagi dapat diakses hanya kerana scoping. Tambah "spawn_id global" kepada prosedur sedemikian.

Jika anda tidak dapat mendayakan keupayaan multispawning (iaitu, sistem anda tidak menyokong pilih (BSD *. *), Tinjauan (SVR> 2), atau sesuatu yang sama), Diharapkan hanya dapat mengawal satu proses pada satu masa. Dalam hal ini, jangan cuba untuk menetapkan spawn_id , dan jangan juga anda melaksanakan proses melalui eksekusi semasa proses pengawasan dijalankan. Selain itu, anda tidak akan dapat mengharapkan dari pelbagai proses (termasuk pengguna sebagai satu) pada masa yang sama.

Parameter terminal boleh memberi kesan besar pada skrip. Sebagai contoh, jika skrip ditulis untuk mencari suara, ia akan menjadi tidak menyenangkan jika bergema dimatikan. Atas sebab ini, Jangkakan parameter terminal piagam piawaian secara lalai. Malangnya, ini boleh membuat perkara yang tidak menyenangkan untuk program lain. Sebagai contoh, shell emacs mahu menukar pemetaan "biasa": garis baru dipetakan ke baris baru bukannya baris baru penghantaran kereta dan penggera dilumpuhkan. Ini membolehkan seseorang menggunakan emac untuk mengedit baris input. Malangnya, Jangkaan tidak mungkin meneka ini.

Anda boleh meminta bahawa Mengharapkan tidak menggantikan tetapan piawai parameter lalai, tetapi anda mesti berhati-hati ketika menulis skrip untuk persekitaran sedemikian. Dalam hal emacs, elakkan bergantung kepada perkara-perkara seperti pemalapan dan pemetaan akhir-line.

Perintah yang menerima argumen yang disandarkan kepada satu senarai (varian yang diharapkan dan berinteraksi ) menggunakan heuristik untuk menentukan sama ada senarai itu sebenarnya satu hujah atau banyak. Heuristik boleh gagal hanya dalam kes apabila senarai itu sebenarnya mewakili hujah tunggal yang mempunyai banyak tertanam \ n dengan aksara bukan ruang putih di antara mereka. Ini nampaknya mustahil, tetapi argumen "-nobrace" boleh digunakan untuk memaksa satu hujah tunggal untuk ditangani sebagai hujah tunggal. Ini mungkin boleh digunakan dengan kod Expect yang dihasilkan oleh mesin. Begitu juga, -membuat daya satu hujah tunggal untuk dikendalikan sebagai pelbagai corak / tindakan.

BUGS

Ia benar-benar menggoda untuk menamakan program "seks" (sama ada "EXEC Pintar" atau "Send-EXPect"), tetapi pengertian yang baik (atau mungkin hanya Puritanisme) berlaku.

Pada sesetengah sistem, apabila sebuah cangkang dihasilkan, ia mengeluh kerana tidak dapat mengakses tty tetapi berjalan pula. Ini bermakna sistem anda mempunyai mekanisme untuk mengawal tty yang tidak dijangka . Sila cari tahu apa itu dan hantar maklumat ini kepada saya.

Ultrix 4.1 (sekurang-kurangnya versi terkini di sekitar sini) menganggap batasan masa melebihi 1000000 bersamaan dengan 0.

Digital UNIX 4.0A (dan mungkin versi lain) enggan memperuntukkan ptys jika anda menentukan pengendali SIGCHLD. Lihat halaman ganjaran untuk maklumat lanjut.

IRIX 6.0 tidak mengendalikan kebenaran pty dengan betul supaya jika Berharap percubaan untuk memperuntukkan pty yang sebelumnya digunakan oleh orang lain, ia gagal. Menaik taraf ke IRIX 6.1.

Telnet (disahkan hanya di bawah SunOS 4.1.2) tergantung jika TERM tidak ditetapkan. Ini adalah masalah di bawah cron, di dan dalam skrip cgi, yang tidak menentukan TERM. Oleh itu, anda mesti menetapkan dengan jelas - kepada jenis apa yang biasanya tidak relevan. Ia hanya perlu ditetapkan untuk sesuatu! Berikut mungkin cukup untuk kebanyakan kes.

set env (TERM) vt100

Tip (disahkan hanya di bawah BSDI BSD / OS 3.1 i386) hang jika SHELL dan HOME tidak ditetapkan. Ini adalah masalah di bawah cron , di dan dalam skrip cgi , yang tidak menentukan pembolehubah persekitaran ini. Oleh itu, anda mesti menetapkannya secara eksplisit - jenis apa yang biasanya tidak relevan. Ia hanya perlu ditetapkan untuk sesuatu! Berikut mungkin cukup untuk kebanyakan kes.

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

Sesetengah pelaksanaan ptys direka supaya kernel membuang sebarang output yang belum dibaca selepas 10 hingga 15 saat (nombor sebenarnya adalah bergantung kepada pelaksanaan) selepas proses telah menutup deskriptor fail. Oleh itu, menjangkakan program seperti

menelan tarikh tidur 20 menjangkakan

akan gagal. Untuk mengelakkan ini, gunakan program yang tidak interaktif dengan melaksanakan dan bukan bertelur . Walaupun situasi sedemikian dapat difikirkan, dalam praktiknya saya tidak pernah mengalami situasi di mana output terakhir program yang benar-benar interaktif akan hilang disebabkan oleh kelakuan ini.

Sebaliknya, Cray UNICOS menyingkirkan sebarang output yang tidak dibaca sejurus selepas proses telah menutup deskriptor fail. Saya telah melaporkan ini kepada Cray dan mereka sedang berusaha memperbaiki.

Kadangkala kelewatan diperlukan di antara tindak balas dan tindak balas, seperti apabila antara muka tty sedang mengubah tetapan UART atau menyesuaikan kadar baud dengan mencari bit mula / henti. Biasanya, semua ini diperlukan adalah untuk tidur selama satu atau dua kali. Teknik yang lebih teguh adalah cuba semula sehingga perkakasan bersedia menerima input. Contoh berikut menggunakan kedua-dua strategi:

hantar "kelajuan 9600 \ r"; tidur 1 mengharapkan {timeout {send "\ r"; exp_continue} $ prompt}

perangkap-kod tidak akan berfungsi dengan apa-apa perintah yang duduk dalam gelung acara Tcl, seperti tidur. Masalahnya ialah dalam gelung acara, Tcl membuang kod kembali dari pengendali acara async. Peleraian adalah untuk menetapkan bendera dalam kod perangkap. Kemudian periksa bendera segera selepas arahan (iaitu, tidur).

Arahan expect_background mengabaikan hujah-habis masa dan tidak mempunyai konsep waktu tunggu secara umum.

& # 34; HADIAH HINTS & # 34;

Terdapat beberapa perkara tentang Harapan yang mungkin tidak intuitif. Bahagian ini cuba menangani beberapa perkara ini dengan beberapa cadangan.

Masalah jangkaan yang biasa adalah bagaimana mengenali petunjuk shell. Oleh kerana ini disesuaikan secara berbeza oleh orang yang berbeza dan cangkang yang berbeza, rlogin secara automatik mengotomatisasi boleh menjadi sukar tanpa mengetahui prompt. Konvensyen yang munasabah adalah untuk membolehkan pengguna menyimpan ungkapan biasa yang menerangkan dengan pantas (khususnya, akhirnya) dalam pembolehubah persekitaran EXPECT_PROMPT. Kod seperti berikut boleh digunakan. Sekiranya EXPECT_PROMPT tidak wujud, kod tersebut masih mempunyai peluang yang baik untuk berfungsi dengan betul.

tentukan prompt "(% | # | \\ $) $"; # tangkapan lalai lalai {set prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

Saya menggalakkan anda menulis corak yang mengharapkan yang merangkumi apa sahaja yang anda harapkan. Ini mengelakkan kemungkinan menjawab soalan sebelum melihat keseluruhan perkara. Selain itu, semasa anda mungkin dapat menjawab soalan sebelum melihatnya sepenuhnya, jika anda menjawab lebih awal, jawapan anda mungkin kelihatan bergema kembali di tengah-tengah soalan. Dalam erti kata lain, dialog yang terhasil akan betul tetapi kelihatan hancur.

Yang paling menggalakkan termasuk watak ruang pada akhirnya. Contohnya, petikan dari ftp ialah 'f', 't', 'p', '>' dan. Untuk memadankan petikan ini, anda mesti mengira setiap aksara ini. Ini adalah kesilapan biasa untuk tidak memasukkan kosong. Letakkan kosong secara eksplisit.

Jika anda menggunakan corak borang X *, * akan memadankan semua keluaran yang diterima dari hujung X ke perkara terakhir yang diterima. Ini berbunyi intuitif tetapi boleh agak mengelirukan kerana frasa "perkara terakhir yang diterima" boleh berbeza-beza bergantung pada kelajuan komputer dan pemprosesan I / O keduanya oleh kernel dan pemandu peranti.

Khususnya, manusia cenderung melihat output program yang tiba di ketulan besar (secara atom) apabila pada kenyataannya kebanyakan program menghasilkan output satu baris pada satu masa. Dengan menganggap ini adalah kes, * dalam corak perenggan yang terdahulu hanya dapat dipadankan pada akhir garisan semasa walaupun nampaknya lebih banyak, kerana pada saat pertandingan itu semua output yang telah diterima.

menjangkakan tidak ada cara untuk mengetahui bahawa keluaran selanjutnya akan datang melainkan corak anda khusus menyumbang.

Malah bergantung pada buffering berorientasikan garis adalah tidak bijak. Bukan sahaja program jarang membuat janji-janji tentang jenis buffering yang mereka lakukan, tetapi masalah pencernaan sistem boleh memecahkan garis-garis output sehingga garis-garis pecah di tempat-tempat yang seolah-olah rawak. Oleh itu, jika anda dapat menyampaikan watak-watak terakhir yang cepat apabila menulis corak, adalah bijak untuk berbuat demikian.

Sekiranya anda sedang menunggu corak dalam keluaran terakhir program dan program itu memaparkan sesuatu yang lain, anda tidak akan dapat mengesannya dengan kata kunci tamat masa . Sebabnya ialah jangkaan tidak akan tamat tempoh - sebaliknya ia akan mendapat petunjuk positif . Gunakan sebaliknya. Lebih baik, gunakan kedua-duanya. Dengan cara itu jika garis itu pernah dipindahkan, anda tidak perlu mengedit baris itu sendiri.

Talian baharu biasanya ditukar kepada kembalian tunggangan, urutan garis depan apabila output oleh pemandu terminal. Oleh itu, jika anda ingin corak yang sepadan dengan jelas dengan dua baris, daripada, katakan, printf ("foo \ nbar"), anda harus menggunakan pola "foo \ rbar".

Terjemahan serupa berlaku ketika membaca dari pengguna, melalui expect_user . Dalam kes ini, apabila anda menekan kembali, ia akan diterjemahkan ke baris baru. Jika Jangkaan kemudiannya melaluinya ke program yang menetapkan terminalnya ke mod mentah (seperti telnet), akan ada masalah, kerana program menjangkakan pulangan yang benar. (Sesetengah program benar-benar memaafkan kerana mereka akan secara automatik menterjemahkan baris baru untuk kembali, tetapi kebanyakannya tidak.) Malangnya, tidak ada cara untuk mengetahui bahawa program meletakkan terminalnya menjadi mod mentah.

Daripada secara manual menggantikan baris baru dengan pulangan, penyelesaiannya adalah menggunakan perintah "stty mentah", yang akan menghentikan terjemahannya. Walau bagaimanapun, perhatikan bahawa ini bermakna bahawa anda tidak lagi akan mendapat ciri penyunting baris yang dimasak.

berinteraksi secara tersirat menetapkan terminal anda kepada mod mentah sehingga masalah ini tidak akan timbul kemudian.

Ia sering berguna untuk menyimpan kata laluan (atau maklumat peribadi lain) dalam skrip Harapan . Ini tidak digalakkan kerana apa-apa yang disimpan di dalam komputer adalah rentan untuk diakses oleh sesiapa sahaja. Oleh itu, secara interaktif mendorong kata laluan dari skrip adalah idea yang lebih bijak daripada membenamkannya secara harfiah. Walau bagaimanapun, kadang-kadang embedding itu adalah satu-satunya kemungkinan.

Malangnya, sistem fail UNIX tidak mempunyai cara langsung untuk membuat skrip yang dapat dilaksanakan tetapi tidak boleh dibaca. Sistem yang menyokong skrip shell setgid secara tidak langsung boleh mensimulasikannya seperti berikut:

Buat Skrip Harapan (yang mengandungi data rahsia) seperti biasa. Jadikan izinnya 750 (-rwxr-x ---) dan dimiliki oleh kumpulan yang dipercayai, iaitu kumpulan yang dibenarkan membacanya. Jika perlu, buat kumpulan baru untuk tujuan ini. Seterusnya, buat skrip / bin / sh dengan izin 2751 (-rwxr-s - x) yang dimiliki oleh kumpulan yang sama seperti dahulu.

Hasilnya adalah skrip yang boleh dijalankan (dan dibaca) oleh sesiapa sahaja. Apabila dipanggil, ia menjalankan skrip Harapan .

& # 34; LIHAT JUGA & # 34;

Tcl (3), libexpect (3)
"Meneroka Harapan: A Toolkit Berbasis Tcl untuk Mengotomatisasi Program Interaktif" oleh Don Libes, ms 602, ISBN 1-56592-090-2, O'Reilly dan Associates, 1995.
"Diharapkan: Mengubati Mereka Tidak Terikat Interaktiviti" oleh Don Libes, Prosiding Musim Panas 1990 Persidangan USENIX, Anaheim, California, 11-15 Jun, 1990.
Saya "Menggunakan Harapan untuk Menggemari Tugas Pentadbiran Sistem" oleh Don Libes, Prosiding Persidangan Pentadbiran Sistem Pemasangan Besar USENIX 1990, Colorado Springs, Colorado, 17-19 Oktober, 1990.
Saya "Tcl: Satu Bahasa Arahan Terkait" oleh John Ousterhout, Prosiding Musim Musim Sejuk 1990 Persidangan USENIX, Washington, DC, 22-26 Januari, 1990. Saya "mengharapkan: Skrip untuk Mengendalikan Program Interaktif" oleh Don Libes, Sistem Pengkomputeran , Vol. 4, No. 2, Jurnal Akhbar University of California, November 1991. "Pengujian Regresi dan Kesesuaian Pengujian Program Interaktif" oleh Don Libes, Prosiding Musim Panas 1992 Konferensi USENIX, ms 135-144, San Antonio, TX, Jun 12-15, 1992. Saya "Kibitz - Menghubungkan Pelbagai Program Interaktif Bersama", oleh Don Libes, Perisian - Amalan & Pengalaman, John Wiley & Sons, West Sussex, England, Vol.

23, No 5, May, 1993..I "Debugger untuk Aplikasi Tcl", oleh Don Libes, Prosiding Tcl / Tk 1993, Berkeley, CA, 10-11 Jun 1993.

AUTHOR

Don Libes, Institut Piawaian dan Teknologi Kebangsaan

PENGHARGAAN

Terima kasih kepada John Ousterhout untuk Tcl, dan Scott Paisley untuk inspirasi. Terima kasih kepada Rob Savoye untuk kod Autoconfiguration Expect.

Fail SEJARAH dokumen banyak daripada evolusi harapan . Ia menjadikan bacaan menarik dan mungkin memberi anda gambaran lebih lanjut mengenai perisian ini. Terima kasih kepada orang yang disebut di dalamnya yang menghantar saya pepijat dan memberikan bantuan lain.

Reka bentuk dan pelaksanaan Harapan telah dibayar sebagian oleh kerajaan AS dan oleh itu dalam domain awam. Walau bagaimanapun pengarang dan NIST ingin kredit jika program dan dokumentasi atau sebahagian daripada mereka digunakan.