Linux / Unix Command Expect

Harapkan adalah program yang berbicara dengan program interaktif lainnya sesuai dengan skrip. Mengikuti naskah, Harapkan tahu apa yang dapat diharapkan dari sebuah program dan apa respon yang seharusnya benar. Bahasa yang diinterpretasikan menyediakan struktur kontrol tingkat tinggi dan percabangan untuk mengarahkan dialog. Selain itu, pengguna dapat mengambil kendali dan berinteraksi langsung ketika diinginkan, setelah itu mengembalikan kontrol ke skrip.

Expectk adalah campuran dari Expect dan Tk. Berperilaku seperti harapan Expect dan Tk. Harapkan juga dapat digunakan langsung di C atau C + + tanpa Tcl.

Nama "Mengharapkan" berasal dari gagasan mengirim / mengharapkan urutan dipopulerkan oleh uucp, kermit dan program kontrol modem lainnya. Namun tidak seperti uucp, Expect bersifat umum sehingga dapat dijalankan sebagai perintah tingkat pengguna dengan program dan tugas apa pun. Harapkan dapat berbicara dengan beberapa program pada saat yang bersamaan.

Apa yang Bisa Diharapkan

Sebagai contoh, berikut ini beberapa hal yang dapat dilakukan oleh perintah yang diharapkan:

Ada berbagai alasan mengapa shell tidak dapat melakukan tugas-tugas ini. Semua dimungkinkan dengan Expect.

Secara umum, Expect berguna untuk menjalankan program apa pun yang memerlukan interaksi antara program dan pengguna. Semua yang diperlukan adalah interaksi dapat dikarakterisasi secara terprogram. Harapkan juga dapat memberikan kontrol kembali kepada pengguna tanpa menghentikan program yang sedang dikontrol. Demikian pula, pengguna dapat mengembalikan kontrol ke skrip kapan saja.

Pemakaian

Harapkan membaca cmdfile untuk daftar perintah yang akan dieksekusi. Berharap dapat dipanggil secara implisit pada sistem yang mendukung #! notasi dengan menandai skrip sebagai dapat dieksekusi dan membuat baris pertama di skrip:

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

Tentu saja, jalan harus secara akurat menggambarkan di mana Mengharapkan hidup. / usr / local / bin hanyalah sebuah contoh.

Flag -c menandai perintah yang akan dieksekusi sebelum skrip apa pun. Perintah harus dikutip untuk mencegah dipecahkan oleh shell. Opsi ini dapat digunakan beberapa kali. Beberapa perintah dapat dijalankan dengan satu -c dengan memisahkannya dengan titik koma. Perintah dijalankan sesuai urutannya. Saat menggunakan Expectk, opsi ini ditetapkan sebagai perintah.

Flag -d memungkinkan beberapa output diagnostik, yang terutama melaporkan aktivitas internal dari perintah seperti mengharapkan dan berinteraksi. Bendera ini memiliki efek yang sama dengan "exp_internal 1" di awal skrip Expect, ditambah versi Expect yang dicetak.

Bendera -D memungkinkan debugger interaktif. Nilai bilangan bulat harus mengikuti. Debugger akan mengambil kendali sebelum prosedur Tcl berikutnya jika nilainya nol atau jika ^ C ditekan atau breakpoint dipukul, atau perintah debugger lain yang sesuai muncul di skrip. Saat menggunakan Expectk, opsi ini ditetapkan sebagai - Debug.

Flag -f menampilkan file untuk membaca perintah. Bendera itu sendiri opsional karena hanya berguna ketika menggunakan #! notasi, sehingga argumen lain dapat diberikan pada baris perintah. Saat menggunakan Expectk, opsi ini ditentukan sebagai -file.

Secara default, file perintah dibaca ke dalam memori dan dieksekusi secara keseluruhan. Kadang-kadang diinginkan untuk membaca file satu baris dalam satu waktu. Untuk memaksa file sewenang-wenang ditangani dengan cara ini, gunakan tanda -b. Saat menggunakan Expectk, opsi ini ditetapkan sebagai -buffer.

Jika string "-" diberikan sebagai nama file, masukan standar dibaca sebagai gantinya. Gunakan "./-" untuk membaca dari sebuah file yang sebenarnya bernama "-".

Flag -i menyebabkan Mengharapkan untuk secara interaktif meminta perintah daripada membacanya dari file. Prompting diakhiri melalui perintah keluar atau pada EOF. Flag -i diasumsikan jika file perintah maupun -c tidak digunakan. Saat menggunakan Expectk, opsi ini ditetapkan sebagai -interaktif.

- dapat digunakan untuk membatasi ujung opsi. Ini berguna jika Anda ingin memberikan argumen pilihan ke skrip Anda tanpa ditafsirkan oleh Expect. Ini berguna ditempatkan di #! baris untuk mencegah interpretasi seperti bendera oleh Mengharapkan. Sebagai contoh, berikut ini akan meninggalkan argumen asli termasuk nama skrip dalam argumen variabel.

#! / usr / local / bin / harapkan -

Perhatikan bahwa getopt biasa (3) dan eksekusi (2) konvensi harus diperhatikan saat menambahkan argumen ke #! garis.

File $ exp_library / expect.rc diambil secara otomatis jika ada, kecuali flag -N digunakan. (Saat menggunakan Expectk, opsi ini ditetapkan sebagai -NORC.) Segera setelah ini, file ~ / .expect.rc diambil secara otomatis, kecuali jika -n flag digunakan. Jika variabel lingkungan DOTDIR didefinisikan, ia diperlakukan sebagai direktori dan .expect.rc dibaca dari sana. Saat menggunakan Expectk, opsi ini ditetapkan sebagai -norc. Sumber ini hanya terjadi setelah mengeksekusi setiap flag -c.

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

Argumen opsional dikonstruksikan ke dalam daftar dan disimpan dalam variabel bernama argv dan. argc diinisialisasi ke panjang argv.

Argv0 didefinisikan sebagai nama skrip atau biner jika tidak ada skrip yang digunakan. Sebagai contoh, berikut ini mencetak nama skrip dan tiga argumen pertama:

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

Perintah

Harapkan menggunakan Bahasa Komando Alat. Tcl menyediakan aliran kontrol (jika, untuk, istirahat), evaluasi ekspresi dan beberapa fitur lain seperti definisi rekursif dan prosedur. Perintah yang digunakan di sini tetapi tidak didefinisikan (set, if, exec) adalah perintah Tcl. Harapkan mendukung perintah tambahan. Kecuali ditentukan lain, perintah mengembalikan string kosong.

Perintah-perintah dicantumkan menurut abjad sehingga dapat ditemukan dengan cepat. Namun, pengguna baru mungkin merasa lebih mudah untuk memulai dengan membaca deskripsi bertelur, kirim, harapkan, dan berinteraksi, dalam urutan itu.

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

menutup koneksi ke proses saat ini. Kebanyakan program interaktif akan mendeteksi EOF pada stdin mereka dan keluar; dengan demikian menutup biasanya sudah cukup untuk membunuh proses juga. Flag -i menyatakan proses untuk menutup terkait dengan spawn_id yang dinamai.

Baik mengharapkan dan berinteraksi akan mendeteksi ketika proses saat ini keluar dan secara implisit melakukan penutupan, tetapi jika Anda membunuh proses dengan, katakanlah, "exec kill $ pid", Anda perlu secara eksplisit memanggil tutup .

Flag -onexec menentukan apakah id spawn ditutup dalam proses melahirkan baru atau jika prosesnya dihamparkan. Untuk membiarkan pembukaan bibit terbuka, gunakan nilai 0. Nilai integer non-nol memaksa pemijahan ditutup di setiap proses baru.

Bendera -lembaran menutup budak yang terkait dengan id bibit. Ketika koneksi ditutup, budak secara otomatis ditutup juga jika masih terbuka.

Tidak masalah apakah koneksi ditutup secara implisit atau eksplisit, Anda harus menelepon menunggu untuk menjernihkan slot proses kernel terkait. Perintah tutup tidak memanggil tunggu karena tidak ada jaminan bahwa menutup koneksi proses akan menyebabkannya untuk keluar.

debug [[-now] 0 | 1]

mengontrol debugger Tcl memungkinkan Anda untuk melangkah melalui pernyataan dan mengatur breakpoint.

Tanpa argumen, 1 dikembalikan jika debugger tidak berjalan, jika tidak, 0 dikembalikan.

Dengan 1 argumen, debugger dimulai. Dengan 0 argumen, debugger dihentikan. Jika 1 argumen didahului oleh bendera -sekarang, debugger dimulai segera. Jika tidak, debugger dimulai dengan pernyataan Tcl berikutnya.

Perintah debug tidak mengubah perangkap apa pun. Bandingkan ini untuk memulai Mengharapkan dengan bendera -D.

Perintah disconnect memutuskan proses bercabang dari terminal . Ini terus berjalan di latar belakang. Proses ini diberikan kelompok prosesnya sendiri. I / O standar dialihkan ke / dev / null .

Fragmen berikut menggunakan putuskan untuk terus menjalankan skrip di latar belakang.

jika {[garpu]! = 0} putuskan keluar. . .

Skrip berikut membaca kata sandi dan kemudian menjalankan program setiap jam yang menuntut kata sandi setiap kali dijalankan. Skrip menyediakan kata sandi sehingga Anda hanya perlu mengetiknya satu kali.

send_user "password? \" expect_user-re "(. *) \ n" untuk {} 1 {} {if {[garpu]! = 0} {sleep 3600; lanjutkan} putuskan spawn priv_prog harapkan Kata Sandi: kirim "$ expect_out ( 1, string) \ r ". . . keluar }

Keuntungan menggunakan disconnect over shell asynchronous process feature (&) adalah bahwa Expect dapat menyimpan parameter terminal sebelum pemutusan dan kemudian menerapkannya ke ptys baru. Dengan &, Expect tidak memiliki kesempatan untuk membaca parameter terminal karena terminal sudah terputus pada saat Expect menerima kontrol.

keluar [-tsts] [status]

menyebabkan Berharap untuk keluar atau bersiap-siap untuk melakukannya.

Flag -onexit menyebabkan argumen berikutnya digunakan sebagai handler keluar. Tanpa argumen, penangan keluar saat ini dikembalikan.

Flag -noexit menyebabkan Expect untuk bersiap keluar tetapi berhenti kekurangan untuk benar-benar mengembalikan kontrol ke sistem operasi. Handler keluar yang ditentukan pengguna dijalankan serta penangan internal Ekspektasi sendiri. Tidak ada perintah Expect selanjutnya yang harus dieksekusi. Ini berguna jika Anda menjalankan Expect dengan ekstensi Tcl lainnya. Interpreter saat ini (dan jendela utama jika dalam lingkungan Tk) tetap sehingga ekstensi Tcl lainnya dapat dibersihkan. Jika Expect's exit dipanggil lagi (namun ini mungkin terjadi), handler tidak dijalankan kembali.

Setelah keluar, semua koneksi ke proses yang menghasilkan ditutup. Penutupan akan terdeteksi sebagai EOF dengan proses yang dibuat-buat. exit tidak mengambil tindakan lain di luar prosedur normal _exit (2). Dengan demikian, proses menelurkan yang tidak memeriksa EOF dapat terus berjalan. (Berbagai kondisi penting untuk menentukan, misalnya, apa sinyal yang proses melahirkan akan dikirim, tetapi ini tergantung pada sistem, biasanya didokumentasikan di bawah pintu keluar (3).) Proses spawn yang terus berjalan akan diwariskan oleh init.

status (atau 0 jika tidak ditentukan) dikembalikan sebagai status keluar dari Expect . keluar secara implisit dieksekusi jika akhir skrip tercapai.

exp_continue [-continue_timer]
Exp_continue perintah memungkinkan mengharapkan dirinya untuk terus mengeksekusi daripada kembali seperti biasanya. Secara default exp_continue me-reset timer timeout. Flag -continue_timer mencegah pengatur waktu dimulai ulang. (Lihat berharap untuk informasi lebih lanjut.)

nilai exp_internal [-f file]
menyebabkan perintah lebih lanjut untuk mengirim informasi diagnostik internal yang Diharapkan ke stderr jika nilai tidak nol. Output ini dinonaktifkan jika nilainya 0. Informasi diagnostik mencakup setiap karakter yang diterima, dan setiap upaya dilakukan untuk mencocokkan keluaran saat ini dengan pola.

Jika file opsional disediakan, semua output normal dan debugging ditulis ke file itu (terlepas dari nilai nilainya ). File output diagnostik sebelumnya ditutup.

Bendera -info menyebabkan exp_internal untuk mengembalikan deskripsi dari argumen non-info terbaru yang diberikan.

exp_open [args] [-i spawn_id]
mengembalikan pengidentifikasi file Tcl yang sesuai dengan id bibit asli. Pengenal file kemudian dapat digunakan seolah-olah dibuka oleh perintah terbuka Tcl. (Id spawn seharusnya tidak lagi digunakan. Penantian tidak boleh dijalankan.

Flag -leaveopen meninggalkan id bibit terbuka untuk diakses melalui perintah Expect. Penantian harus dilakukan pada id bibit.

exp_pid [-i spawn_id]
mengembalikan id proses yang terkait dengan proses yang saat ini telah dibuat. Jika flag -i digunakan, pid kembali sesuai dengan tanda spawn yang diberikan.

exp_send
adalah alias untuk mengirim .

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] versi]
berguna untuk memastikan bahwa skrip kompatibel dengan versi Harapan saat ini.

Tanpa argumen, versi Ekspektasi saat ini dikembalikan. Versi ini kemudian dapat dikodekan dalam skrip Anda. Jika Anda benar-benar tahu bahwa Anda tidak menggunakan fitur versi terbaru, Anda dapat menentukan versi sebelumnya.

Versi terdiri dari tiga angka yang dipisahkan oleh titik-titik. Pertama adalah angka utama. Naskah yang ditulis untuk versi Harapan dengan nomor utama yang berbeda hampir pasti tidak akan berfungsi. exp_version menghasilkan kesalahan jika nomor utama tidak cocok.

Kedua adalah nomor kecil. Skrip yang ditulis untuk versi dengan jumlah minor yang lebih besar daripada versi saat ini mungkin bergantung pada beberapa fitur baru dan mungkin tidak berjalan. exp_version menghasilkan kesalahan jika nomor utama cocok, tetapi skrip nomor minor lebih besar dari ekspektasi yang sedang berjalan.

Ketiga adalah angka yang tidak memainkan bagian dalam perbandingan versi. Namun, itu bertambah ketika distribusi perangkat lunak Ekspektasi berubah dengan cara apa pun, seperti dengan dokumentasi tambahan atau pengoptimalan. Ini diatur ulang ke 0 pada setiap versi minor baru.

Dengan flag -exit , Harapkan cetakan kesalahan dan keluar jika versi sudah kedaluwarsa.

harapkan [[-opts] pat1 body1] ... [-opts] patn [bodyn]
menunggu hingga salah satu pola sesuai dengan output proses yang telah dibuat, jangka waktu yang ditentukan telah berlalu, atau akhir-file dilihat. Jika tubuh final kosong, itu mungkin dihilangkan.

Pola dari perintah expect_before terbaru secara implisit digunakan sebelum pola lainnya. Pola dari perintah expect_after terbaru secara implisit digunakan setelah pola lainnya.

Jika argumen ke seluruh pernyataan mengharapkan membutuhkan lebih dari satu baris, semua argumen mungkin "bersiap" menjadi satu sehingga untuk menghindari mengakhiri setiap baris dengan backslash. Dalam kasus yang satu ini, substitusi Tcl yang biasa akan terjadi meskipun kawat gigi.

Jika sebuah pola adalah kata kunci, badan yang bersangkutan dieksekusi pada akhir file. Jika suatu pola adalah waktu tunggu kata kunci, tubuh yang bersangkutan dieksekusi pada waktu habis. Jika tidak ada kata kunci timeout yang digunakan, tindakan null implisit dieksekusi pada waktu habis. Periode waktu default adalah 10 detik tetapi dapat diatur, misalnya ke 30, dengan perintah "tetapkan batas waktu 30". Batas waktu tak terbatas dapat ditentukan oleh nilai -1. Jika suatu pola adalah default kata kunci, tubuh yang bersangkutan dijalankan pada waktu habis atau akhir file.

Jika sebuah pola cocok, maka tubuh yang bersangkutan dieksekusi. mengharapkan mengembalikan hasil dari tubuh (atau string kosong jika tidak ada pola yang cocok). Dalam hal beberapa pola cocok, yang pertama muncul digunakan untuk memilih tubuh.

Setiap kali output baru tiba, itu dibandingkan dengan setiap pola dalam urutan yang terdaftar. Dengan demikian, Anda dapat menguji apakah tidak ada kecocokan dengan membuat pola terakhir sesuatu yang dijamin akan muncul, seperti prompt. Dalam situasi di mana tidak ada prompt, Anda harus menggunakan timeout (seperti yang Anda lakukan jika Anda berinteraksi secara manual).

Pola ditentukan dalam tiga cara. Secara default, pola ditentukan seperti dengan perintah string pertandingan Tcl. (Pola seperti ini juga mirip dengan ekspresi reguler C-shell yang biasanya disebut sebagai pola "glob"). Flag -gl mungkin dapat digunakan untuk melindungi pola yang mungkin cocok dengan bendera yang diharapkan dari melakukannya. Pola apa pun yang diawali dengan "-" harus dilindungi dengan cara ini. (Semua string yang dimulai dengan "-" dicadangkan untuk opsi mendatang.)

Misalnya, fragmen berikut mencari proses masuk yang berhasil. (Perhatikan bahwa abort dianggap sebagai prosedur yang ditentukan di bagian lain dalam skrip.)

harapkan {busy {puts busy \ n; exp_continue} gagal membatalkan "invalid password" membatalkan batas waktu abort tersambung}

Kutipan diperlukan pada pola keempat karena berisi spasi, yang akan memisahkan pola dari tindakan. Pola dengan aksi yang sama (seperti ke-3 dan ke-4) membutuhkan daftar tindakan lagi. Ini dapat dihindari dengan menggunakan pola gaya regexp (lihat di bawah). Informasi lebih lanjut tentang pembentukan pola gaya-glob dapat ditemukan dalam manual Tcl.

Pola gaya-regex mengikuti sintaks yang ditentukan oleh regexp Tcl (singkatan dari perintah "regular expression"). Pola regexp diperkenalkan dengan flag -re . Contoh sebelumnya dapat ditulis ulang menggunakan regexp sebagai:

harapkan {busy {puts busy \ n; exp_continue} -re "gagal | kata sandi tidak valid" batalkan timeout abort tersambung}

Kedua jenis pola "tidak dipasarkan". Ini berarti bahwa pola tidak harus cocok dengan seluruh string, tetapi dapat memulai dan mengakhiri pertandingan di mana saja dalam string (asalkan semuanya sesuai). Gunakan ^ untuk mencocokkan awal string, dan $ untuk mencocokkan bagian akhir. Perhatikan bahwa jika Anda tidak menunggu akhir dari suatu string, respons Anda dapat dengan mudah berakhir di tengah-tengah string saat mereka di-echo dari proses pembiakan. Meskipun masih menghasilkan hasil yang benar, hasilnya bisa terlihat tidak alami. Dengan demikian, penggunaan $ didorong jika Anda bisa menggambarkan karakter pada akhir string.

Perhatikan bahwa di banyak editor, yang ^ dan $ mencocokkan awal dan akhir baris masing-masing. Namun, karena mengharapkan tidak berorientasi baris, karakter ini cocok dengan awal dan akhir data (sebagai lawan dari garis) saat ini dalam buffer pencocokan yang sesuai. (Juga, lihat catatan di bawah ini pada "gangguan pencernaan sistem.")

Flag -ex menyebabkan pola dicocokkan sebagai string "eksak". Tidak ada interpretasi *, ^, dll yang dibuat (meskipun konvensi Tcl yang biasa harus tetap diperhatikan). Pola yang tepat selalu tidak digarap.

Bendera -nocase menyebabkan karakter huruf besar dari output untuk membandingkan seolah-olah mereka karakter huruf kecil. Polanya tidak terpengaruh.

Saat membaca output, lebih dari 2000 byte dapat memaksa byte sebelumnya menjadi "terlupakan". Ini dapat diubah dengan fungsi match_max . (Perhatikan bahwa nilai-nilai yang terlalu besar dapat memperlambat matcher pola.) Jika patlist adalah full_buffer , tubuh yang sesuai dijalankan jika match_max byte telah diterima dan tidak ada pola lain yang cocok. Apakah kata kunci full_buffer digunakan, karakter yang terlupakan ditulis ke expect_out (buffer).

Jika patlist adalah kata kunci nol , dan nulls diperbolehkan (melalui perintah remove_nulls ), tubuh yang sesuai dijalankan jika ASCII 0 tunggal dicocokkan. Tidak mungkin mencocokkan 0 byte melalui pola glob atau regexp.

Setelah mencocokkan pola (atau eof atau full_buffer), setiap output yang cocok dan tak tertandingi sebelumnya disimpan dalam variabel expect_out (buffer) . Hingga 9 pertandingan substring regexp disimpan dalam variabel expect_out (1, string) melalui expect_out (9, string) . Jika bendera -indikasi digunakan sebelum pola, indeks awal dan akhir (dalam bentuk yang cocok untuk lrange ) dari 10 string disimpan dalam variabel expect_out (X, start) dan expect_out (X, end) di mana X adalah digit, sesuai dengan posisi substring dalam buffer. 0 mengacu pada string yang cocok dengan seluruh pola dan dihasilkan untuk pola glob serta pola regexp. Sebagai contoh, jika suatu proses telah menghasilkan output "abcdefgh \ n", hasil dari:

berharap "cd"

seolah-olah pernyataan berikut telah dieksekusi:

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

dan "efgh \ n" tersisa di buffer output. Jika suatu proses menghasilkan output "abbbcabkkkka \ n", hasil dari:

harapkan -indeks-b "b (b *). * (k +)"

seolah-olah pernyataan berikut telah dieksekusi:

set expect_out (0, mulai) 1 set expect_out (0, end) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, mulai) 2 set expect_out (1, end) 3 set expect_out (1, string) bb set expect_out (2, mulai) 10 set expect_out (2, akhir) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

dan "a \ n" tersisa di buffer output. Pola "*" (dan -re ". *") Akan menyiram buffer output tanpa membaca output lagi dari proses.

Biasanya, output yang cocok dibuang dari buffer internal Expect. Ini dapat dicegah dengan mengawali sebuah pola dengan bendera -notransfer . Bendera ini sangat berguna dalam bereksperimen (dan dapat disingkat menjadi "-tidak" untuk kenyamanan saat bereksperimen).

ID spawn yang terkait dengan output yang cocok (atau eof atau full_buffer) disimpan di expect_out (spawn_id) .

Flag- timeout menyebabkan perintah ekspektasi saat ini untuk menggunakan nilai berikut sebagai timeout daripada menggunakan nilai dari variabel timeout.

Secara default, pola dicocokkan dengan output dari proses saat ini, namun flag -i menyatakan output dari daftar spawn_id yang dinamakan akan dicocokkan dengan pola berikut (sampai ke -i ). Daftar spawn_id harus berupa daftar spawn_ids yang dipisahkan spasi atau variabel yang merujuk pada daftar spawn_id tersebut.

Sebagai contoh, contoh berikut menunggu "terhubung" dari proses saat ini, atau "sibuk", "gagal" atau "kata sandi tidak sah" dari spawn_id yang dinamai oleh $ proc2.

berharap {-i $ proc2 sibuk {menempatkan sibuk \ n; exp_continue} -re "gagal | kata sandi tidak valid" batalkan timeout abort tersambung}

Nilai variabel global any_spawn_id dapat digunakan untuk mencocokkan pola ke setiap spawn_ids yang diberi nama dengan semua flag -i lain dalam perintah yang diharapkan saat ini. Spawn_id dari flag -i tanpa pola yang terkait (yaitu, diikuti segera oleh yang lain -i ) dibuat tersedia untuk pola lain dalam perintah harapan yang sama yang terkait dengan any_spawn_id.

Flag -i juga dapat menamai variabel global yang dalam hal ini variabel dibaca untuk daftar ID spawn. Variabel tersebut membaca ulang kapan pun berubah. Ini menyediakan cara mengubah sumber I / O saat perintah sedang dieksekusi. Id bertelur disediakan dengan cara ini disebut "bibit bertelur" tidak langsung.

Tindakan seperti istirahat dan terus menyebabkan struktur kontrol (yaitu, untuk , proc ) untuk berperilaku dengan cara biasa. Exp_continue perintah memungkinkan mengharapkan dirinya untuk terus mengeksekusi daripada kembali seperti biasanya.

Ini berguna untuk menghindari loop eksplisit atau pernyataan harapan berulang. Contoh berikut adalah bagian dari fragmen untuk mengotomatiskan rlogin. Exp_continue menghindari harus menulis pernyataan harapan kedua (untuk mencari prompt lagi) jika rlogin meminta kata sandi.

harapkan kata sandi {Password: {stty -echo send_user "(untuk $ user) pada $ host:" expect_user-re "(. *) \ n" send_user "\ n" kirim "$ expect_out (1, string) \ r" stty echo exp_continue} kesalahan {send_user "kata sandi atau akun tidak valid \ n" exit} timeout {send_user "koneksi ke $ host habis \ n" exit} eof {send_user \ "koneksi ke host gagal: $ expect_out (buffer)" exit} - kembali $ prompt}

Misalnya, fragmen berikut mungkin membantu pengguna memandu interaksi yang sudah sepenuhnya otomatis. Dalam hal ini, terminal dimasukkan ke mode mentah. Jika pengguna menekan "+", variabel bertambah. Jika "p" ditekan, beberapa pengembalian dikirim ke proses, mungkin untuk memicunya dalam beberapa cara, dan "i" memungkinkan pengguna berinteraksi dengan proses, secara efektif mencuri kontrol dari skrip. Dalam setiap kasus, exp_continue memungkinkan saat ini mengharapkan untuk melanjutkan pencocokan pola setelah mengeksekusi tindakan saat ini.

stty raw-echo expect_after {-i $ user_spawn_id "p" {kirim "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" exit}

Secara default, exp_continue me-reset timer timeout. Pengatur waktu tidak dimulai ulang, jika exp_continue dipanggil dengan flag -continue_timer .

expect_after [expect_args]
bekerja secara identik dengan yang diharapkan sebelum itu kecuali bahwa jika pola dari keduanya mengharapkan dan mengharapkan_setelah cocok, pola yang diharapkan digunakan. Lihat perintah expect_before untuk informasi lebih lanjut.

expect_background [expect_args]
mengambil argumen yang sama seperti yang diharapkan , namun itu segera kembali. Pola diuji setiap kali masukan baru tiba. Batas waktu dan default pola tidak ada artinya untuk mengharapkan [pembalikan] dan dibuang secara diam-diam. Jika tidak, perintah expect_background menggunakan expect_before dan expect_after pattern seperti yang diharapkan .

Ketika expect_background tindakan sedang dievaluasi, pemrosesan latar belakang untuk id bibit yang sama diblokir. Pemrosesan latar belakang tidak terblokir saat tindakan selesai. Sementara pemrosesan latar belakang diblokir, adalah mungkin untuk melakukan (depan) mengharapkan pada id bibit yang sama.

Tidak mungkin untuk mengeksekusi ekspektasi sementara expect_background tidak diblokir. expect_background untuk spawn id tertentu dihapus dengan menyatakan expect_background baru dengan id bibit yang sama. Mendeklarasikan expect_background tanpa pola menghilangkan id spawn yang diberikan dari kemampuan untuk mencocokkan pola di latar belakang.

expect_before [expect_args]
mengambil argumen yang sama seperti yang diharapkan , namun itu segera kembali. Pola-aksi pasang dari yang terbaru expect_before dengan id bibit yang sama secara implisit ditambahkan ke setiap perintah mengharapkan berikut. Jika sebuah pola cocok, ia diperlakukan seolah-olah itu telah ditentukan dalam perintah yang diharapkan itu sendiri, dan tubuh yang terkait dieksekusi dalam konteks perintah yang diharapkan . Jika pola dari keduanya mengharapkan sebelum dan mengharapkan dapat cocok, pola expect_before digunakan.

Jika tidak ada pola yang ditentukan, ID spawn tidak dicentang untuk pola apa pun.

Kecuali ditimpa oleh -i flag, expect_before pattern cocok dengan spawn id yang didefinisikan pada saat perintah expect_before dieksekusi (bukan ketika polanya dicocokkan).

Bendera -info menyebabkan expect_before untuk mengembalikan spesifikasi saat ini dari pola apa yang akan cocok. Secara default, ia melaporkan id bibit saat ini. Spesifikasi spawn id opsional dapat diberikan untuk informasi tentang spawn id tersebut. Sebagai contoh

expect_before -info -i $ proc

Paling banyak satu spesifikasi spawn id dapat diberikan. Bendera-langsung menekan id bibit langsung yang datang hanya dari spesifikasi tidak langsung.

Alih-alih spesifikasi spawn id, bendera "-all" akan menyebabkan "-info" melaporkan semua id spawn.

Output dari flag -info dapat digunakan kembali sebagai argumen yang diharapkan sebelumnya.

expect_tty [expect_args]
seperti mengharapkan tetapi membaca karakter dari / dev / tty (yaitu penekanan tombol dari pengguna). Secara default, pembacaan dilakukan dalam mode matang. Dengan demikian, garis harus diakhiri dengan kembali agar dapat melihatnya. Ini dapat diubah melalui stty (lihat perintah stty di bawah).

expect_user [expect_args]
seperti mengharapkan tetapi membaca karakter dari stdin (yaitu penekanan tombol dari pengguna). Secara default, pembacaan dilakukan dalam mode matang. Dengan demikian, garis harus diakhiri dengan kembali agar dapat melihatnya. Ini dapat diubah melalui stty (lihat perintah stty di bawah).

garpu
menciptakan proses baru. Proses baru adalah salinan eksak dari proses Ekspektasi saat ini. Pada keberhasilan, garpu mengembalikan 0 ke proses (anak) baru dan mengembalikan ID proses dari proses anak ke proses induk. Pada kegagalan (selalu karena kurangnya sumber daya, misalnya, ruang swap, memori), garpu mengembalikan -1 ke proses induk, dan tidak ada proses anak yang dibuat.

Proses bercabang keluar melalui perintah keluar , sama seperti proses aslinya. Proses bercabang diizinkan untuk menulis ke file log. Jika Anda tidak menonaktifkan debugging atau masuk ke sebagian besar proses, hasilnya bisa membingungkan.

Beberapa penerapan pty mungkin membingungkan oleh banyak pembaca dan penulis, bahkan untuk sementara. Dengan demikian, paling aman untuk garpu sebelum proses pemijahan.

berinteraksi [string1 body1] ... [stringn [bodyn]]
memberikan kontrol dari proses saat ini kepada pengguna, sehingga penekanan tombol dikirim ke proses saat ini, dan stdout dan stderr dari proses saat ini dikembalikan.

Pasangan tali-tubuh dapat ditentukan sebagai argumen, dalam hal ini tubuh dieksekusi ketika string yang sesuai dimasukkan. (Secara default, string tidak dikirim ke proses saat ini.) Perintah interpreter diasumsikan, jika badan final hilang.

Jika argumen untuk seluruh pernyataan berinteraksi membutuhkan lebih dari satu baris, semua argumen mungkin "dilekatkan" menjadi satu untuk menghindari penghentian setiap baris dengan backslash. Dalam kasus yang satu ini, substitusi Tcl yang biasa akan terjadi meskipun kawat gigi.

Sebagai contoh, perintah berikut berjalan berinteraksi dengan pasangan string-body berikut: Ketika ^ Z ditekan, Harapkan ditangguhkan. (Tanda-ulang mengembalikan mode terminal.) Ketika ^ A ditekan, pengguna melihat "Anda mengetikkan kontrol-A" dan proses dikirim a ^ A. Ketika $ ditekan, pengguna melihat tanggal. Ketika ^ C ditekan, Harapkan pintu keluar. Jika "foo" dimasukkan, pengguna melihat "bar". Ketika ~~ ditekan, interpreter Expect berjalan secara interaktif.

mengatur CTRLZ \ 032 berinteraksi {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "Anda mengetik kontrol-A \ n"; kirim "\ 001"} $ {send_user "Tanggal adalah [format jam [jam detik]]."} \ 003 keluar foo {send_user "bar"} ~~}

Dalam pasangan string-body, string-string dicocokkan dalam urutan mereka terdaftar sebagai argumen. String yang sebagian cocok tidak dikirim ke proses saat ini sebagai antisipasi sisa yang datang. Jika karakter kemudian dimasukkan sehingga tidak mungkin ada kecocokan lagi, hanya bagian dari string yang akan dikirim ke proses yang tidak mungkin memulai pertandingan lain. Jadi, string yang merupakan substring dari pertandingan parsial dapat cocok nanti, jika string asli yang dicoba untuk cocok pada akhirnya gagal.

Secara default, pencocokan string tepat tanpa wild card . (Sebaliknya, perintah yang diharapkan menggunakan pola gaya-glob secara default.) Bendera -ex dapat digunakan untuk melindungi pola yang mungkin cocok dengan bendera yang saling berinteraksi . Pola apa pun yang diawali dengan "-" harus dilindungi dengan cara ini. (Semua string yang dimulai dengan "-" dicadangkan untuk opsi mendatang.)

Flag -re memaksa string diinterpretasikan sebagai pola gaya regexp. Dalam hal ini, pencocokan substring disimpan dalam variabel interact_out sama dengan cara mengharapkan menyimpan outputnya dalam variabel expect_out . Bendera -individu juga didukung.

Pola eof memperkenalkan tindakan yang dijalankan pada akhir file. Pola eof terpisah juga dapat mengikuti bendera -output dalam hal ini dicocokkan jika eof terdeteksi saat menulis output. Tindakan default eof adalah "kembali", sehingga berinteraksi hanya mengembalikan pada setiap EOF.

Batas waktu pola memperkenalkan batas waktu (dalam detik) dan tindakan yang dijalankan setelah tidak ada karakter yang telah dibaca untuk waktu tertentu. Pola waktu habis berlaku untuk proses yang baru-baru ini ditentukan. Tidak ada batas waktu default. "Batas waktu" variabel khusus (digunakan oleh perintah yang diharapkan ) tidak berpengaruh pada batas waktu ini.

Misalnya, pernyataan berikut dapat digunakan untuk autologout pengguna yang belum mengetik apa pun selama satu jam tetapi yang masih mendapatkan pesan sistem sering:

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

Jika polanya adalah kata kunci nol , dan nulls diperbolehkan (melalui perintah remove_nulls ), tubuh yang sesuai dijalankan jika ASCII 0 tunggal dicocokkan. Tidak mungkin mencocokkan 0 byte melalui pola glob atau regexp.

Prefacing pola dengan flag -iwrite menyebabkan variabel interact_out (spawn_id) disetel ke spawn_id yang cocok dengan pola (atau eof).

Tindakan seperti istirahat dan terus menyebabkan struktur kontrol (yaitu, untuk , proc ) untuk berperilaku dengan cara biasa. Namun, sebab kembalinya berinteraksi untuk kembali ke pemanggilnya, sementara inter_return menyebabkan interaksi menyebabkan kembalinya pemanggilnya. Misalnya, jika "proc foo" disebut berinteraksi yang kemudian mengeksekusi inter_return tindakan, proc foo akan kembali. (Ini berarti bahwa jika panggilan interaktif interpreter mengetik secara interaktif kembali akan menyebabkan interaksi berlanjut, sementara inter_return akan menyebabkan interaksi untuk kembali ke pemanggilnya.)

Selama berinteraksi , mode mentah digunakan sehingga semua karakter dapat dilewatkan ke proses saat ini. Jika proses saat ini tidak menangkap sinyal kontrol pekerjaan, itu akan berhenti jika mengirim sinyal berhenti (secara default ^ Z). Untuk memulai ulang, kirim sinyal terus (seperti dengan "kill -CONT"). Jika Anda benar-benar ingin mengirim SIGSTOP ke proses semacam itu (oleh ^ Z), pertimbangkan untuk memijah csh terlebih dahulu dan kemudian jalankan program Anda. Di sisi lain, jika Anda ingin mengirim SIGSTOP ke Expect sendiri, hubungi juru bahasa (mungkin dengan menggunakan karakter escape), lalu tekan ^ Z.

Pasangan string-body dapat digunakan sebagai singkatan untuk menghindari keharusan memasukkan interpreter dan mengeksekusi perintah secara interaktif. Mode terminal sebelumnya digunakan ketika tubuh pasangan string-body sedang dieksekusi.

Untuk kecepatan, tindakan dijalankan dalam mode mentah secara default. Flag -reset me-reset terminal ke mode yang dimilikinya sebelum berinteraksi dijalankan (selalu, mode matang). Perhatikan bahwa karakter yang dimasukkan ketika mode sedang dialihkan mungkin hilang (fitur yang tidak menguntungkan dari driver terminal pada beberapa sistem). Satu-satunya alasan untuk menggunakan -ulang adalah jika tindakan Anda tergantung pada berjalan dalam mode matang.

Bendera -echo mengirimkan karakter yang cocok dengan pola berikut kembali ke proses yang menghasilkan mereka ketika setiap karakter dibaca. Ini mungkin berguna ketika pengguna perlu melihat umpan balik dari pola yang diketik sebagian.

Jika pola sedang digemakan tetapi akhirnya gagal untuk mencocokkan, karakter dikirim ke proses melahirkan. Jika proses melahirkan kemudian menggemakan mereka, pengguna akan melihat karakter dua kali. -tindakan mungkin hanya sesuai dalam situasi di mana pengguna tidak mungkin untuk tidak melengkapi pola. Sebagai contoh, kutipan berikut berasal dari rftp, skrip rekursif-ftp, di mana pengguna diminta untuk memasukkan ~ g, ~ p, atau ~ l, untuk mendapatkan, meletakkan, atau daftar direktori saat ini secara rekursif. Ini sangat jauh dari perintah ftp normal, bahwa pengguna tidak mungkin mengetik ~ diikuti oleh hal lain, kecuali keliru, dalam hal ini, mereka mungkin hanya mengabaikan hasilnya.

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

Flag -nobuffer mengirimkan karakter yang cocok dengan pola berikut ke proses output ketika karakter dibaca.

Ini berguna ketika Anda ingin membiarkan suatu program menggemakan kembali pola tersebut. Misalnya, yang berikut ini mungkin digunakan untuk memantau di mana seseorang melakukan panggilan (modem bergaya Hayes). Setiap kali "atd" terlihat skrip masuk ke baris selanjutnya.

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

Selama berinteraksi , penggunaan log_user sebelumnya diabaikan. Secara khusus, berinteraksi akan memaksa outputnya untuk dicatat (dikirim ke output standar) karena dianggap pengguna tidak ingin berinteraksi secara membabi buta.

Flag -o menyebabkan pasangan kunci-tubuh berikut untuk diterapkan pada output dari proses saat ini. Ini dapat bermanfaat, misalnya, ketika berhadapan dengan host yang mengirim karakter yang tidak diinginkan selama sesi telnet.

Secara default, berinteraksi mengharapkan pengguna untuk menulis stdin dan membaca stdout dari proses Expect itu sendiri. Flag -u (untuk "user") membuat interaksi mencari pengguna sebagai proses yang dinamai oleh argumennya (yang harus menjadi id yang bertelur).

Ini memungkinkan dua proses yang tidak terkait untuk digabungkan tanpa menggunakan loop eksplisit. Untuk membantu dalam debugging, Harapkan diagnostik selalu pergi ke stderr (atau stdout untuk informasi logging dan debugging tertentu). Untuk alasan yang sama, perintah interpreter akan dibaca secara interaktif dari stdin.

Misalnya, fragmen berikut membuat proses masuk. Kemudian memanggil pengguna (tidak ditampilkan), dan akhirnya menghubungkan keduanya bersama. Tentu saja, proses apa pun dapat diganti untuk masuk. Shell, misalnya, akan memungkinkan pengguna untuk bekerja tanpa menyediakan akun dan kata sandi.

spawn login set login $ spawn_id spawn tip modem # panggil kembali ke pengguna # connect user untuk login berinteraksi -u $ login

Untuk mengirim keluaran ke beberapa proses, buat daftar setiap daftar bibit yang diawali dengan tanda -output . Input untuk sekelompok ID output spawn dapat ditentukan dengan daftar spawn id yang diawali oleh flag -input . (Baik -input dan -output dapat mengambil daftar dalam bentuk yang sama seperti flag -i dalam perintah yang diharapkan , kecuali bahwa any_spawn_id tidak berarti dalam berinteraksi .) Semua bendera dan string (atau pola) berikut berlaku untuk input ini sampai yang lain - flag input muncul. Jika tidak ada -input muncul, -output mengimplikasikan "-input $ user_spawn_id -output". (Demikian pula, dengan pola yang tidak memiliki -input .) Jika satu- input ditentukan, itu menimpa $ user_spawn_id. Jika input- kedua ditentukan, itu menimpa $ spawn_id. Bendera tanda tambahan dapat ditentukan.

Kedua proses input tersirat secara default memiliki output yang ditetapkan sebagai $ spawn_id dan $ user_spawn_id (secara terbalik). Jika flag -input muncul tanpa flag -output , karakter dari proses tersebut dibuang.

Flag -i memperkenalkan pengganti spawn_id saat ini ketika tidak ada flag -put atau -output lain yang digunakan. Bendera A -i mengimplikasikan flag -o.

Adalah mungkin untuk mengubah proses yang sedang diinteraksikan dengan menggunakan ID bibit tidak langsung. (Indirect spawn id dijelaskan di bagian pada perintah yang diharapkan.) Id tidak dapat dinaikkan secara tidak langsung dapat ditentukan dengan flag -i, -u, -input, atau -output.

interpreter [args]
menyebabkan pengguna diminta secara interaktif untuk Mengharapkan dan perintah Tcl. Hasil dari setiap perintah dicetak.

Tindakan seperti istirahat dan terus menyebabkan struktur kontrol (yaitu, untuk , proc ) untuk berperilaku dengan cara biasa. Namun kembalinya menyebabkan juru bahasa kembali ke pemanggilnya, sementara inter_return menyebabkan juru bahasa menyebabkan kembalinya pemanggilnya. Misalnya, jika "proc foo" disebut interpreter yang kemudian mengeksekusi tindakan inter_return , proc foo akan kembali. Perintah lainnya menyebabkan interpreter melanjutkan perintah baru.

Secara default, prompt berisi dua bilangan bulat. Bilangan bulat pertama menggambarkan kedalaman tumpukan evaluasi (yaitu, berapa kali Tcl_Eval telah dipanggil). Bilangan bulat kedua adalah pengidentifikasi riwayat Tcl. Prompt dapat ditetapkan dengan mendefinisikan prosedur yang disebut "prompt1" yang mengembalikan nilai menjadi prompt berikutnya. Jika pernyataan memiliki tanda kutip terbuka, parens, tanda kurung, atau tanda kurung, prompt sekunder (secara default "+>") diterbitkan pada baris baru. Prompt sekunder dapat diatur dengan mendefinisikan prosedur yang disebut "prompt2".

Selama juru bahasa , mode matang digunakan, bahkan jika pemanggilnya menggunakan mode mentah.

Jika stdin ditutup, interpreter akan kembali kecuali flag -eof digunakan, dalam hal mana argumen berikutnya dipanggil.

log_file [args] [[-a] file]
Jika nama file disediakan, log_file akan merekam transkrip sesi (dimulai pada titik itu) di file. log_file akan berhenti merekam jika tidak ada argumen yang diberikan. File log sebelumnya ditutup.

Alih-alih nama file, pengenal file Tcl dapat disediakan dengan menggunakan flag -open atau -leaveopen . Ini mirip dengan perintah spawn . (Lihat bibit untuk info lebih lanjut.)

Output pasukan -a memaksa untuk dicatat yang ditekan oleh perintah log_user .

Secara default, perintah log_file ditambahkan ke file lama daripada memangkasnya, untuk kenyamanan karena dapat menonaktifkan dan menonaktifkan log beberapa kali dalam satu sesi. Untuk memotong file, gunakan flag -noappend .

Bendera -info menyebabkan log_file untuk mengembalikan deskripsi dari argumen non-info terbaru yang diberikan.

log_user -info | 0 | 1
Secara default, dialog kirim / harapkan dicatat ke stdout (dan logfile jika terbuka). Pencatatan ke stdout dinonaktifkan oleh perintah "log_user 0" dan diaktifkan kembali oleh "log_user 1". Logging ke logfile tidak berubah.

Bendera -info menyebabkan log_user untuk mengembalikan deskripsi dari argumen non-info terbaru yang diberikan.

match_max [-d] [-i spawn_id] [ukuran]
mendefinisikan ukuran buffer (dalam byte) yang digunakan secara internal oleh ekspektasi . Tanpa argumen ukuran , ukuran saat ini dikembalikan.

Dengan tanda -d , ukuran default ditetapkan. (Default awal adalah 2000.) Dengan flag -i , ukuran diatur untuk id spawn bernama, jika tidak diatur untuk proses saat ini.

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
mengeksekusi " argumen program " sebagai pengganti program Ekspektasi saat ini, yang berakhir. Sebuah argumen tanda hubung kosong memaksa tanda hubung di depan nama perintah seolah-olah itu adalah shell login. Semua spawn_ids ditutup kecuali yang dinamakan sebagai argumen. Ini dipetakan ke pengidentifikasi file bernama.

Spawn_ids dipetakan ke pengidentifikasi file untuk mewarisi program baru. Sebagai contoh, baris berikut menjalankan catur dan memungkinkannya untuk dikendalikan oleh proses saat ini - katakanlah, seorang master catur.

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

Ini lebih efisien daripada "interact -u", namun, ia mengorbankan kemampuan untuk melakukan interaksi terprogram karena proses Expect tidak lagi memegang kendali.

Perhatikan bahwa tidak ada terminal pengendali yang disediakan. Jadi, jika Anda memutuskan atau memetakan kembali input standar, program yang melakukan kontrol pekerjaan (cangkang, login, dll) tidak akan berfungsi dengan baik.

paritas [-d] [-i spawn_id] [value]
menentukan apakah paritas harus dipertahankan atau dilucuti dari output proses yang dihasilkan. Jika nilainya nol, paritas dilucuti, jika tidak maka tidak dilucuti. Tanpa argumen nilai , nilai saat ini dikembalikan.

Dengan tanda -d , nilai paritas default ditetapkan. (Default awal adalah 1, yaitu, paritas tidak dilucuti.) Dengan -i flag, nilai paritas diatur untuk id spawn bernama, jika tidak diatur untuk proses saat ini.

remove_nulls [-d] [-i spawn_id] [value]
mendefinisikan apakah nulls dipertahankan atau dihapus dari output proses menelurkan sebelum pencocokan pola atau menyimpan dalam variabel expect_out atau interact_out . Jika nilainya 1, nol akan dihapus. Jika nilainya 0, null tidak dihapus. Tanpa argumen nilai , nilai saat ini dikembalikan.

Dengan tanda -d , nilai default ditetapkan. (Default awal adalah 1, yaitu, null dihapus.) Dengan -i flag, nilai ditetapkan untuk id spawn bernama, jika tidak diatur untuk proses saat ini.

Apakah atau tidak null dihapus, Harapkan akan mencatat byte nol ke log dan stdout.

kirim string [-flags]
Mengirim string ke proses saat ini. Misalnya, perintah

kirim "hello world \ r"

mengirim karakter, helloworld ke proses saat ini. (Tcl menyertakan perintah printf -like ( format yang dipanggil) yang dapat membuat string yang rumit secara acak.)

Karakter dikirim segera meskipun program dengan masukan buffer line tidak akan membaca karakter sampai karakter balasan dikirim. Karakter kembali dinotasikan "\ r".

The - flag memaksa argumen berikutnya ditafsirkan sebagai string, bukan bendera. String apa pun dapat didahului oleh "-" apakah benar-benar terlihat seperti bendera atau tidak. Ini menyediakan mekanisme yang dapat diandalkan untuk menentukan string variabel tanpa tersandung oleh mereka yang secara tidak sengaja terlihat seperti bendera. (Semua string yang dimulai dengan "-" dicadangkan untuk opsi mendatang.)

Flag -i menyatakan bahwa string dikirim ke spawn_id yang dinamai. Jika spawn_id adalah user_spawn_id , dan terminal dalam mode mentah, baris baru dalam string diterjemahkan ke urutan return-newline sehingga muncul seolah-olah terminal dalam mode matang. Tanda -Gambar menonaktifkan terjemahan ini.

Bendera -null mengirim karakter nol (0 byte). Secara default, satu nol dikirim. Sebuah integer dapat mengikuti -null untuk menunjukkan berapa banyak null yang akan dikirim.

Bendera-pecah menghasilkan kondisi istirahat. Ini hanya masuk akal jika id bibit mengacu pada perangkat tty yang dibuka melalui "spawn-open". Jika Anda telah menelurkan proses seperti tip, Anda harus menggunakan konvensi tip untuk menghasilkan istirahat.

Kekuatan flag -s akan dikirim "lambat", sehingga hindari situasi umum di mana komputer mengalahkan input buffer yang dirancang untuk manusia yang tidak akan pernah menghasilkan tipe buffer yang sama. Output ini dikontrol oleh nilai variabel "send_slow" yang mengambil daftar dua elemen. Elemen pertama adalah integer yang menggambarkan jumlah byte untuk mengirim secara atom. Elemen kedua adalah bilangan real yang menjelaskan jumlah detik yang dikirimkan atom harus dipisahkan. Misalnya, "set send_slow {10 .001}" akan memaksa "mengirim -s" untuk mengirim string dengan 1 milidetik di antara setiap 10 karakter yang dikirim.

Pasukan -h memaksa output dikirim (agak) seperti manusia yang benar-benar mengetik. Penundaan seperti manusia muncul di antara karakter. (Algoritma ini didasarkan pada distribusi Weibull, dengan modifikasi yang sesuai dengan aplikasi khusus ini.) Output ini dikontrol oleh nilai variabel "send_human" yang mengambil daftar lima elemen. Dua elemen pertama adalah waktu antar waktu rata-rata karakter dalam hitungan detik. Yang pertama digunakan secara default. Yang kedua digunakan pada akhiran kata, untuk mensimulasikan jeda halus yang kadang-kadang terjadi pada transisi tersebut. Parameter ketiga adalah ukuran variabilitas di mana .1 cukup bervariasi, 1 cukup bervariasi, dan 10 cukup bervariasi. Yang ekstrem adalah 0 hingga tak terbatas. Dua parameter terakhir adalah, masing-masing, waktu interarrival minimum dan maksimum. Minimum dan maksimum digunakan terakhir dan "klip" waktu akhir. Rata-rata akhir dapat sangat berbeda dari rata-rata yang diberikan jika nilai minimum dan maksimum klip cukup.

Sebagai contoh, perintah berikut mengemulasi pengetik yang cepat dan konsisten:

set send_human {.1 .3 1 .05 2} kirim -h "Aku lapar. Ayo kita makan siang."

sementara yang berikut mungkin lebih cocok setelah hangover:

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

Perhatikan bahwa kesalahan tidak disimulasikan, meskipun Anda dapat mengatur sendiri situasi koreksi kesalahan dengan menanamkan kesalahan dan koreksi dalam argumen pengiriman.

Bendera untuk mengirim karakter nol, untuk mengirim istirahat, untuk memaksa output yang lambat dan untuk output gaya manusia saling eksklusif. Hanya yang ditentukan terakhir yang akan digunakan. Selanjutnya, tidak ada argumen string yang dapat ditentukan dengan tanda untuk mengirim karakter null atau jeda.

Adalah ide yang baik untuk mendahului pengiriman pertama ke suatu proses dengan harapan . berharap akan menunggu proses untuk memulai, sementara kirim tidak bisa. Khususnya, jika pengiriman pertama selesai sebelum proses mulai berjalan, Anda berisiko kehilangan data Anda. Dalam situasi di mana program interaktif tidak menawarkan prompt awal, Anda dapat mendahului pengiriman dengan penundaan seperti pada:

# Untuk menghindari memberikan petunjuk kepada peretas tentang cara menerobos, # sistem ini tidak meminta kata sandi eksternal. # Tunggu selama 5 detik agar exec untuk menyelesaikan menelurkan telnet sangat.secure.gov tidur 5 mengirim kata sandi \ r

exp_send adalah alias untuk pengiriman. Jika Anda menggunakan Expectk atau beberapa varian lain dari Mengharapkan dalam lingkungan Tk, kirim didefinisikan oleh Tk untuk tujuan yang sama sekali berbeda. exp_send disediakan untuk kompatibilitas antar lingkungan. Alias ​​serupa disediakan untuk perintah pengiriman lainnya dari Expect.

string send_error [-flags]
seperti mengirim , kecuali bahwa output dikirim ke stderr daripada proses saat ini.

send_log [-] string
seperti mengirim , kecuali bahwa string hanya dikirim ke file log (lihat log_file .) Argumen diabaikan jika tidak ada file log yang terbuka.

string send_tty [-flags]
seperti mengirim , kecuali bahwa output dikirim ke / dev / tty daripada proses saat ini.

string send_user [-flags]
seperti mengirim , kecuali bahwa output dikirim ke stdout daripada proses saat ini.

detik tidur
menyebabkan skrip tertidur selama beberapa detik yang ditentukan. Detik mungkin angka desimal. Interupsi (dan acara Tk jika Anda menggunakan Expectk) diproses saat Mengharapkan tidur.

program spawn [args] [args]
membuat proses baru yang menjalankan " argumen program ". Stdin, stdout dan stderr terhubung dengan Expect, sehingga dapat dibaca dan ditulis oleh perintah Expect lainnya. Sambungan rusak karena dekat atau jika proses itu sendiri menutup salah satu pengidentifikasi file.

Ketika suatu proses dimulai oleh spawn , spawn_id variabel diatur ke deskriptor yang mengacu pada proses itu . Proses yang dijelaskan oleh spawn_id dianggap sebagai " proses saat ini ". spawn_id dapat dibaca atau ditulis, yang pada dasarnya memberikan kontrol pekerjaan.

user_spawn_id adalah variabel global yang berisi deskriptor yang mengacu pada pengguna. Misalnya, ketika spawn_id disetel ke nilai ini, harapkan berperilaku seperti expect_user .

.I error_spawn_id adalah variabel global yang berisi deskriptor yang mengacu pada kesalahan standar. Misalnya, ketika spawn_id disetel ke nilai ini, kirim berperilaku seperti send_error .

tty_spawn_id adalah variabel global yang berisi deskriptor yang mengacu pada / dev / tty. Jika / dev / tty tidak ada (seperti dalam skrip cron, at, atau batch), maka tty_spawn_id tidak didefinisikan. Ini dapat diuji sebagai:

jika {[info vars tty_spawn_id]} {# / dev / tty exists} else {# / dev / tty tidak ada # mungkin di cron, batch, atau di skrip}

menelurkan mengembalikan id proses UNIX. Jika tidak ada proses yang dihasilkan, 0 dikembalikan. Spawn_out variabel (budak, nama) diatur ke nama perangkat budak pty.

Secara default, spawn menggemakan nama dan argumen perintah. Bendera -noecho berhenti bertelur dari melakukan hal ini.

Bendera -console menyebabkan keluaran konsol akan dialihkan ke proses melahirkan. Ini tidak didukung di semua sistem.

Secara internal, menelurkan menggunakan pty, diinisialisasi dengan cara yang sama dengan tty pengguna. Ini diinisialisasi lebih lanjut sehingga semua pengaturan "waras" (menurut stty (1)). Jika stty_init variabel didefinisikan, itu ditafsirkan dalam gaya argumen stty sebagai konfigurasi lebih lanjut. Misalnya, "atur stty_init raw" akan menyebabkan semakin memunculkan terminal proses untuk memulai dalam mode mentah. -nottycopy melompati inisialisasi berdasarkan tty pengguna. -nottyinit melompati inisialisasi "waras".

Biasanya, menelurkan membutuhkan sedikit waktu untuk mengeksekusi. Jika Anda melihat spawn mengambil sejumlah besar waktu, itu mungkin menghadapi ptys yang terjepit. Sejumlah tes dijalankan pada ptys untuk menghindari keterlibatan dengan proses yang salah. (Ini membutuhkan waktu 10 detik per pty yang terjepit.) Running Expect dengan opsi -d akan menunjukkan apakah Expect sedang menghadapi banyak ptys di status ganjil. Jika Anda tidak dapat membunuh proses di mana ptys ini dilampirkan, satu-satunya cara Anda mungkin untuk reboot.

Jika program tidak dapat berhasil dibangkitkan karena exec (2) gagal (misalnya ketika program tidak ada), pesan kesalahan akan dikembalikan oleh interaksi berikutnya atau mengharapkan perintah seolah-olah program telah berjalan dan menghasilkan pesan kesalahan sebagai output. Perilaku ini merupakan konsekuensi alami dari pelaksanaan bertelur . Secara internal, bertelur garpu, setelah proses menelurkan tidak memiliki cara untuk berkomunikasi dengan proses Expect asli kecuali dengan komunikasi melalui spawn_id.

Bendera-membuka menyebabkan argumen berikutnya ditafsirkan sebagai pengidentifikasi file Tcl (yaitu, dikembalikan oleh terbuka .) Id menelurkan kemudian dapat digunakan seolah-olah itu adalah proses menelurkan. (Pengidentifikasi file seharusnya tidak lagi digunakan.) Ini memungkinkan Anda memperlakukan perangkat mentah, file, dan saluran pipa sebagai proses yang menghasilkan tanpa menggunakan pty. 0 dikembalikan untuk menunjukkan tidak ada proses terkait. Ketika koneksi ke proses menelurkan ditutup, begitu juga pengidentifikasi file Tcl. Flag -leaveopen mirip dengan -pen kecuali bahwa -leaveopen menyebabkan pengidentifikasi file dibiarkan terbuka bahkan setelah id spawn ditutup.

Bendera -pty menyebabkan pty dibuka tetapi tidak ada proses yang dihasilkan. 0 dikembalikan untuk menunjukkan tidak ada proses terkait. Spawn_id diatur seperti biasa.

Spawn_out variabel (budak, fd) diatur ke pengidentifikasi file yang sesuai dengan budak pty. Ini bisa ditutup menggunakan "tutup-budak".

Flag -ignore menandakan sebuah sinyal untuk diabaikan dalam proses melahirkan. Jika tidak, sinyal mendapatkan perilaku default. Sinyal dinamai seperti dalam perintah trap , kecuali bahwa setiap sinyal membutuhkan bendera terpisah.

tingkat strace
menyebabkan pernyataan berikut akan dicetak sebelum dieksekusi. (Tcl melacak jejak melacak variabel.) Tingkat menunjukkan seberapa jauh dalam panggilan stack untuk dilacak. Sebagai contoh, perintah berikut menjalankan Mengharapkan sementara menelusuri 4 tingkat panggilan pertama, tetapi tidak ada di bawah itu.

harapkan -c "strace 4" script.exp

Bendera -info menyebabkan strace untuk mengembalikan deskripsi dari argumen non-info terbaru yang diberikan.

stty args
mengubah mode terminal sama dengan perintah stty eksternal.

Secara default, terminal pengendali diakses. Terminal lain dapat diakses dengan menambahkan "Permintaan untuk mengembalikan status sebagai hasil dari perintah. Jika tidak ada status yang diminta dan terminal pengontrol diakses, status sebelumnya dari atribut baku dan gema dikembalikan dalam bentuk yang nantinya dapat digunakan oleh perintah.

Misalnya, argumen mentah atau -cooked menempatkan terminal ke mode mentah. Argumen -raw atau dimasak menempatkan terminal ke dalam mode matang. Argumen-argumen itu bergema dan -tentu menempatkan terminal ke dalam mode echo dan noecho.

Contoh berikut mengilustrasikan cara menonaktifkan sementara gema. Ini dapat digunakan dalam skrip yang tidak otomatis untuk menghindari penyematan kata sandi di dalamnya. (Lihat lebih banyak diskusi tentang ini di bawah HATI YANG DIHARAPKAN di bawah.)

stty -echo send_user "Password:" expect_user-re "(. *) \ n" set password $ expect_out (1, string) stty echo

sistem berdebat
memberikan args ke sh (1) sebagai input, sama seperti jika telah diketik sebagai perintah dari terminal. Tunggu sampai cangkang berakhir. Status pengembalian dari sh ditangani dengan cara yang sama dengan exec yang menangani status pengembaliannya.

Berbeda dengan exec yang mengalihkan stdin dan stdout ke script, sistem tidak melakukan redirection (selain yang ditunjukkan oleh string itu sendiri). Dengan demikian, adalah mungkin untuk menggunakan program yang harus berbicara langsung ke / dev / tty. Untuk alasan yang sama, hasil sistem tidak dicatat dalam log.

timestamp [args]
mengembalikan stempel waktu. Tanpa argumen, jumlah detik sejak epos dikembalikan.

Flag -format memperkenalkan string yang dikembalikan tetapi dengan substitusi yang dibuat sesuai dengan aturan POSIX untuk strftime. Misalnya% a diganti dengan nama hari kerja singkat (yaitu, Sat). Lainnya adalah:

% nama akhir pekan disingkat% Nama lengkap hari kerja% b disingkat nama bulan% B nama bulan penuh% c tanggal-waktu seperti pada: Rab 6 Okt 11:45:56 1993% d hari dalam sebulan (01-31% H jam (00-23)% I jam (01-12)% j hari (001-366)% m bulan (01-12)% M menit (00-59)% p am atau pm% S detik (00-61) % u hari (1-7, Senin adalah hari pertama minggu)% U minggu (00-53, Minggu pertama adalah hari pertama minggu pertama)% V minggu (01-53, ISO 8601 gaya)% w hari (0- 6)% W minggu (00-53, Senin pertama adalah hari pertama minggu pertama)% x tanggal-waktu seperti pada: Rab 6 Oktober 1993% X waktu seperti pada: 23:59:59% y tahun (00-99) % Y tahun seperti: 1993% Z zona waktu (atau tidak ada apa pun jika tidak dapat ditentukan) %% tanda persen telanjang

Spesifikasi% lainnya tidak terdefinisi. Karakter lain akan dilewatkan tanpa disentuh. Hanya bahasa C yang didukung.

Bendera -seconds memperkenalkan beberapa detik sejak zaman untuk digunakan sebagai sumber untuk memformat. Jika tidak, waktu saat ini digunakan.

The- gmt flag memaksa timestamp keluaran untuk menggunakan zona waktu GMT . Tanpa bendera, zona waktu lokal digunakan.

perangkap [[command] signals]
menyebabkan perintah yang diberikan akan dieksekusi setelah menerima sinyal yang diberikan di masa mendatang. Perintah dijalankan dalam lingkup global. Jika perintah tidak ada, aksi sinyal dikembalikan. Jika perintah adalah string SIG_IGN, sinyal diabaikan. Jika perintah adalah string SIG_DFL, sinyal adalah hasil ke default sistem. sinyal adalah sinyal tunggal atau daftar sinyal. Sinyal dapat ditentukan secara numerik atau simbolis sesuai sinyal (3). Awalan "SIG" dapat dihilangkan.

Tanpa argumen (atau argumen-angka), trap mengembalikan nomor sinyal dari perintah trap yang sedang dieksekusi.

Bendera- kode menggunakan kode kembali dari perintah di tempat kode apa pun Tcl hendak kembali ketika perintah awalnya mulai berjalan.

Bendera -interp menyebabkan perintah untuk dievaluasi menggunakan interpreter aktif pada saat perintah mulai berjalan daripada ketika jebakan itu dideklarasikan.

Bendera -name menyebabkan perintah trap untuk mengembalikan nama sinyal dari perintah trap yang sedang dieksekusi.

Bendera -max menyebabkan perintah trap untuk mengembalikan nomor sinyal terbesar yang dapat diatur.

Misalnya, perintah "trap {send_user" Ouch! "} SIGINT" akan mencetak "Aduh!" setiap kali pengguna menekan ^ C.

Secara default, SIGINT (yang biasanya dapat dihasilkan dengan menekan ^ C) dan SIGTERM menyebabkan Expect untuk keluar. Ini karena jebakan berikut, dibuat secara default ketika Harapkan dimulai.

pintu keluar perangkap {SIGINT SIGTERM}

Jika Anda menggunakan flag-D untuk memulai debugger, SIGINT didefinisikan ulang untuk memulai debugger interaktif. Ini karena perangkap berikut:

perangkap {exp_debug 1} SIGINT

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

Anda dapat, tentu saja, mengesampingkan keduanya hanya dengan menambahkan perintah perangkap ke skrip Anda. Secara khusus, jika Anda memiliki "perangkap keluar SIGINT" Anda sendiri, ini akan menimpa perangkap debugger. Ini berguna jika Anda ingin mencegah pengguna mencapai debugger sama sekali.

Jika Anda ingin menentukan perangkap Anda sendiri di SIGINT tetapi masih menjebak ke debugger ketika sedang berjalan, gunakan:

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

Atau, Anda dapat menjebak ke debugger menggunakan beberapa sinyal lain.

Perangkap tidak akan membiarkan Anda mengganti tindakan untuk SIGALRM karena ini digunakan secara internal untuk Mengharapkan . Perintah lepaskan set SIGALRM ke SIG_IGN (abaikan). Anda dapat mengaktifkan kembali ini selama Anda menonaktifkannya selama perintah bibit berikutnya.

Lihat sinyal (3) untuk info lebih lanjut.

tunggu [args]
penundaan sampai proses melahirkan (atau proses saat ini jika tidak ada yang bernama) berakhir.

tunggu biasanya mengembalikan daftar empat bilangan bulat. Bilangan bulat pertama adalah pid dari proses yang ditunggu. Bilangan bulat kedua adalah id bibit yang bersesuaian. Bilangan bulat ketiga adalah -1 jika kesalahan sistem operasi terjadi, atau 0 sebaliknya. Jika bilangan bulat ketiga adalah 0, bilangan bulat keempat adalah status yang dikembalikan oleh proses melahirkan. Jika bilangan bulat ketiga adalah -1, bilangan bulat keempat adalah nilai errno yang ditetapkan oleh sistem operasi. Kode kesalahan variabel global juga diatur.

Elemen tambahan dapat muncul di akhir nilai kembalian dari tunggu . Unsur kelima opsional mengidentifikasi kelas informasi. Saat ini, satu-satunya nilai yang mungkin untuk elemen ini adalah CHILDKILLED, dalam hal ini dua nilai berikutnya adalah nama sinyal C-style dan deskripsi teks singkat.

Flag -i menyatakan proses menunggu sesuai dengan spawn_id yang dinamai (BUKAN id proses ). Di dalam penangan SIGCHLD, dimungkinkan untuk menunggu proses melahirkan dengan menggunakan spawn id -1.

Bendera -nowait menyebabkan menunggu untuk segera kembali dengan indikasi menunggu sukses. Ketika proses keluar (nanti), secara otomatis akan hilang tanpa perlu menunggu eksplisit.

Perintah tunggu juga dapat digunakan untuk menunggu proses bercabang menggunakan argumen "-i -1". Tidak seperti penggunaannya dengan proses spawning, perintah ini dapat dieksekusi kapan saja. Tidak ada kontrol atas proses mana yang dituai. Namun, nilai kembalian dapat diperiksa untuk id proses .

PERPUSTAKAAN

Berharap secara otomatis tahu tentang dua pustaka bawaan untuk skrip Expect. Ini didefinisikan oleh direktori yang bernama dalam variabel exp_library dan exp_exec_library. Keduanya dimaksudkan untuk memuat file utilitas yang dapat digunakan oleh skrip lain.

exp_library berisi file-file arsitektur-independen. exp_exec_library berisi file yang bergantung pada arsitektur. Tergantung pada sistem Anda, kedua direktori mungkin kosong sama sekali. Keberadaan file $ exp_exec_library / cat-buffer menjelaskan apakah buffer bin / kucing Anda secara default.

PRETTY-PRINTING

Definisi vgrind tersedia untuk skrip Expect yang mudah dicetak. Dengan asumsi definisi vgrind yang disertakan dengan distribusi Ekspektasi diinstal dengan benar, Anda dapat menggunakannya sebagai:

file vgrind -fleksi

CONTOH

Banyak yang tidak jelas bagaimana menempatkan semuanya bersama-sama yang digambarkan halaman buku itu . Saya mendorong Anda untuk membaca dan mencoba contoh di direktori contoh dari distribusi Expect . Beberapa di antaranya adalah program nyata. Yang lain hanya menggambarkan teknik tertentu, dan tentu saja, pasangan hanyalah peretasan singkat. File INSTALL memiliki gambaran singkat tentang program-program ini.

Makalah Harapan (lihat LIHAT JUGA) juga berguna. Sementara beberapa makalah menggunakan sintaks yang sesuai dengan versi sebelumnya dari Mengharapkan, alasan-alasan yang menyertainya masih berlaku dan masuk ke lebih banyak detail daripada halaman manual ini.

CAVEAT

Ekstensi dapat bertabrakan dengan nama perintah Expect. Misalnya, kirim ditentukan oleh Tk untuk tujuan yang sama sekali berbeda. Untuk alasan ini, sebagian besar perintah Expect juga tersedia sebagai "exp_XXXX". Perintah dan variabel yang diawali dengan "exp", "inter", "spawn", dan "timeout" tidak memiliki alias. Gunakan nama perintah yang diperluas jika Anda memerlukan kompatibilitas ini di antara lingkungan.

Harapkan mengambil pandangan yang agak liberal tentang pelingkupan. Secara khusus, variabel yang dibaca oleh perintah khusus untuk program Expect akan dicari lebih dulu dari lingkup lokal, dan jika tidak ditemukan, dalam lingkup global. Sebagai contoh, ini menghilangkan kebutuhan untuk menempatkan "timeout global" di setiap prosedur yang Anda tulis yang menggunakan mengharapkan . Di sisi lain, variabel yang ditulis selalu dalam lingkup lokal (kecuali perintah "global" telah dikeluarkan). Masalah paling umum yang ditimbulkan ini adalah kapan spawn dijalankan dalam suatu prosedur. Di luar prosedur, spawn_id tidak ada lagi, sehingga proses melahirkan tidak lagi dapat diakses hanya karena pelingkupan. Tambahkan "spawn_id global" ke prosedur semacam itu.

Jika Anda tidak dapat mengaktifkan kemampuan multispawning (yaitu, sistem Anda tidak mendukung memilih (BSD *. *), Jajak pendapat (SVR> 2), atau sesuatu yang setara), Harapkan hanya akan dapat mengontrol satu proses pada satu waktu. Dalam hal ini, jangan mencoba untuk mengatur spawn_id , Anda juga tidak harus mengeksekusi proses melalui exec sementara proses melahirkan sedang berjalan. Selanjutnya, Anda tidak akan dapat mengharapkan dari beberapa proses (termasuk pengguna sebagai satu) pada saat yang bersamaan.

Parameter terminal dapat memiliki efek besar pada skrip. Sebagai contoh, jika sebuah skrip ditulis untuk mencari gema, itu akan salah jika echo dimatikan. Untuk alasan ini, Harapkan kekuatan parameter terminal waras secara default. Sayangnya, ini dapat membuat hal-hal tidak menyenangkan untuk program lain. Sebagai contoh, shell emacs ingin mengubah pemetaan "biasa": baris baru dipetakan ke newlines daripada baris baru carriage-return, dan echoing dinonaktifkan. Ini memungkinkan seseorang untuk menggunakan emacs untuk mengedit baris input. Sayangnya, Expect tidak mungkin menebak ini.

Anda dapat meminta agar Expect tidak mengesampingkan pengaturan default dari parameter terminal, tetapi Anda harus sangat berhati-hati saat menulis skrip untuk lingkungan seperti itu. Dalam kasus emacs, hindari tergantung pada hal-hal seperti pemetaan gema dan akhir-akhir.

Perintah yang menerima argumen yang dilekatkan ke dalam daftar tunggal (varian dan interaksi yang diharapkan ) menggunakan heuristik untuk memutuskan apakah daftar tersebut benar-benar satu argumen atau banyak. Heuristik dapat gagal hanya dalam kasus ketika daftar benar-benar mewakili argumen tunggal yang memiliki beberapa tertanam dengan karakter non-spasi di antara mereka. Ini tampaknya cukup mustahil, namun argumen "-nobrace" dapat digunakan untuk memaksa satu argumen untuk ditangani sebagai argumen tunggal. Ini bisa dibayangkan digunakan dengan kode Harapan yang dihasilkan oleh mesin. Demikian pula, -membawa kekuatan satu argumen untuk ditangani sebagai beberapa pola / tindakan.

BUG

Sangat menggoda untuk menamai program "seks" (untuk "Smart EXec" atau "Kirim-Ekspeksi"), tetapi akal sehat (atau mungkin hanya Puritanisme) menang.

Pada beberapa sistem, ketika sebuah shell muncul, ia mengeluh tentang tidak bisa mengakses tty tetapi tetap berjalan. Ini berarti sistem Anda memiliki mekanisme untuk mendapatkan mengendalikan tty yang tidak diketahui oleh Expect . Silakan cari tahu apa itu, dan kirimkan informasi ini kembali kepada saya.

Ultrix 4.1 (setidaknya versi terbaru di sini) menganggap timeout di atas 1000000 setara dengan 0.

Digital UNIX 4.0A (dan mungkin versi lainnya) menolak untuk mengalokasikan ptys jika Anda mendefinisikan seorang penangan SIGCHLD. Lihat halaman hibah untuk info lebih lanjut.

IRIX 6.0 tidak menangani izin pty dengan benar sehingga jika Harapkan upaya untuk mengalokasikan pty yang sebelumnya digunakan oleh orang lain, gagal. Tingkatkan ke IRIX 6.1.

Telnet (diverifikasi hanya di bawah SunOS 4.1.2) macet jika TERM tidak diatur. Ini adalah masalah di bawah cron, di dan dalam skrip cgi, yang tidak mendefinisikan TERM. Jadi, Anda harus mengaturnya secara eksplisit - jenis apa yang biasanya tidak relevan. Itu hanya harus diatur untuk sesuatu! Berikut ini mungkin sudah cukup untuk sebagian besar kasus.

mengatur env (TERM) vt100

Tip (diverifikasi hanya di bawah BSDI BSD / OS 3.1 i386) macet jika SHELL dan HOME tidak disetel. Ini adalah masalah di bawah cron , di dan dalam skrip cgi , yang tidak menentukan variabel lingkungan ini. Jadi, Anda harus mengaturnya secara eksplisit - jenis apa yang biasanya tidak relevan. Itu hanya harus diatur untuk sesuatu! Berikut ini mungkin sudah cukup untuk sebagian besar kasus.

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

Beberapa implementasi ptys dirancang sehingga kernel membuang output yang belum dibaca setelah 10 hingga 15 detik (angka aktual tergantung pada implementasi) setelah proses menutup file deskriptor. Dengan demikian Mengharapkan program seperti

tanggal melahirkan tanggal 20 harapkan

akan gagal. Untuk menghindarinya, aktifkan program non-interaktif dengan exec daripada menelurkan . Meskipun situasi semacam itu dapat dibayangkan, dalam praktiknya saya belum pernah mengalami situasi di mana hasil akhir dari program yang benar-benar interaktif akan hilang karena perilaku ini.

Di sisi lain, Cray UNICOS ptys membuang output yang belum dibaca segera setelah proses telah menutup deskriptor file. Saya telah melaporkan ini kepada Cray dan mereka sedang berusaha memperbaikinya.

Terkadang penundaan diperlukan antara prompt dan respons, seperti ketika antarmuka tty mengubah pengaturan UART atau pencocokan baud rate dengan mencari bit start / stop. Biasanya, yang diperlukan hanyalah tidur selama satu atau dua detik. Teknik yang lebih kuat adalah mencoba kembali hingga perangkat keras siap menerima masukan. Contoh berikut menggunakan kedua strategi:

kirim "kecepatan 9600 \ r"; tidur 1 mengharapkan {timeout {send "\ r"; exp_continue} $ prompt}

trap -code tidak akan berfungsi dengan perintah apa pun yang ada di loop acara Tcl, seperti tidur. Masalahnya adalah bahwa dalam loop acara, Tcl membuang kode kembali dari penangan kejadian async. Solusinya adalah mengatur bendera di kode perangkap. Kemudian periksa bendera segera setelah perintah (yaitu, tidur).

Perintah expect_background mengabaikan argumen time-timeout dan tidak memiliki konsep timeout secara umum.

& # 34; EXPECT HINTS & # 34;

Ada beberapa hal tentang Expect yang mungkin tidak intuitif. Bagian ini mencoba membahas beberapa hal ini dengan beberapa saran.

Masalah umum yang diharapkan adalah bagaimana mengenali prompt shell. Karena ini dikustomisasi secara berbeda oleh orang yang berbeda dan cangkang yang berbeda, rlogin yang mengotomasi secara otomatis dapat menjadi sulit tanpa mengetahui perintahnya. Konvensi yang wajar adalah meminta pengguna menyimpan ekspresi reguler yang menjelaskan perintahnya (khususnya, bagian akhir) dalam variabel lingkungan EXPECT_PROMPT. Kode seperti berikut ini bisa digunakan. Jika EXPECT_PROMPT tidak ada, kode masih memiliki peluang bagus untuk berfungsi dengan benar.

set prompt "(% | # | \\ $) $"; # default prompt catch {set prompt $ env (EXPECT_PROMPT)} mengharapkan -re $ prompt

Saya mendorong Anda untuk menulis pola harapan yang mencakup akhir dari apa pun yang Anda harapkan untuk dilihat. Ini menghindari kemungkinan menjawab pertanyaan sebelum melihat semuanya. Selain itu, sementara Anda mungkin dapat menjawab pertanyaan sebelum melihatnya secara keseluruhan, jika Anda menjawab lebih awal, jawaban Anda mungkin muncul kembali di tengah-tengah pertanyaan. Dengan kata lain, dialog yang dihasilkan akan benar tetapi terlihat orak-arik.

Kebanyakan petunjuk memasukkan karakter spasi di bagian akhir. Sebagai contoh, prompt dari ftp adalah 'f', 't', 'p', '>' dan. Untuk menyesuaikan prompt ini, Anda harus memperhitungkan masing-masing karakter ini. Ini adalah kesalahan umum untuk tidak memasukkan yang kosong. Letakkan kosong secara eksplisit.

Jika Anda menggunakan pola bentuk X *, * akan cocok dengan semua output yang diterima dari akhir X ke hal terakhir yang diterima. Ini terdengar intuitif tetapi bisa agak membingungkan karena frase "hal terakhir yang diterima" dapat bervariasi tergantung pada kecepatan komputer dan pemrosesan I / O baik oleh kernel dan driver perangkat.

Secara khusus, manusia cenderung melihat keluaran program tiba dalam potongan besar (secara atom) ketika pada kenyataannya sebagian besar program menghasilkan keluaran satu baris pada satu waktu. Dengan asumsi ini adalah kasus, * dalam pola paragraf sebelumnya mungkin hanya cocok dengan akhir baris saat ini meskipun tampaknya ada lebih banyak, karena pada saat pertandingan itulah semua output yang telah diterima.

harapkan tidak ada cara untuk mengetahui bahwa output lebih lanjut akan datang kecuali pola Anda secara khusus memperhitungkannya.

Bahkan tergantung pada buffering yang berorientasi pada garis tidak bijaksana. Tidak hanya program yang jarang membuat janji tentang jenis buffering yang mereka lakukan, tetapi gangguan pencernaan sistem dapat memecah baris output sehingga garis-garis putus di tempat-tempat yang tampaknya acak. Jadi, jika Anda dapat mengekspresikan beberapa karakter terakhir dari suatu prompt ketika menulis pola, adalah bijaksana untuk melakukannya.

Jika Anda menunggu pola dalam output terakhir dari program dan program memancarkan sesuatu yang lain, Anda tidak akan dapat mendeteksi itu dengan kata kunci timeout . Alasannya adalah bahwa mengharapkan tidak akan timeout - melainkan akan mendapatkan indikasi jelas. Gunakan itu sebagai gantinya. Bahkan lebih baik, gunakan keduanya. Dengan cara itu jika garis itu berpindah, Anda tidak perlu mengedit baris itu sendiri.

Baris baru biasanya diubah menjadi carriage return, urutan linefeed saat output oleh driver terminal. Jadi, jika Anda menginginkan pola yang secara eksplisit cocok dengan dua garis, dari, katakanlah, printf ("foo \ nbar"), Anda harus menggunakan pola "foo \ r \ nbar".

Terjemahan serupa terjadi ketika membaca dari pengguna, melalui expect_user . Dalam hal ini, ketika Anda menekan kembali, itu akan diterjemahkan ke baris baru. Jika Expect kemudian meneruskannya ke program yang mengatur terminalnya ke mode mentah (seperti telnet), akan ada masalah, karena program mengharapkan pengembalian yang sebenarnya. (Beberapa program sebenarnya memaafkan karena mereka akan secara otomatis menerjemahkan baris baru untuk kembali, tetapi sebagian besar tidak.) Sayangnya, tidak ada cara untuk mengetahui bahwa program menempatkan terminalnya ke mode mentah.

Daripada secara manual mengganti baris baru dengan pengembalian, solusinya adalah dengan menggunakan perintah "stty raw", yang akan menghentikan terjemahan. Namun, perhatikan bahwa ini berarti Anda tidak akan lagi mendapatkan fitur pengeditan baris yang telah dimasak.

berinteraksi secara implisit menetapkan terminal Anda ke mode mentah sehingga masalah ini tidak akan muncul kemudian.

Seringkali berguna untuk menyimpan kata sandi (atau informasi pribadi lainnya) di skrip Expect . Ini tidak disarankan karena apa pun yang disimpan di komputer rentan diakses oleh siapa pun. Jadi, secara interaktif mendorong kata sandi dari skrip adalah ide yang lebih pintar daripada menanamkannya secara harfiah. Meskipun demikian, terkadang embedding semacam itu adalah satu-satunya kemungkinan.

Sayangnya, sistem file UNIX tidak memiliki cara langsung untuk membuat skrip yang dapat dieksekusi tetapi tidak dapat dibaca. Sistem yang mendukung skrip setgid shell secara tidak langsung dapat mensimulasikan ini sebagai berikut:

Buat skrip Expect (yang berisi data rahasia) seperti biasa. Buat izinnya menjadi 750 (-rwxr-x ---) dan dimiliki oleh grup tepercaya, yaitu grup yang diizinkan untuk membacanya. Jika perlu, buat grup baru untuk tujuan ini. Selanjutnya, buat skrip / bin / sh dengan izin 2751 (-rwxr-s - x) yang dimiliki oleh grup yang sama seperti sebelumnya.

Hasilnya adalah skrip yang dapat dieksekusi (dan dibaca) oleh siapa saja. Saat diminta, menjalankan skrip Expect .

& # 34; LIHAT JUGA & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: A Toolkit Berbasis Tcl untuk Mengotomasi Program Interaktif" oleh Don Libes, hlm. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"Mengharapkan: Menyembuhkan Fits of Interactivity yang Tak Terkendali" oleh Don Libes, Proceedings of the Summer 1990 USENIX Conference, Anaheim, California, 11-15 Juni 1990.
.I "Menggunakan Mengharapkan untuk Mengotomasi Tugas Administrasi Sistem" oleh Don Libes, Prosiding 1990 USENIX Konferensi Administrasi Sistem Instalasi Besar, Colorado Springs, Colorado, 17-19 Oktober 1990.
.I "Tcl: Suatu Bahasa Komando yang Dapat Diundang" oleh John Ousterhout, Risalah Konferensi 1990 USENIX Musim Dingin, Washington, DC, 22-26 Januari 1990, Saya "mengharapkan: Skrip untuk Mengontrol Program Interaktif" oleh Don Libes, Sistem Komputasi , Vol. 4, No. 2, University of California Press Journals, November 1991..I "Pengujian Regresi dan Pengujian Kesesuaian Program Interaktif", oleh Don Libes, Proceedings of the Summer 1992 USENIX Conference, pp. 135-144, San Antonio, TX, 12-15 Juni 1992..I "Kibitz - Menghubungkan Beberapa Program Interaktif Bersama", oleh Don Libes, Perangkat Lunak - Praktik & Pengalaman, John Wiley & Sons, West Sussex, Inggris, Vol.

23, No. 5, Mei, 1993..I "Sebuah Debugger untuk Aplikasi Tcl", oleh Don Libes, Proceedings of the 1993 Tcl / Tk Workshop, Berkeley, CA, 10-11 Juni 1993.

PENULIS

Don Libes, Institut Standar dan Teknologi Nasional

UCAPAN TERIMA KASIH

Terima kasih kepada John Ousterhout untuk Tcl, dan Scott Paisley untuk mendapatkan inspirasi. Terima kasih kepada Rob Savoye untuk kode konfigurasi otomatis Ekspektasi.

File HISTORY mendokumentasikan sebagian besar evolusi yang diharapkan . Ini membuat pembacaan yang menarik dan mungkin memberi Anda wawasan lebih lanjut ke perangkat lunak ini. Terima kasih kepada orang-orang yang disebutkan di dalamnya yang mengirimi saya perbaikan bug dan memberikan bantuan lain.

Desain dan implementasi Expect dibayar sebagian oleh pemerintah AS dan karena itu dalam domain publik. Namun penulis dan NIST ingin kredit jika program dan dokumentasi atau bagian dari mereka digunakan.