Yêu cầu của Linux / Unix

Mong đợi là một chương trình nói chuyện với các chương trình tương tác khác theo kịch bản. Theo kịch bản, Mong đợi biết những gì có thể được mong đợi từ một chương trình và những gì các phản ứng chính xác nên được. Một ngôn ngữ thông dịch cung cấp các cấu trúc điều khiển phân nhánh và mức cao để hướng trực tiếp hộp thoại. Ngoài ra, người dùng có thể kiểm soát và tương tác trực tiếp khi muốn, sau đó trở lại quyền kiểm soát tập lệnh.

Expectk là một hỗn hợp của Mong đợi và Tk. Nó hoạt động giống như mong muốn và mong muốn của Tk. Kỳ vọng cũng có thể được sử dụng trực tiếp trong C hoặc C ++ mà không có Tcl.

Cái tên "Mong đợi" xuất phát từ ý tưởng về chuỗi gửi / mong đợi được phổ biến bởi uucp, kermit và các chương trình điều khiển modem khác. Tuy nhiên không giống như uucp, Mong đợi được tổng quát để nó có thể chạy như một lệnh cấp người dùng với bất kỳ chương trình và nhiệm vụ nào trong tâm trí. Mong đợi có thể nói chuyện với nhiều chương trình cùng một lúc.

Những gì mong đợi có thể làm

Ví dụ, đây là một số thứ mà lệnh mong đợi có thể thực hiện:

Có nhiều lý do tại sao trình bao không thể thực hiện các tác vụ này. Tất cả đều có thể với kỳ vọng.

Nói chung, Mong đợi là hữu ích cho việc chạy bất kỳ chương trình nào yêu cầu sự tương tác giữa chương trình và người dùng. Tất cả những gì cần thiết là sự tương tác có thể được đặc trưng theo chương trình. Mong đợi cũng có thể trả lại quyền kiểm soát cho người dùng mà không làm gián đoạn chương trình đang được kiểm soát. Tương tự, người dùng có thể trả lại quyền kiểm soát cho tập lệnh bất kỳ lúc nào.

Sử dụng

Mong đợi đọc cmdfile cho một danh sách các lệnh để thực hiện. Mong đợi có thể được gọi ngầm trên các hệ thống hỗ trợ #! ký hiệu bằng cách đánh dấu tập lệnh là có thể thực thi và tạo dòng đầu tiên trong tập lệnh:

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

Tất nhiên, con đường phải mô tả chính xác nơi Mong đợi cuộc sống. / usr / local / bin chỉ là một ví dụ.

Cờ -c mở đầu một lệnh được thực hiện trước bất kỳ lệnh nào trong tập lệnh. Lệnh này sẽ được trích dẫn để tránh bị bẻ khóa. Tùy chọn này có thể được sử dụng nhiều lần. Nhiều lệnh có thể được thực hiện với một đơn-c bằng cách tách chúng bằng dấu chấm phẩy. Các lệnh được thực thi theo thứ tự chúng xuất hiện. Khi sử dụng Expectk, tùy chọn này được chỉ định là -command.

Cờ -d cho phép một số đầu ra chẩn đoán, chủ yếu báo cáo hoạt động nội bộ của các lệnh như mong đợi và tương tác. Cờ này có tác dụng tương tự như "exp_internal 1" ở đầu tập lệnh Mong đợi, cộng với phiên bản Expect được in.

Cờ -D cho phép trình gỡ rối tương tác. Giá trị số nguyên phải tuân theo. Trình gỡ lỗi sẽ kiểm soát trước thủ tục Tcl tiếp theo nếu giá trị không khác hoặc nếu ^ C được nhấn hoặc điểm ngắt được nhấn hoặc lệnh trình gỡ lỗi thích hợp khác xuất hiện trong tập lệnh. Khi sử dụng Expectk, tùy chọn này được chỉ định là - Gỡ lỗi.

Cờ -f đặt trước một tệp để đọc lệnh. Cờ tự nó là tùy chọn vì nó chỉ hữu ích khi sử dụng #! ký hiệu, để các đối số khác có thể được cung cấp trên dòng lệnh. Khi sử dụng Expectk, tùy chọn này được chỉ định là -file.

Theo mặc định, tệp lệnh được đọc vào bộ nhớ và được thực hiện toàn bộ. Đôi khi bạn nên đọc từng dòng một tập tin. Để buộc các tệp tùy ý được xử lý theo cách này, hãy sử dụng cờ -b. Khi sử dụng Expectk, tùy chọn này được xác định là -buffer.

Nếu chuỗi "-" được cung cấp dưới dạng tên tệp, đầu vào chuẩn được đọc thay thế. Sử dụng "./-" để đọc từ một tệp thực sự có tên "-".

Cờ -i làm cho Expect nhắc lệnh tương tác thay vì đọc chúng từ một tập tin. Lời nhắc được chấm dứt thông qua lệnh thoát hoặc trên EOF. Cờ -i được giả định nếu không sử dụng một tập tin lệnh nào cũng như -c. Khi sử dụng Expectk, tùy chọn này được chỉ định là -interactive.

- có thể được sử dụng để phân định phần cuối của các tùy chọn. Điều này rất hữu ích nếu bạn muốn chuyển đối số giống như tùy chọn cho tập lệnh của mình mà không được nó diễn giải bằng Mong đợi. Điều này có thể được đặt trong #! để ngăn chặn bất kỳ cách diễn giải cờ nào như mong đợi. Ví dụ, sau đây sẽ để lại các đối số ban đầu bao gồm tên kịch bản trong biến argv .

#! / usr / local / bin / expect -

Lưu ý rằng thông thường getopt (3) và execve (2) quy ước phải được quan sát thấy khi thêm đối số cho #! hàng.

Tệp $ exp_library / expect.rc được lấy nguồn tự động nếu có, trừ khi cờ -N được sử dụng. (Khi sử dụng Expectk, tùy chọn này được chỉ định là -NORC.) Ngay sau đó, tập tin ~ / .expect.rc được lấy tự động, trừ khi cờ -n được sử dụng. Nếu biến môi trường DOTDIR được định nghĩa, nó được coi là một thư mục và .expect.rc được đọc từ đó. Khi sử dụng Expectk, tùy chọn này được xác định là -norc. Việc tìm nguồn cung ứng này chỉ xảy ra sau khi thực hiện bất kỳ cờ c nào.

-v nguyên nhân Yêu cầu in số phiên bản của nó và thoát. Cờ tương ứng trong Expectk, sử dụng tên cờ dài, là -version.

Tùy chọn args được xây dựng thành một danh sách và được lưu trữ trong biến có tên argv và. argc được khởi tạo với chiều dài của argv.

Argv0 được định nghĩa là tên của tập lệnh hoặc nhị phân nếu không sử dụng tập lệnh nào. Ví dụ, sau đây in ra tên của kịch bản và ba đối số đầu tiên:

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

Lệnh

Kỳ vọng sử dụng Công cụ Command Language. Tcl cung cấp luồng điều khiển (nếu, cho, ngắt), đánh giá biểu thức và một số tính năng khác như định nghĩa đệ quy và thủ tục. Các lệnh được sử dụng ở đây nhưng không được định nghĩa (set, if, exec) là các lệnh Tcl. Mong đợi hỗ trợ các lệnh bổ sung. Trừ khi được chỉ định khác, các lệnh trả về chuỗi rỗng.

Các lệnh được liệt kê theo thứ tự bảng chữ cái để chúng có thể được định vị nhanh chóng. Tuy nhiên, người dùng mới có thể tìm thấy dễ dàng hơn để bắt đầu bằng cách đọc các mô tả về đẻ trứng, gửi, mong đợi và tương tác, theo thứ tự đó.

đóng [-slave] [-onexec 0 | 1] [-i spawn_id]

đóng kết nối với tiến trình hiện tại. Hầu hết các chương trình tương tác sẽ phát hiện EOF trên stdin và exit của chúng; do đó gần như thường đủ để giết quá trình là tốt. Cờ -i tuyên bố quá trình đóng tương ứng với tên spawn_id.

Cả hai mong đợi và tương tác sẽ phát hiện khi quá trình hiện tại thoát và ngầm làm một đóng, nhưng nếu bạn giết quá trình bằng cách, nói, "exec giết $ pid", bạn cần phải gọi một cách rõ ràng .

Cờ -onexec xác định liệu id đẻ trứng có được đóng trong bất kỳ quy trình sinh sản mới nào hay nếu quá trình được phủ lên. Để mở một spawn id, sử dụng giá trị 0. Một giá trị số nguyên khác không buộc spawn đóng trong bất kỳ quá trình mới nào.

Cờ -slave đóng nô lệ gắn với id sinh sản. Khi kết nối được đóng, slave sẽ tự động đóng nếu nó vẫn mở.

Không có vấn đề cho dù kết nối được đóng kín hoặc rõ ràng, bạn nên gọi chờ để xóa khe xử lý hạt nhân tương ứng. Lệnh đóng không gọi chờ vì không có sự đảm bảo rằng việc đóng kết nối quá trình sẽ khiến nó thoát.

gỡ lỗi [[-now] 0 | 1]

điều khiển một trình gỡ lỗi Tcl cho phép bạn duyệt qua các câu lệnh và thiết lập các điểm ngắt.

Không có đối số, số 1 được trả về nếu trình gỡ lỗi không chạy, nếu không thì giá trị 0 sẽ được trả về.

Với một đối số 1, trình gỡ rối được bắt đầu. Với một đối số 0, trình gỡ rối được dừng lại. Nếu một đối số 1 được bắt đầu bằng cờ -now, trình gỡ rối được bắt đầu ngay lập tức. Nếu không, trình gỡ rối được bắt đầu với câu lệnh Tcl tiếp theo.

Lệnh gỡ lỗi không thay đổi bất kỳ bẫy nào. So sánh điều này để bắt đầu Mong đợi với cờ -D.

Lệnh ngắt kết nối ngắt kết nối một quá trình chia rẽ từ thiết bị đầu cuối . Nó tiếp tục chạy ở chế độ nền. Quá trình này được đưa ra nhóm quá trình riêng của nó. I / O tiêu chuẩn được chuyển hướng đến / dev / null .

Đoạn sau đây sử dụng ngắt kết nối để tiếp tục chạy tập lệnh trong nền.

nếu {[fork]! = 0} thoát kết nối. . .

Tập lệnh sau đọc mật khẩu và sau đó chạy một chương trình mỗi giờ yêu cầu mật khẩu mỗi khi nó được chạy. Tập lệnh cung cấp mật khẩu để bạn chỉ phải nhập mật khẩu một lần.

send_user "password? \" expect_user -re "(. *) \ n" cho {} 1 {} {if {[fork]! = 0} {ngủ 3600; tiếp tục} ngắt kết nối đẻ trứng priv_prog mong đợi Mật khẩu: gửi "$ expect_out ( 1, chuỗi) \ r ". . . lối thoát }

Một lợi thế để sử dụng ngắt kết nối trên vỏ tính năng quá trình không đồng bộ (&) là mong đợi có thể lưu các tham số thiết bị đầu cuối trước khi ngắt kết nối và sau đó áp dụng chúng vào pty mới. Với &, Mong đợi không có cơ hội để đọc các tham số của thiết bị đầu cuối kể từ khi thiết bị đầu cuối đã bị ngắt kết nối bởi thời gian Mong đợi nhận được kiểm soát.

thoát [-kết nối] [trạng thái]

nguyên nhân Mong đợi để thoát ra hoặc nếu không chuẩn bị để làm như vậy.

Cờ -onexit làm cho đối số tiếp theo được sử dụng như một trình xử lý thoát. Không có đối số, trình xử lý thoát hiện tại được trả về.

Cờ -noexit gây ra Mong đợi để chuẩn bị thoát ra nhưng dừng ngắn thực sự kiểm soát trở lại hệ điều hành. Trình xử lý thoát được xác định bởi người dùng được chạy cũng như trình xử lý nội bộ của riêng Mong đợi. Không có lệnh Mong đợi nào được thực hiện. Điều này rất hữu ích nếu bạn đang chạy Mong đợi với các phần mở rộng Tcl khác. Trình thông dịch hiện tại (và cửa sổ chính nếu trong môi trường Tk) vẫn còn để các phần mở rộng Tcl khác có thể dọn sạch. Nếu lệnh Expect được gọi lại (tuy nhiên điều này có thể xảy ra), các trình xử lý sẽ không chạy lại.

Khi thoát ra, tất cả các kết nối đến các quá trình sinh sản đều được đóng lại. Đóng cửa sẽ được phát hiện như là một EOF bởi quá trình sinh sản. thoát không có hành động nào khác ngoài thủ tục _exit (2) bình thường. Do đó, các quá trình sinh sản không kiểm tra EOF có thể tiếp tục chạy. (Một loạt các điều kiện quan trọng để xác định, ví dụ, những gì báo hiệu một quá trình sinh sản sẽ được gửi đi, nhưng chúng phụ thuộc vào hệ thống, thường được ghi lại theo lối ra (3).) Các tiến trình sinh ra tiếp tục chạy sẽ được kế thừa bởi init.

trạng thái (hoặc 0 nếu không được chỉ định) được trả về như trạng thái thoát của Expect . thoát được thực thi ngầm nếu kết thúc tập lệnh được truy cập.

exp_continue [-continue_timer]
Lệnh exp_continue cho phép mong đợi chính nó tiếp tục thực thi hơn là trả về như bình thường. Theo mặc định exp_continue đặt lại hẹn giờ hết giờ. Cờ -continue_timer ngăn thời gian khởi động lại. (Xem kỳ vọng để biết thêm thông tin.)

giá trị exp_internal [-f]
gây ra các lệnh khác để gửi thông tin chẩn đoán bên trong tới Expect to stderr nếu giá trị khác không. Đầu ra này bị tắt nếu giá trị là 0. Thông tin chẩn đoán bao gồm mọi ký tự nhận được và mọi nỗ lực được thực hiện để khớp với đầu ra hiện tại dựa vào các mẫu.

Nếu tệp tùy chọn được cung cấp, tất cả đầu ra bình thường và gỡ lỗi được ghi vào tệp đó (bất kể giá trị của giá trị ). Bất kỳ tệp đầu ra chẩn đoán nào trước đó đều bị đóng.

Cờ -info khiến exp_internal trả về một mô tả về các đối số phi thông tin mới nhất được đưa ra.

exp_open [args] [-i spawn_id]
trả về một định danh tệp Tcl tương ứng với id sinh sản gốc. Định danh tệp có thể được sử dụng như thể nó được mở bằng lệnh mở của Tcl. (Id đẻ trứng sẽ không còn được sử dụng nữa. Không nên chờ đợi .

Cờ -leaveopen rời khỏi spawn id mở để truy cập thông qua các lệnh Expect. Chờ đợi phải được thực thi trên id sinh sản.

exp_pid [-i spawn_id]
trả về id tiến trình tương ứng với quy trình hiện đang sinh ra. Nếu cờ -i được sử dụng, pid sẽ trả về tương ứng với giá trị của id sinh sản đã cho.

exp_send
là bí danh để gửi .

exp_send_error
là bí danh cho send_error .

exp_send_log
là bí danh cho send_log .

exp_send_tty
là bí danh cho send_tty .

exp_send_user
là bí danh cho send_user .

exp_version [phiên bản [phiên bản]
rất hữu ích để đảm bảo rằng tập lệnh tương thích với phiên bản hiện tại của Mong đợi.

Không có đối số, phiên bản hiện tại của Expect sẽ được trả về. Phiên bản này sau đó có thể được mã hóa trong tập lệnh của bạn. Nếu bạn thực sự biết rằng bạn không sử dụng các tính năng của các phiên bản gần đây, bạn có thể chỉ định phiên bản cũ hơn.

Các phiên bản bao gồm ba số được phân tách bằng dấu chấm. Đầu tiên là số chính. Các kịch bản được viết cho các phiên bản Mong đợi với một số chính khác sẽ gần như chắc chắn không hoạt động. exp_version trả về lỗi nếu các số chính không khớp.

Thứ hai là số nhỏ. Các kịch bản được viết cho một phiên bản có số lượng nhỏ hơn số phiên bản hiện tại có thể phụ thuộc vào một số tính năng mới và có thể không chạy. exp_version trả về lỗi nếu các số chính khớp nhau, nhưng số nhỏ của tập lệnh lớn hơn số của kỳ vọng đang chạy.

Thứ ba là số không đóng vai trò nào trong so sánh phiên bản. Tuy nhiên, nó được tăng lên khi phân phối phần mềm Mong đợi được thay đổi theo bất kỳ cách nào, chẳng hạn như bằng tài liệu bổ sung hoặc tối ưu hóa. Nó được đặt lại thành 0 khi mỗi phiên bản nhỏ mới.

Với cờ -exit , Mong đợi in một lỗi và thoát nếu phiên bản đã lỗi thời.

mong đợi [[-opts] pat1 body1] ... [-opts] patn [bodyn]
đợi cho đến khi một trong các mẫu phù hợp với đầu ra của một quá trình sinh sản, một khoảng thời gian xác định đã trôi qua, hoặc một tập tin cuối cùng được nhìn thấy. Nếu cơ thể cuối cùng trống, nó có thể bị bỏ qua.

Các mẫu từ lệnh expect_before gần đây nhất được sử dụng ngầm trước bất kỳ mẫu nào khác. Các mẫu từ lệnh expect_after gần đây nhất được sử dụng ngầm sau bất kỳ mẫu nào khác.

Nếu các đối số cho toàn bộ câu lệnh mong đợi yêu cầu nhiều hơn một dòng, tất cả các đối số có thể được "giằng co" thành một dòng để tránh chấm dứt mỗi dòng với dấu gạch chéo ngược. Trong trường hợp này, các thay thế Tcl thông thường sẽ xảy ra bất chấp niềng răng.

Nếu một mẫu là từ khóa eof , thì phần thân tương ứng sẽ được thực hiện khi kết thúc tập tin. Nếu một mẫu là thời gian chờ của từ khóa, thì phần thân tương ứng sẽ được thực hiện khi hết thời gian chờ. Nếu không có từ khóa hết thời gian nào được sử dụng, một hành động rỗng ngầm định được thực hiện khi hết thời gian chờ. Khoảng thời gian chờ mặc định là 10 giây nhưng có thể được đặt, ví dụ: 30, bằng lệnh "đặt thời gian chờ 30". Thời gian chờ vô hạn có thể được chỉ định bằng giá trị -1. Nếu một mẫu là từ khóa mặc định , thì phần thân tương ứng sẽ được thực hiện khi hết thời gian chờ hoặc cuối tập tin.

Nếu một mẫu khớp nhau, thì phần thân tương ứng được thực hiện. mong đợi trả về kết quả của cơ thể (hoặc chuỗi rỗng nếu không có mẫu nào phù hợp). Trong trường hợp nhiều mẫu khớp nhau, mẫu xuất hiện đầu tiên được sử dụng để chọn nội dung.

Mỗi lần đầu ra mới đến, nó được so sánh với mỗi mẫu theo thứ tự chúng được liệt kê. Vì vậy, bạn có thể kiểm tra sự vắng mặt của một trận đấu bằng cách làm cho mô hình cuối cùng một cái gì đó đảm bảo xuất hiện, chẳng hạn như một dấu nhắc. Trong các tình huống không có lời nhắc, bạn phải sử dụng thời gian chờ (giống như bạn sẽ làm nếu tương tác theo cách thủ công).

Các mẫu được chỉ định theo ba cách. Theo mặc định, các mẫu được chỉ định như với lệnh đối sánh chuỗi của Tcl. (Các mẫu như vậy cũng tương tự như các biểu thức thông thường C-shell thường được gọi là các mẫu "glob"). Cờ -gl có thể được sử dụng để bảo vệ các mẫu có thể khác với các cờ mong đợi . Bất kỳ mẫu nào bắt đầu bằng dấu "-" phải được bảo vệ theo cách này. (Tất cả các chuỗi bắt đầu bằng "-" được dành riêng cho các tùy chọn trong tương lai.)

Ví dụ: đoạn sau đây tìm kiếm thông tin đăng nhập thành công. (Lưu ý rằng hủy bỏ được coi là một thủ tục được xác định ở nơi khác trong kịch bản.)

mong đợi {busy {puts busy \ n; exp_continue} không hủy bỏ "mật khẩu không hợp lệ" hủy bỏ thời gian chờ hủy bỏ kết nối}

Báo giá là cần thiết trên mẫu thứ tư vì nó chứa một khoảng trắng, nếu không sẽ tách riêng mẫu đó khỏi hành động. Các mẫu có cùng hành động (chẳng hạn như thứ 3 và thứ 4) yêu cầu liệt kê lại các hành động. Điều này có thể tránh được bằng cách sử dụng các mẫu kiểu regexp (xem bên dưới). Bạn có thể tìm thêm thông tin về cách tạo các mẫu kiểu glob trong hướng dẫn sử dụng Tcl.

Các mẫu kiểu Regexp theo cú pháp được xác định bằng lệnh regexp của Tcl (viết tắt của lệnh "regular expression"). các mẫu regexp được giới thiệu với cờ -re . Ví dụ trước có thể được viết lại bằng cách sử dụng regexp như sau:

mong đợi {busy {puts busy \ n; exp_continue} -re "không thành công | mật khẩu không hợp lệ" hủy bỏ thời gian chờ hủy bỏ kết nối}

Cả hai loại mẫu đều "chưa được phân loại". Điều này có nghĩa là các mẫu không phải khớp với toàn bộ chuỗi, nhưng có thể bắt đầu và kết thúc khớp ở bất kỳ đâu trong chuỗi (miễn là mọi thứ khác khớp). Sử dụng ^ để khớp đầu chuỗi và $ để khớp với kết thúc. Lưu ý rằng nếu bạn không đợi đến cuối chuỗi, câu trả lời của bạn có thể dễ dàng kết thúc ở giữa chuỗi khi chúng được lặp lại từ quá trình sinh ra. Trong khi vẫn tạo ra kết quả chính xác, đầu ra có thể trông không tự nhiên. Do đó, việc sử dụng $ được khuyến khích nếu bạn có thể mô tả chính xác các ký tự ở cuối chuỗi.

Lưu ý rằng trong nhiều trình chỉnh sửa, dấu ^ và $ khớp với đầu và cuối dòng tương ứng. Tuy nhiên, vì mong đợi không phải là định hướng dòng, các ký tự này khớp với phần đầu và cuối của dữ liệu (trái ngược với các dòng) hiện tại trong bộ đệm phù hợp mong đợi. (Ngoài ra, hãy xem ghi chú bên dưới về "hệ thống khó tiêu").

Cờ -ex làm cho mẫu được khớp với nhau như một chuỗi "chính xác". Không có giải thích của *, ^, vv được thực hiện (mặc dù các quy ước Tcl thông thường vẫn phải được quan sát). Các mẫu chính xác luôn được bỏ lưu trữ.

Cờ -nocase tạo ra các ký tự chữ hoa của đầu ra để so sánh như thể chúng là các ký tự chữ thường. Mẫu không bị ảnh hưởng.

Trong khi đọc đầu ra, hơn 2000 byte có thể buộc các byte trước đó bị "quên". Điều này có thể được thay đổi với hàm match_max . (Lưu ý rằng các giá trị quá lớn có thể làm chậm trình khớp mẫu.) Nếu danh sách patlistfull_buffer , phần thân tương ứng sẽ được thực thi nếu match_max bytes đã được nhận và không có mẫu nào khác khớp với nhau. Có hay không từ khóa full_buffer được sử dụng, các ký tự bị quên được ghi vào expect_out (buffer).

Nếu danh sách patlist là từ khóa null , và null được cho phép (thông qua lệnh remove_nulls ), thì phần thân tương ứng được thực thi nếu một ASCII 0 duy nhất được khớp. Không thể kết hợp 0 ​​byte thông qua các mẫu glob hoặc regexp.

Khi phù hợp với một mẫu (hoặc eof hoặc full_buffer), bất kỳ kết quả phù hợp và trước đây chưa từng có nào được lưu trong biến expect_out (buffer) . Tối đa 9 kết quả chuỗi con regexp được lưu trong các biến expect_out (1, chuỗi) qua expect_out (9, chuỗi) . Nếu cờ -indices được sử dụng trước một mẫu, chỉ mục bắt đầu và kết thúc (trong một biểu mẫu thích hợp cho lrange ) của 10 chuỗi được lưu trữ trong các biến expect_out (X, start)expect_out (X, end) trong đó X là một chữ số, tương ứng với vị trí chuỗi con trong bộ đệm. 0 đề cập đến các chuỗi phù hợp với toàn bộ mẫu và được tạo cho các mẫu glob cũng như các mẫu regexp. Ví dụ, nếu một quá trình đã tạo ra kết quả của "abcdefgh \ n", kết quả của:

mong đợi "cd"

như thể các câu lệnh sau đã được thực thi:

đặt expect_out (0, chuỗi) cd set expect_out (buffer) abcd

và "efgh \ n" còn lại trong bộ đệm đầu ra. Nếu quá trình tạo ra kết quả "abbbcabkkkka \ n", kết quả của:

mong đợi -indices -re "b (b *). * (k +)"

như thể các câu lệnh sau đã được thực thi:

đặt expect_out (0, bắt đầu) 1 bộ expect_out (0, kết thúc) 10 bộ expect_out (0, chuỗi) bbbcabkkkk đặt expect_out (1, bắt đầu) 2 bộ expect_out (1, kết thúc) 3 bộ expect_out (1, chuỗi) bb set expect_out (2, bắt đầu) 10 bộ expect_out (2, kết thúc) 10 bộ expect_out (2, string) k đặt expect_out (buffer) abbbcabkkkk

và "a \ n" nằm trong bộ đệm đầu ra. Mẫu "*" (và -re ". *") Sẽ xóa bộ đệm đầu ra mà không đọc thêm bất kỳ đầu ra nào từ quá trình.

Thông thường, kết quả khớp được loại bỏ khỏi bộ đệm trong của Expect. Điều này có thể được ngăn chặn bằng cách đặt trước một mẫu với cờ không chuyển đổi. Cờ này đặc biệt hữu ích trong việc thử nghiệm (và có thể viết tắt là "-not" để thuận tiện trong khi thử nghiệm).

Id đẻ trứng kết hợp với kết quả khớp (hoặc eOF hoặc full_buffer) được lưu trữ trong expect_out (spawn_id) .

Cờ- timeout làm cho lệnh mong đợi hiện tại sử dụng giá trị sau làm thời gian chờ thay vì sử dụng giá trị của biến thời gian chờ.

Theo mặc định, các mẫu được khớp với đầu ra từ tiến trình hiện tại, tuy nhiên cờ -i tuyên bố đầu ra từ danh sách spawn_id được đặt tên được so khớp với bất kỳ mẫu nào sau đây (lên tới -i ) tiếp theo. Danh sách spawn_id hoặc là một danh sách các spawn_ids được phân cách bằng khoảng trắng hoặc một biến tham chiếu tới danh sách các spawn_ids như vậy.

Ví dụ, ví dụ sau đợi "kết nối" từ quá trình hiện tại hoặc "bận", "không thành công" hoặc "mật khẩu không hợp lệ" từ spawn_id có tên là $ proc2.

mong đợi {-i $ proc2 busy {puts busy \ n; exp_continue} -re "không thành công | mật khẩu không hợp lệ" hủy bỏ thời gian chờ hủy bỏ kết nối}

Giá trị của biến global any_spawn_id có thể được sử dụng để phù hợp với các mẫu cho bất kỳ spawn_ids nào được đặt tên với tất cả các cờ -i khác trong lệnh mong đợi hiện tại. Các spawn_id từ một lá cờ -i không có mô hình liên kết (tức là, theo sau ngay lập tức bởi một -i khác) được tạo sẵn cho bất kỳ mẫu nào khác trong cùng một lệnh mong đợi được kết hợp với any_spawn_id.

Cờ -i cũng có thể đặt tên biến toàn cục trong trường hợp biến được đọc cho danh sách các id sinh sản. Biến được đọc lại bất cứ khi nào nó thay đổi. Điều này cung cấp một cách để thay đổi nguồn I / O trong khi lệnh đang được thực thi. Id đẻ trứng được cung cấp theo cách này được gọi là các id sinh sản "gián tiếp".

Các hành động như phá vỡtiếp tục các cấu trúc kiểm soát nguyên nhân (ví dụ, đối với , proc ) hoạt động theo cách thông thường. Lệnh exp_continue cho phép mong đợi chính nó tiếp tục thực thi hơn là trả về như bình thường.

Điều này rất hữu ích để tránh các vòng lặp rõ ràng hoặc các câu lệnh kỳ vọng lặp đi lặp lại. Ví dụ sau là một phần của một phân đoạn để tự động hóa rlogin. Exp_continue tránh phải viết câu lệnh mong đợi thứ hai (để tìm lời nhắc lại) nếu rlogin nhắc nhập mật khẩu.

mong đợi mật khẩu {Mật khẩu: {stty -echo send_user "(đối với $ user) trên máy chủ $:" expect_user -re "(. *) \ n" send_user "\ n" gửi "$ expect_out (1, string) \ r" stty echo exp_continue} không chính xác {send_user "mật khẩu không hợp lệ hoặc tài khoản \ n" exit} timeout {send_user "kết nối đến $ host hết thời gian \ n" exit} eof {send_user \ "kết nối đến máy chủ không thành công: $ expect_out (buffer)" exit} - re $ prompt}

Ví dụ, đoạn sau đây có thể giúp người dùng hướng dẫn một tương tác đã hoàn toàn tự động. Trong trường hợp này, thiết bị đầu cuối được đưa vào chế độ thô. Nếu người dùng nhấn "+", một biến được tăng lên. Nếu "p" được nhấn, một số trả về sẽ được gửi đến quá trình này, có lẽ để poke nó theo một cách nào đó, và "i" cho phép người dùng tương tác với quá trình, có hiệu quả ăn cắp kiểm soát từ kịch bản. Trong mỗi trường hợp, hàm exp_continue cho phép hiện tại mong đợi tiếp tục khớp mẫu sau khi thực hiện hành động hiện tại.

stty raw -echo expect_after {-i $ user_spawn_id "p" {gửi "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {tương tác; exp_continue} "thoát" thoát}

Theo mặc định, exp_continue đặt lại hẹn giờ hết giờ. Bộ hẹn giờ không được khởi động lại, nếu exp_continue được gọi với cờ -continue_timer .

expect_after [expect_args]
hoạt động giống với expect_before ngoại trừ việc nếu các mẫu từ cả hai mong đợiexpect_after có thể khớp, mẫu mong đợi được sử dụng. Xem lệnh expect_before để biết thêm thông tin.

expect_background [expect_args]
có cùng các đối số như mong đợi , tuy nhiên nó sẽ trả về ngay lập tức. Các mẫu được kiểm tra bất cứ khi nào đầu vào mới đến. Thời gian chờ mẫu và mặc định là vô nghĩa đối với expect_background và bị loại bỏ âm thầm. Nếu không, lệnh expect_background sử dụng các mẫu expect_beforeexpect_after giống như mong đợi .

Khi các hành động expect_background đang được đánh giá, việc xử lý nền cho cùng một id sinh sản bị chặn. Xử lý nền được bỏ chặn khi tác vụ hoàn tất. Trong khi xử lý nền bị chặn, có thể làm một (tiền cảnh) mong đợi trên cùng một id sinh sản.

Không thể thực hiện một mong đợi trong khi một vùng đợi expect_background được bỏ chặn. expect_background cho một id đẻ trứng cụ thể bị xóa bằng cách khai báo một hàm expect_background mới với cùng một id sinh sản. Khai báo expect_background không có mẫu nào sẽ loại bỏ id sinh sản đã cho ra khỏi khả năng phù hợp với các mẫu trong nền.

expect_before [expect_args]
có cùng các đối số như mong đợi , tuy nhiên nó sẽ trả về ngay lập tức. Các cặp mẫu-action từ kỳ vọng gần đây nhất_before với cùng một id sinh sản được thêm ngầm vào bất kỳ lệnh mong đợi nào sau đây. Nếu một mẫu khớp với nhau, nó được xử lý như thể nó đã được chỉ định trong chính lệnh mong đợi , và phần tử liên quan được thực hiện trong ngữ cảnh của lệnh mong đợi . Nếu các mẫu từ cả expect_beforemong đợi có thể phù hợp, mẫu expect_before được sử dụng.

Nếu không có mẫu nào được chỉ định, thì id đẻ trứng sẽ không được chọn cho bất kỳ mẫu nào.

Trừ khi được ghi đè bởi cờ -i , các mẫu expect_before khớp với id sinh sản được xác định tại thời điểm lệnh expect_before được thực hiện (không phải khi mẫu của nó được khớp).

Cờ -info khiến expect_before trả về các thông số kỹ thuật hiện tại của những mẫu mà nó sẽ khớp. Theo mặc định, nó báo cáo trên id sinh sản hiện tại. Một đặc tả spawn id tùy chọn có thể được cung cấp cho thông tin về id sinh sản đó. Ví dụ

expect_before -info -i $ proc

Có thể đưa ra tối đa một đặc điểm kỹ thuật id sinh sản. Cờ-trực tiếp ngăn chặn các id sinh sản trực tiếp chỉ đến từ các đặc tả gián tiếp.

Thay vì một đặc tả sinh sản id, cờ "-all" sẽ gây ra "-info" để báo cáo về tất cả các id sinh sản.

Đầu ra của cờ -info có thể được sử dụng lại làm đối số cho expect_before.

expect_tty [expect_args]
giống như mong đợi nhưng nó đọc các ký tự từ / dev / tty (tức là tổ hợp phím từ người dùng). Theo mặc định, đọc được thực hiện ở chế độ nấu chín. Vì vậy, các dòng phải kết thúc với một sự trở lại để mong đợi để xem chúng. Điều này có thể được thay đổi thông qua stty (xem lệnh stty dưới đây).

expect_user [expect_args]
giống như mong đợi nhưng nó đọc ký tự từ stdin (tức là tổ hợp phím từ người dùng). Theo mặc định, đọc được thực hiện ở chế độ nấu chín. Vì vậy, các dòng phải kết thúc với một sự trở lại để mong đợi để xem chúng. Điều này có thể được thay đổi thông qua stty (xem lệnh stty dưới đây).

cái nĩa
tạo ra một quy trình mới. Quy trình mới là bản sao chính xác của quy trình Mong đợi hiện tại. Khi thành công, ngã ba trả về 0 cho quy trình mới (con) và trả về ID tiến trình của tiến trình con cho tiến trình cha. Khi lỗi (luôn thay đổi do thiếu tài nguyên, ví dụ, không gian hoán đổi, bộ nhớ), ngã ba trả về -1 cho tiến trình cha, và không có tiến trình con nào được tạo ra.

Các quy trình được rút ra thoát qua lệnh thoát , giống như quy trình gốc. Các quy trình được chia nhỏ được phép ghi vào các tệp nhật ký. Nếu bạn không tắt gỡ lỗi hoặc đăng nhập vào hầu hết các quy trình, kết quả có thể gây nhầm lẫn.

Một số triển khai pty có thể bị nhầm lẫn bởi nhiều độc giả và nhà văn, ngay cả trong giây lát. Vì vậy, nó là an toàn nhất để ngã ba trước khi sinh sản quy trình.

tương tác [string1 body1] ... [stringn [bodyn]]
kiểm soát quá trình hiện tại cho người dùng, để các lần nhấn phím được gửi đến tiến trình hiện tại, và stdout và stderr của tiến trình hiện tại được trả về.

Các cặp chuỗi nội dung có thể được chỉ định làm đối số, trong trường hợp đó, phần thân được thực hiện khi chuỗi tương ứng được nhập vào. (Theo mặc định, chuỗi không được gửi đến tiến trình hiện tại.) Lệnh của trình thông dịch được giả định, nếu phần thân cuối cùng bị thiếu.

Nếu các đối số cho toàn bộ câu lệnh tương tác yêu cầu nhiều hơn một dòng, tất cả các đối số có thể được "giằng co" thành một dòng để tránh chấm dứt mỗi dòng bằng dấu gạch chéo ngược. Trong trường hợp này, các thay thế Tcl thông thường sẽ xảy ra bất chấp niềng răng.

Ví dụ, lệnh sau chạy tương tác với các cặp chuỗi sau đây được xác định: Khi ^ Z được nhấn, Mong đợi bị tạm ngưng. (Cờ -reset khôi phục các chế độ đầu cuối.) Khi ^ A được nhấn, người dùng sẽ nhìn thấy "bạn đã gõ một điều khiển-A" và quá trình được gửi ^ A. Khi $ được nhấn, người dùng sẽ thấy ngày tháng. Khi ^ C được nhấn, Mong đợi thoát. Nếu nhập "foo", người dùng sẽ thấy "thanh". Khi bấm ~~, trình thông dịch Mong đợi sẽ chạy tương tác.

đặt CTRLZ \ 032 tương tác {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "bạn đã gõ một control-A \ n"; gửi "\ 001"} $ {send_user "Ngày tháng là [định dạng đồng hồ [giây đồng hồ]]."} \ 003 thoát foo {send_user "bar"} ~~}

Trong các cặp chuỗi ký tự, các chuỗi được so khớp theo thứ tự chúng được liệt kê dưới dạng đối số. Các chuỗi khớp một phần không được gửi đến quy trình hiện tại để dự đoán phần còn lại sắp tới. Nếu các ký tự sau đó được nhập sao cho không còn có thể là một kết quả phù hợp nữa, chỉ một phần của chuỗi sẽ được gửi đến quá trình không thể bắt đầu một kết quả khớp khác. Vì vậy, các chuỗi là các phần tử của các kết quả khớp một phần có thể khớp với nhau sau đó, nếu các chuỗi gốc đã cố gắng khớp hoàn toàn không thành công.

Theo mặc định, kết hợp chuỗi là chính xác mà không có thẻ hoang dã . (Ngược lại, lệnh mong đợi sử dụng các mẫu kiểu glob theo mặc định.) Cờ -ex có thể được sử dụng để bảo vệ các mẫu có thể khác với các cờ tương tác . Bất kỳ mẫu nào bắt đầu bằng dấu "-" phải được bảo vệ theo cách này. (Tất cả các chuỗi bắt đầu bằng "-" được dành riêng cho các tùy chọn trong tương lai.)

Cờ -re buộc chuỗi được hiểu là mẫu kiểu regexp. Trong trường hợp này, các phần tử trùng khớp được lưu trữ trong tương tác biến tương tự như cách mong đợi lưu trữ kết quả đầu ra của nó trong biến expect_out . Cờ -indices được hỗ trợ tương tự.

Mẫu eof giới thiệu một hành động được thực hiện khi kết thúc tệp. Một mẫu eof riêng biệt cũng có thể theo cờ -output trong trường hợp nó được khớp nếu một eof được phát hiện trong khi viết đầu ra. Hành động eof mặc định là "trả về", do đó tương tác đơn giản trả về khi có bất kỳ EOF nào.

Thời gian chờ mẫu giới thiệu thời gian chờ (tính bằng giây) và hành động được thực thi sau khi không có ký tự nào được đọc trong một thời gian nhất định. Mẫu thời gian chờ áp dụng cho quy trình được chỉ định gần đây nhất. Không có thời gian chờ mặc định. Biến đặc biệt "timeout" (được sử dụng bởi lệnh mong đợi ) không ảnh hưởng đến thời gian chờ này.

Ví dụ: tuyên bố sau có thể được sử dụng để tự động hóa những người dùng chưa nhập bất kỳ thứ gì trong một giờ nhưng vẫn nhận được thông báo hệ thống thường xuyên:

tương tác-đầu ra $ user_spawn_id timeout 3600 return -output \ $ spawn_id

Nếu mẫu là từ khóa null , và null được cho phép (thông qua lệnh remove_nulls ), thì phần thân tương ứng được thực thi nếu một ASCII 0 duy nhất được khớp. Không thể kết hợp 0 ​​byte thông qua các mẫu glob hoặc regexp.

Việc đặt trước một mẫu với cờ -iwrite làm cho biến interact_out (spawn_id) được đặt thành spawn_id khớp với mẫu (hoặc eof).

Các hành động như phá vỡtiếp tục các cấu trúc kiểm soát nguyên nhân (ví dụ, đối với , proc ) hoạt động theo cách thông thường. Tuy nhiên trở lại nguyên nhân tương tác để trở về người gọi của nó, trong khi inter_return gây ra tương tác để gây ra một sự trở lại trong người gọi của nó. Ví dụ, nếu "proc foo" được gọi là tương tác mà sau đó thực hiện hành động inter_return , proc foo sẽ trở lại. (Điều này có nghĩa là nếu các cuộc gọi tương tác thông dịch viên gõ tương tác gõ trở lại sẽ gây ra tương tác để tiếp tục, trong khi inter_return sẽ gây ra tương tác để trở về người gọi của nó.)

Trong quá trình tương tác , chế độ thô được sử dụng để tất cả các ký tự có thể được chuyển đến quy trình hiện tại. Nếu quá trình hiện tại không bắt được tín hiệu điều khiển công việc, nó sẽ dừng lại nếu gửi tín hiệu dừng (theo mặc định ^ Z). Để khởi động lại nó, hãy gửi tín hiệu tiếp tục (chẳng hạn như "kill -CONT"). Nếu bạn thực sự muốn gửi một SIGSTOP đến một quá trình như vậy (bằng ^ Z), hãy xem xét sinh sản csh đầu tiên và sau đó chạy chương trình của bạn. Mặt khác, nếu bạn muốn gửi một SIGSTOP để mong đợi chính nó, đầu tiên gọi thông dịch viên (có lẽ bằng cách sử dụng một ký tự thoát), và sau đó nhấn ^ Z.

Các cặp chuỗi nội dung có thể được sử dụng như một cách viết tắt để tránh phải nhập trình thông dịch và thực thi các lệnh một cách tương tác. Chế độ thiết bị đầu cuối trước đó được sử dụng trong khi phần thân của cặp chuỗi nội dung đang được thực thi.

Đối với tốc độ, các hành động thực thi ở chế độ thô theo mặc định. Cờ -reset đặt lại thiết bị đầu cuối sang chế độ mà nó có trước khi tương tác được thực thi (luôn luôn, chế độ nấu chín). Lưu ý rằng các ký tự được nhập khi chế độ đang được chuyển có thể bị mất (một tính năng không may của trình điều khiển thiết bị đầu cuối trên một số hệ thống). Lý do duy nhất để sử dụng -reset là nếu hành động của bạn phụ thuộc vào việc chạy trong chế độ nấu chín.

Cờ -echo gửi các ký tự khớp với mẫu sau đây trở lại quá trình đã tạo chúng khi mỗi ký tự được đọc. Điều này có thể hữu ích khi người dùng cần xem phản hồi từ các mẫu được nhập một phần.

Nếu một mẫu được lặp lại nhưng cuối cùng không khớp, các ký tự sẽ được gửi đến quá trình sinh sản. Nếu quá trình sinh ra sau đó lặp lại chúng, người dùng sẽ thấy các ký tự hai lần. -echo có lẽ chỉ thích hợp trong các tình huống mà người dùng không có khả năng không hoàn thành mẫu. Ví dụ, đoạn trích sau đây là từ rftp, tập lệnh đệ quy-ftp, trong đó người dùng được nhắc nhập ~ g, ~ p, hoặc ~ l, để nhận, đặt hoặc liệt kê thư mục hiện tại đệ quy. Đây là rất xa các lệnh ftp bình thường, mà người dùng không thể gõ ~ theo sau bởi bất cứ điều gì khác, ngoại trừ nhầm lẫn, trong trường hợp đó, họ có lẽ sẽ chỉ bỏ qua kết quả anyway.

tương tác {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Cờ -nobuffer gửi các ký tự phù hợp với mẫu sau vào quy trình đầu ra khi các ký tự được đọc.

Điều này rất hữu ích khi bạn muốn để một chương trình lặp lại mẫu. Ví dụ, sau đây có thể được sử dụng để theo dõi nơi một người đang quay số (một modem kiểu Hayes). Mỗi lần "atd" được xem, tập lệnh ghi lại phần còn lại của dòng.

proc lognumber {} {tương tác -nobuffer -re "(. *) \ r" trả về đặt $ log "[định dạng đồng hồ [giây đồng hồ]]: được gọi là $ interact_out (1, chuỗi)"} tương tác -nobuffer "atd" lognumber

Trong khi tương tác , việc sử dụng log_user trước đó bị bỏ qua. Đặc biệt, tương tác sẽ buộc đầu ra của nó được ghi lại (được gửi đến đầu ra tiêu chuẩn) vì nó được cho là người dùng không muốn tương tác một cách mù quáng.

Cờ -o làm cho bất kỳ cặp khóa-thân nào sau đây được áp dụng cho đầu ra của tiến trình hiện tại. Điều này có thể hữu ích, ví dụ, khi giao dịch với máy chủ gửi các ký tự không mong muốn trong một phiên telnet.

Theo mặc định, tương tác mong đợi người dùng viết stdin và đọc stdout của chính quá trình Expect . Cờ -u (cho "người dùng") làm cho giao diện tương tác cho người dùng là quá trình được đặt tên bởi đối số của nó (mà phải là một id được sinh ra).

Điều này cho phép hai quy trình không liên quan được nối với nhau mà không sử dụng vòng lặp rõ ràng. Để hỗ trợ gỡ lỗi, Mong đợi chẩn đoán luôn đi đến stderr (hoặc stdout cho một số thông tin đăng nhập và gỡ lỗi). Vì lý do tương tự, lệnh thông dịch viên sẽ đọc tương tác từ stdin.

Ví dụ, đoạn sau đây tạo ra một quá trình đăng nhập. Sau đó, nó quay người dùng (không được hiển thị), và cuối cùng kết nối cả hai với nhau. Tất nhiên, bất kỳ quá trình có thể được thay thế cho đăng nhập. Một trình bao, ví dụ, sẽ cho phép người dùng làm việc mà không cần cung cấp một tài khoản và mật khẩu.

đẻ trứng đăng nhập thiết lập đăng nhập $ spawn_id spawn mẹo modem # quay trở lại người dùng # kết nối người dùng để đăng nhập tương tác -u $ login

Để gửi đầu ra cho nhiều quy trình, liệt kê từng danh sách id sinh sản được bắt đầu bằng cờ -output . Đầu vào cho một nhóm các id sinh sản xuất có thể được xác định bởi một danh sách id sinh sản được bắt đầu bằng cờ -input . (Cả hai đầu vàođầu ra có thể lấy danh sách trong cùng một hình thức như cờ -i trong lệnh mong đợi , ngoại trừ any_spawn_id không có ý nghĩa trong tương tác .) Tất cả các cờ và chuỗi (hoặc mẫu) sau đây áp dụng cho đầu vào này cho đến khi khác - cờ đầu vào xuất hiện. Nếu không có đầu vào xuất hiện, đầu ra ngụ ý "-giá trị $ user_spawn_id -output". (Tương tự, với các mẫu không có đầu vào .) Nếu một đầu vào được chỉ định, nó ghi đè $ user_spawn_id. Nếu đầu vào thứ hai được chỉ định, nó ghi đè $ spawn_id. Cờ bổ sung- đầu vào có thể được chỉ định.

Hai quy trình đầu vào ngụ ý mặc định có các đầu ra của chúng được chỉ định là $ spawn_id và $ user_spawn_id (ngược lại). Nếu cờ -input xuất hiện không có cờ đầu ra, các ký tự từ quá trình đó sẽ bị hủy.

Cờ -i giới thiệu một thay thế cho spawn_id hiện tại khi không có cờ đầu vào hoặc đầu ra nào khác được sử dụng. Một lá cờ -i ngụ ý một lá cờ -o.

Có thể thay đổi các quá trình đang được tương tác bằng cách sử dụng các id sinh sản gián tiếp. (Id sinh sản gián tiếp được mô tả trong phần trên lệnh mong đợi.) Các id sinh sản gián tiếp có thể được xác định bằng cờ -i, -u, -input hoặc -output.

người phiên dịch [args]
khiến người dùng được nhắc tương tác cho các lệnh Mong đợi và Tcl. Kết quả của mỗi lệnh được in.

Các hành động như phá vỡtiếp tục các cấu trúc kiểm soát nguyên nhân (ví dụ, đối với , proc ) hoạt động theo cách thông thường. Tuy nhiên trở lại làm cho thông dịch viên trở lại người gọi của nó, trong khi inter_return làm cho thông dịch viên gây ra sự trở lại trong người gọi của nó. Ví dụ, nếu "proc foo" được gọi là thông dịch viên mà sau đó thực hiện hành động inter_return , proc foo sẽ trở lại. Bất kỳ lệnh nào khác cũng làm cho trình thông dịch tiếp tục yêu cầu các lệnh mới.

Theo mặc định, dấu nhắc chứa hai số nguyên. Số nguyên đầu tiên mô tả độ sâu của ngăn xếp đánh giá (ví dụ, số lần Tcl_Eval được gọi). Số nguyên thứ hai là số nhận dạng lịch sử Tcl. Dấu nhắc có thể được thiết lập bằng cách xác định một thủ tục gọi là "prompt1" có giá trị trả về trở thành dấu nhắc tiếp theo. Nếu một câu lệnh có dấu ngoặc kép mở, dấu ngoặc đơn, dấu ngoặc ôm hoặc dấu ngoặc đơn, dấu nhắc phụ (theo mặc định "+>") được phát hành trên dòng mới. Dấu nhắc phụ có thể được thiết lập bằng cách xác định một thủ tục gọi là "prompt2".

Trong thông dịch viên , chế độ nấu chín được sử dụng, ngay cả khi người gọi của nó đang sử dụng chế độ thô.

Nếu stdin bị đóng, trình thông dịch sẽ trả về trừ khi cờ -eof được sử dụng, trong trường hợp này đối số tiếp theo được gọi.

log_file [args] [[-a] tệp]
Nếu tên tệp được cung cấp, log_file sẽ ghi lại một bản ghi phiên (bắt đầu tại điểm đó) trong tệp. log_file sẽ ngừng ghi nếu không có đối số nào được đưa ra. Bất kỳ tệp nhật ký trước nào đều bị đóng.

Thay vì tên tệp, một mã định danh tệp Tcl có thể được cung cấp bằng cách sử dụng các cờ -open hoặc -leaveopen . Điều này tương tự như lệnh sinh sản . (Xem đẻ trứng để biết thêm thông tin.)

Các -a cờ lực lượng đầu ra được ghi lại đã bị đàn áp bởi lệnh log_user .

Theo mặc định, lệnh log_file gắn thêm vào các tệp cũ hơn là cắt bớt chúng, để thuận tiện cho việc có thể tắt và đăng nhập nhiều lần trong một phiên. Để cắt bớt các tệp, hãy sử dụng cờ -noappend .

Cờ -info làm cho log_file trả về một mô tả về các đối số phi thông tin mới nhất được đưa ra.

log_user -info | 0 | 1
Theo mặc định, hộp thoại gửi / mong đợi được ghi vào stdout (và logfile nếu mở). Việc đăng nhập vào stdout bị tắt bởi lệnh "log_user 0" và được bật lại bởi "log_user 1". Đăng nhập vào logfile không thay đổi.

Cờ -info làm cho log_user trả về một mô tả về các đối số phi thông tin mới nhất được đưa ra.

match_max [-d] [-i spawn_id] [size]
xác định kích thước của bộ đệm (tính bằng byte) được sử dụng nội bộ theo mong đợi . Không có đối số kích thước , kích thước hiện tại được trả về.

Với cờ -d , kích thước mặc định được đặt. (Giá trị mặc định ban đầu là 2000.) Với cờ -i , kích thước được đặt cho id đẻ trứng có tên, nếu không nó được đặt cho tiến trình hiện tại.

lớp phủ [- # spawn_id] [- # spawn_id] [...] chương trình [args]
thực thi "program args" thay cho chương trình Expect hiện tại, kết thúc. Đối số gạch nối trần buộc một dấu gạch ngang ở trước tên lệnh như thể nó là một vỏ đăng nhập. Tất cả các spawn_ids đều được đóng trừ các đối tượng được đặt tên. Đây là những ánh xạ vào các định danh tệp được đặt tên.

Spawn_ids được ánh xạ tới các định danh tệp cho chương trình mới kế thừa. Ví dụ, dòng sau chạy cờ vua và cho phép nó được kiểm soát bởi quá trình hiện tại - nói, một bậc thầy cờ vua.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id cờ vua

Điều này hiệu quả hơn "tương tác -u", tuy nhiên, nó hy sinh khả năng thực hiện tương tác được lập trình vì quá trình Mong đợi không còn kiểm soát được nữa.

Lưu ý rằng không có thiết bị đầu cuối điều khiển nào được cung cấp. Vì vậy, nếu bạn ngắt kết nối hoặc remap đầu vào tiêu chuẩn, các chương trình kiểm soát công việc (vỏ, đăng nhập, vv) sẽ không hoạt động đúng.

chẵn lẻ [-d] [-i spawn_id] [giá trị]
xác định liệu tính chẵn lẻ có nên được giữ lại hoặc bị tước khỏi đầu ra của các quá trình sinh sản hay không. Nếu giá trị bằng không, tính chẵn lẻ bị tước, nếu không nó sẽ không bị tước bỏ. Không có đối số giá trị , giá trị hiện tại được trả về.

Với cờ -d , giá trị chẵn lẻ mặc định được đặt. (Giá trị mặc định ban đầu là 1, nghĩa là chẵn lẻ không bị tước đi.) Với cờ -i , giá trị chẵn lẻ được đặt cho id đẻ trứng có tên, nếu không nó sẽ được đặt cho tiến trình hiện tại.

remove_nulls [-d] [-i spawn_id] [giá trị]
định nghĩa các giá trị null được giữ lại hay loại bỏ khỏi đầu ra của các tiến trình sinh ra trước khi khớp mẫu hoặc lưu trữ trong biến expect_out hoặc interact_out . Nếu giá trị là 1, thì các giá trị rỗng được loại bỏ. Nếu giá trị bằng 0, thì các giá trị rỗng sẽ không bị xóa. Không có đối số giá trị , giá trị hiện tại được trả về.

Với cờ -d , giá trị mặc định được đặt. (Giá trị mặc định ban đầu là 1, tức là, null được loại bỏ.) Với cờ -i , giá trị được đặt cho id đẻ trứng có tên, nếu không nó sẽ được đặt cho tiến trình hiện tại.

Có hoặc không nulls được loại bỏ, Mong đợi sẽ ghi lại null byte để đăng nhập và stdout.

gửi chuỗi [-flags]
Gửi chuỗi đến quá trình hiện tại. Ví dụ, lệnh

gửi "hello world \ r"

gửi các ký tự, helloworld đến quá trình hiện tại. (Tcl bao gồm một lệnh printf -like (được gọi là định dạng ) có thể xây dựng các chuỗi phức tạp tùy ý.)

Các ký tự được gửi ngay lập tức mặc dù các chương trình có đầu vào được đệm theo dòng sẽ không đọc các ký tự cho đến khi ký tự trả về được gửi đi. Một ký tự trả về được ký hiệu là "\ r".

Cờ này buộc đối số tiếp theo được hiểu là chuỗi thay vì cờ. Bất kỳ chuỗi nào có thể được bắt đầu bằng dấu "-" có hay không nó thực sự trông giống như một lá cờ. Điều này cung cấp một cơ chế đáng tin cậy để xác định các chuỗi biến mà không bị vấp bởi những chuỗi vô tình trông giống như cờ. (Tất cả các chuỗi bắt đầu bằng "-" được dành riêng cho các tùy chọn trong tương lai.)

Cờ -i tuyên bố rằng chuỗi được gửi đến spawn_id có tên. Nếu spawn_id là user_spawn_id , và terminal ở chế độ thô, các dòng mới trong chuỗi được dịch thành các chuỗi trả về-newline để chúng xuất hiện như thể terminal đang ở chế độ nấu chín. Cờ -raw vô hiệu hóa bản dịch này.

Cờ -null gửi các ký tự null (0 byte). Theo mặc định, một null được gửi. Một số nguyên có thể theo sau -null để cho biết số lượng null để gửi.

Cờ -break tạo ra một điều kiện ngắt. Điều này chỉ có ý nghĩa nếu id đẻ trứng đề cập đến một thiết bị tty được mở thông qua "spawn -open". Nếu bạn đã sinh ra một quá trình như tip, bạn nên sử dụng quy ước của tip để tạo ra một break.

Các lực lượng cờ đầu ra được gửi "chậm", do đó tránh tình trạng phổ biến mà một máy tính outtypes một bộ đệm đầu vào được thiết kế cho một người sẽ không bao giờ outtype cùng một bộ đệm . Đầu ra này được kiểm soát bởi giá trị của biến "send_slow", có một danh sách hai phần tử. Phần tử đầu tiên là một số nguyên mô tả số byte để gửi nguyên tử. Phần tử thứ hai là một số thực mô tả số giây mà nguyên tử gửi đi phải được tách ra. Ví dụ: "set send_slow {10 .001}" sẽ buộc "send -s" gửi các chuỗi với 1 mili giây ở giữa mỗi 10 ký tự được gửi.

Các-lực lượng cờ h đầu ra được gửi (phần nào) giống như một con người thực sự gõ. Sự chậm trễ giống như con người xuất hiện giữa các nhân vật. (Thuật toán dựa trên phân phối Weibull, với các sửa đổi cho phù hợp với ứng dụng cụ thể này.) Đầu ra này được điều khiển bởi giá trị của biến "send_human", có danh sách năm phần tử. Hai yếu tố đầu tiên là thời gian trung bình giữa các nhân vật trong vài giây. Đầu tiên được sử dụng theo mặc định. Chữ thứ hai được sử dụng ở phần cuối của từ, để mô phỏng các tạm dừng tinh tế thỉnh thoảng xảy ra ở các chuyển đổi như vậy. Tham số thứ ba là số đo biến thiên trong đó .1 là biến khá, 1 là biến hợp lý, và 10 là không thay đổi. Các thái cực là 0 đến vô cùng. Hai thông số cuối cùng, tương ứng, một thời gian tối thiểu và tối đa interarrival. Tối thiểu và tối đa được sử dụng cuối cùng và "clip" thời gian cuối cùng. Mức trung bình cuối cùng có thể khá khác với mức trung bình đã cho nếu giá trị đủ tối thiểu và tối đa của clip.

Ví dụ, lệnh sau mô phỏng một typist nhanh và nhất quán:

đặt send_human {.1 .3 1 .05 2} gửi -h "Tôi đói rồi. Ăn trưa đi."

trong khi sau đây có thể phù hợp hơn sau khi nôn nao:

đặt send_human {.4 .4 .2 .5 100} gửi -h "Đêm lash bên Goodd!"

Lưu ý rằng các lỗi không được mô phỏng, mặc dù bạn có thể tự thiết lập các tình huống sửa lỗi bằng cách nhúng các lỗi và sửa chữa trong một đối số gửi.

Các cờ để gửi các ký tự null, để gửi các dấu ngắt, để buộc đầu ra chậm và đầu ra kiểu con người là loại trừ lẫn nhau. Chỉ cái được chỉ định cuối cùng sẽ được sử dụng. Hơn nữa, không thể xác định đối số chuỗi nào với các cờ để gửi ký tự null hoặc ngắt.

Đó là một ý tưởng tốt để đi trước gửi đầu tiên đến một quá trình bằng một kỳ vọng . mong đợi sẽ chờ quá trình bắt đầu, trong khi gửi không thể. Đặc biệt, nếu lần gửi đầu tiên hoàn tất trước khi quá trình bắt đầu chạy, bạn có nguy cơ bị bỏ qua dữ liệu của mình. Trong trường hợp các chương trình tương tác không cung cấp lời nhắc ban đầu, bạn có thể gửi trước bằng cách trì hoãn như sau:

# Để tránh cho tin tặc gợi ý về cách đột nhập, # hệ thống này không nhắc nhập mật khẩu bên ngoài. # Đợi 5 giây cho exec để hoàn thành đẻ trứng telnet very.secure.gov ngủ 5 gửi mật khẩu \ r

exp_send là bí danh để gửi. Nếu bạn đang sử dụng Expectk hoặc một số biến thể khác của Mong đợi trong môi trường Tk, gửi được xác định bởi Tk cho một mục đích hoàn toàn khác. exp_send được cung cấp cho khả năng tương thích giữa các môi trường. Các bí danh tương tự được cung cấp cho các lệnh gửi khác của Expect khác.

chuỗi send_error [-flags]
giống như gửi , ngoại trừ đầu ra được gửi tới stderr thay vì quá trình hiện tại.

send_log [-] chuỗi
giống như gửi , ngoại trừ chuỗi chỉ được gửi tới tệp nhật ký (xem log_file .) Các đối số được bỏ qua nếu không có tệp nhật ký nào được mở.

chuỗi send_tty [-flags]
giống như gửi , ngoại trừ việc đầu ra được gửi đến / dev / tty thay vì quá trình hiện tại.

chuỗi send_user [-flags]
giống như gửi , ngoại trừ việc đầu ra được gửi đến stdout hơn là quá trình hiện tại.

giấc ngủ giây
làm cho tập lệnh ngủ trong một số giây nhất định. Số giây có thể là số thập phân. Ngắt (và Tk sự kiện nếu bạn đang sử dụng Expectk) được xử lý trong khi chờ đợi giấc ngủ.

chương trình sinh sản [args]
tạo một quy trình mới chạy "chương trình args". Stdin, stdout và stderr của nó được kết nối với Expect, để chúng có thể được đọc và viết bởi các lệnh Expect khác. Kết nối bị ngắt khi đóng hoặc nếu quá trình tự đóng bất kỳ định danh tệp nào.

Khi một tiến trình được bắt đầu bằng cách sinh sản , biến spawn_id được đặt thành một bộ mô tả đề cập đến quá trình đó. Quá trình được mô tả bởi spawn_id được coi là " quy trình hiện tại ". spawn_id có thể được đọc hoặc viết, có hiệu lực trong việc cung cấp điều khiển công việc.

user_spawn_id là một biến toàn cục chứa một bộ mô tả chỉ người dùng. Ví dụ: khi spawn_id được đặt thành giá trị này, hãy mong đợi hoạt động như expect_user .

.I error_spawn_id là một biến toàn cục chứa một bộ mô tả tham chiếu đến lỗi tiêu chuẩn. Ví dụ, khi spawn_id được đặt thành giá trị này, hãy gửi các hành vi như send_error .

tty_spawn_id là một biến toàn cầu có chứa một bộ mô tả đề cập đến / dev / tty. Nếu / dev / tty không tồn tại (chẳng hạn như trong cron, at, hoặc batch script), thì tty_spawn_id không được định nghĩa. Điều này có thể được kiểm tra là:

nếu {[info vars tty_spawn_id]} {# / dev / tty tồn tại} khác {# / dev / tty không tồn tại # có thể trong cron, batch hoặc tại script}

đẻ trứng trả về id tiến trình UNIX. Nếu không có tiến trình nào được sinh ra, 0 được trả về. Biến spawn_out (slave, name) được đặt thành tên của thiết bị pty slave.

Theo mặc định, spawn lặp lại tên lệnh và các đối số. Cờ -noecho ngừng sinh sản từ việc này.

Cờ -console làm cho đầu ra của bàn điều khiển được chuyển hướng đến tiến trình sinh ra. Điều này không được hỗ trợ trên tất cả các hệ thống.

Nội bộ, đẻ trứng sử dụng một pty, khởi tạo theo cùng một cách như tty của người dùng. Điều này được tiếp tục khởi tạo để tất cả các thiết lập đều "sane" (theo stty (1)). Nếu biến stty_init được định nghĩa, nó được diễn giải theo kiểu của đối số stty như cấu hình tiếp theo. Ví dụ, "thiết lập stty_init nguyên" sẽ gây ra thêm các thiết bị đầu cuối của quá trình sinh sản để bắt đầu trong chế độ thô. -nottycopy bỏ qua việc khởi tạo dựa trên tty của người dùng. -nottyinit bỏ qua việc khởi tạo "sane".

Thông thường, đẻ trứng mất ít thời gian để thực thi. Nếu bạn nhận thấy đẻ trứng mất một khoảng thời gian đáng kể, nó có thể gặp phải những pty được nêm. Một số thử nghiệm được chạy trên ptys để tránh vướng mắc với các quá trình không đúng. (Những mất 10 giây cho mỗi ped wedged.) Chạy Mong đợi với tùy chọn -d sẽ hiển thị nếu mong đợi đang gặp phải nhiều ptys trong kỳ lạ. Nếu bạn không thể giết các quy trình mà các pty này được đính kèm, thì việc truy đòi duy nhất của bạn có thể là khởi động lại.

Nếu chương trình không thể sinh ra thành công vì exec (2) thất bại (ví dụ khi chương trình không tồn tại), một thông báo lỗi sẽ được trả về bởi lệnh tương tác hoặc mong đợi tiếp theo như thể chương trình đã chạy và tạo ra thông báo lỗi là đầu ra. Hành vi này là hậu quả tự nhiên của việc thực hiện đẻ trứng . Nội bộ, đẻ trứng dĩa, sau đó quá trình sinh sản không có cách nào để giao tiếp với quá trình mong đợi ban đầu ngoại trừ bằng cách giao tiếp thông qua spawn_id.

Cờ -open khiến đối số tiếp theo được hiểu là một định danh tệp Tcl (tức là, được trả về bằng cách mở .) Id đẻ trứng sau đó có thể được sử dụng như thể nó là một quá trình sinh sản. (Định danh tệp sẽ không còn được sử dụng nữa.) Điều này cho phép bạn xử lý các thiết bị thô, các tệp và các đường dẫn dưới dạng các quá trình sinh sản mà không cần sử dụng một pty. 0 được trả về để cho biết không có quá trình liên quan. Khi kết nối đến quá trình sinh sản được đóng lại, do đó, là định danh tệp Tcl. Cờ -leaveopen tương tự như -open ngoại trừ rằng -leaveopen làm cho định danh tệp được mở ngay cả sau khi id sinh sản được đóng lại.

Cờ -pty gây ra một pty được mở nhưng không có quá trình sinh ra. 0 được trả về để cho biết không có quá trình liên quan. Spawn_id được đặt như bình thường.

Biến spawn_out (slave, fd) được đặt thành một định danh tệp tương ứng với slave pty. Nó có thể được đóng bằng cách sử dụng "close -slave".

Cờ -ignore đặt tên cho một tín hiệu bị bỏ qua trong quá trình sinh ra. Nếu không, tín hiệu sẽ nhận được hành vi mặc định. Các tín hiệu được đặt tên như trong lệnh bẫy , ngoại trừ mỗi tín hiệu yêu cầu một cờ riêng biệt.

strace level
làm cho các câu lệnh sau được in trước khi thực thi. (Lệnh dấu vết của Tcl theo dõi các biến.) Cho biết khoảng cách trong ngăn xếp cuộc gọi để theo dõi. Ví dụ, lệnh sau chạy Expect trong khi truy tìm 4 cấp độ đầu tiên của các cuộc gọi, nhưng không có lệnh nào dưới đây.

mong đợi -c "strace 4" script.exp

Cờ -info khiến cho strace trả về một mô tả về các đối số phi thông tin mới nhất được đưa ra.

stty args
thay đổi chế độ đầu cuối tương tự như lệnh stty bên ngoài.

Theo mặc định, thiết bị đầu cuối điều khiển được truy cập. Các thiết bị đầu cuối khác có thể được truy cập bằng cách thêm vào "Yêu cầu trả lại trạng thái như là kết quả của lệnh. Nếu không có trạng thái được yêu cầu và thiết bị đầu cuối điều khiển được truy cập, trạng thái trước đó của thuộc tính thô và echo được trả về trong biểu mẫu" được sử dụng bởi lệnh.

Ví dụ, các đối số thô hoặc -cooked đặt thiết bị đầu cuối vào chế độ thô. Các đối số -raw hoặc nấu chín đặt các thiết bị đầu cuối vào chế độ nấu chín. Các đối số echo-echo đặt thiết bị đầu cuối vào chế độ echo và noecho tương ứng.

Ví dụ sau minh họa cách tạm thời tắt tính năng lặp lại. Điều này có thể được sử dụng trong các tập lệnh tự động khác để tránh nhúng mật khẩu vào chúng. (Xem thêm thảo luận về điều này dưới HƯỚNG DẪN HẤP DẪN dưới đây.)

stty -echo send_user "Mật khẩu:" expect_user -re "(. *) \ n" đặt mật khẩu $ expect_out (1, string) stty echo

hệ thống args
cho args để sh (1) làm đầu vào, giống như nó đã được gõ như một lệnh từ một thiết bị đầu cuối. Mong chờ đợi cho đến khi trình bao kết thúc. Trạng thái trả về từ sh được xử lý giống như cách mà exec xử lý trạng thái trả về của nó.

Ngược lại với exec chuyển hướng stdin và stdout thành tập lệnh, hệ thống thực hiện không có chuyển hướng (ngoại trừ được chỉ định bởi chính chuỗi đó). Vì vậy, có thể sử dụng các chương trình mà phải nói chuyện trực tiếp với / dev / tty. Vì lý do tương tự, kết quả của hệ thống không được ghi lại trong nhật ký.

dấu thời gian [args]
trả về dấu thời gian. Không có đối số, số giây kể từ thời đại được trả về.

Cờ -format giới thiệu một chuỗi được trả về nhưng với các thay thế được thực hiện theo các quy tắc POSIX cho strftime. Ví dụ:% a được thay thế bằng tên ngày trong tuần viết tắt (ví dụ: Sat). Những kẻ khác là:

% tên ngày trong tuần viết tắt% Một tên đầy đủ ngày trong tuần% b tên tháng viết tắt% B tên tháng đầy đủ% c ngày-thời gian như trong: Wed Oct 6 11:45:56 1993% d ngày trong tháng (01-31% H giờ (00-23)% I giờ (01-12)% j ngày (001-366)% m tháng (01-12)% M phút (00-59)% p sáng hoặc chiều% S giây (00-61) % u ngày (1-7, Thứ Hai là ngày đầu tiên trong tuần)% U tuần (00-53, chủ nhật đầu tiên là ngày đầu tiên của tuần một)% V tuần (01-53, kiểu ISO 8601)% w ngày (0- 6)% W tuần (00-53, thứ Hai đầu tiên là ngày đầu tiên của tuần một)% x ngày-thời gian như trong: Wed Oct 6 1993% X thời gian như trong: 23:59:59% y năm (00-99) % Y năm như sau: 1993% Z múi giờ (hoặc không có gì nếu không thể xác định) %% một dấu phần trăm trần

Các thông số% khác không xác định. Các nhân vật khác sẽ được thông qua không bị ảnh hưởng. Chỉ hỗ trợ ngôn ngữ C.

Cờ thứ hai giới thiệu một số giây kể từ kỷ nguyên được sử dụng làm nguồn để định dạng. Nếu không, thời gian hiện tại được sử dụng.

Cờ đầu ra -gmt tạo ra dấu thời gian để sử dụng múi giờ GMT . Không có cờ, múi giờ địa phương được sử dụng.

bẫy [tín hiệu [lệnh]]
làm cho lệnh được đưa ra được thực hiện khi nhận được bất kỳ tín hiệu nào trong tương lai. Lệnh được thực hiện trong phạm vi toàn cục. Nếu lệnh vắng mặt, hành động tín hiệu được trả về. Nếu lệnh là chuỗi SIG_IGN, các tín hiệu sẽ bị bỏ qua. Nếu lệnh là chuỗi SIG_DFL, các tín hiệu sẽ dẫn đến mặc định hệ thống. tín hiệutín hiệu đơn hoặc danh sách tín hiệu. Tín hiệu có thể được xác định bằng số hoặc ký hiệu theo tín hiệu (3). Tiền tố "SIG" có thể bị bỏ qua.

Không có đối số (hoặc đối số -number), bẫy trả về số hiệu của lệnh bẫy hiện đang được thực hiện.

Cờ -code sử dụng mã trả về của lệnh thay cho bất kỳ mã nào Tcl sắp trở lại khi lệnh ban đầu bắt đầu chạy.

Cờ -interp làm cho lệnh được đánh giá bằng cách sử dụng trình thông dịch hoạt động tại thời điểm lệnh bắt đầu chạy thay vì khi bẫy được khai báo.

Cờ -name gây ra lệnh bẫy để trả về tên tín hiệu của lệnh bẫy hiện đang được thực thi.

Cờ -max gây ra lệnh bẫy để trả về số tín hiệu lớn nhất có thể được thiết lập.

Ví dụ, lệnh "trap {send_user" Ouch! "} SIGINT" sẽ in "Ouch!" mỗi lần người dùng nhấn ^ C.

Theo mặc định, SIGINT (thường có thể được tạo bằng cách nhấn ^ C) và SIGTERM gây ra Expect để thoát. Điều này là do bẫy sau, được tạo theo mặc định khi Expect bắt đầu.

thoát khỏi bẫy {SIGINT SIGTERM}

Nếu bạn sử dụng cờ -D để khởi động trình gỡ rối, SIGINT được định nghĩa lại để khởi động trình gỡ lỗi tương tác. Điều này là do bẫy sau:

bẫy {exp_debug 1} SIGINT

Có thể thay đổi bẫy gỡ lỗi bằng cách đặt biến môi trường EXPECT_DEBUG_INIT thành lệnh bẫy mới.

Bạn có thể, tất nhiên, ghi đè lên cả hai chỉ bằng cách thêm các lệnh bẫy vào kịch bản của bạn. Đặc biệt, nếu bạn có "bẫy thoát SIGINT" của riêng bạn, điều này sẽ ghi đè lên bẫy gỡ rối. Điều này rất hữu ích nếu bạn muốn ngăn người dùng truy cập vào trình gỡ lỗi.

Nếu bạn muốn xác định bẫy của riêng bạn trên SIGINT nhưng vẫn bẫy bẫy trình gỡ rối khi nó đang chạy, hãy sử dụng:

nếu {! [exp_debug]} {trap mystuff SIGINT}

Ngoài ra, bạn có thể bẫy vào trình gỡ lỗi bằng cách sử dụng một số tín hiệu khác.

bẫy sẽ không cho phép bạn ghi đè lên các hành động cho SIGALRM vì điều này được sử dụng trong nội bộ để mong đợi . Lệnh ngắt kết nối đặt SIGALRM thành SIG_IGN (bỏ qua). Bạn có thể bật lại điều này miễn là bạn vô hiệu hóa nó trong các lệnh sinh sản tiếp theo.

Xem tín hiệu (3) để biết thêm thông tin.

đợi [args]
sự chậm trễ cho đến khi một quá trình sinh sản (hoặc quá trình hiện tại nếu không có tên) chấm dứt.

chờ đợi bình thường trả về một danh sách bốn số nguyên. Số nguyên đầu tiên là pid của quá trình đã được chờ đợi. Số nguyên thứ hai là id sinh sản tương ứng. Số nguyên thứ ba là -1 nếu xảy ra lỗi hệ điều hành hoặc 0 nếu không. Nếu số nguyên thứ ba là 0, số nguyên thứ tư là trạng thái được trả về bởi quá trình sinh ra. Nếu số nguyên thứ ba là -1, số nguyên thứ tư là giá trị của errno được thiết lập bởi hệ điều hành. Biến errorCode toàn cục cũng được thiết lập.

Các phần tử bổ sung có thể xuất hiện ở cuối giá trị trả về từ khi chờ . Phần tử thứ năm tùy chọn xác định một lớp thông tin. Hiện tại, giá trị duy nhất có thể cho phần tử này là CHILDKILLED trong trường hợp đó hai giá trị tiếp theo là tên tín hiệu kiểu C và mô tả văn bản ngắn.

Cờ -i tuyên bố quá trình chờ tương ứng với tên spawn_id (KHÔNG phải là quá trình id). Bên trong một trình xử lý SIGCHLD, có thể chờ đợi cho bất kỳ quá trình sinh sản nào bằng cách sử dụng id sinh sản -1.

Cờ chờ đợi này khiến cho sự chờ đợi trở lại ngay lập tức với dấu hiệu chờ đợi thành công. Khi quá trình thoát (sau này), nó sẽ tự động biến mất mà không cần chờ đợi rõ ràng.

Lệnh chờ cũng có thể được sử dụng chờ cho một quá trình được chia nhỏ sử dụng các đối số "-i -1". Không giống như việc sử dụng nó với các tiến trình sinh sản, lệnh này có thể được thực thi bất cứ lúc nào. Không có kiểm soát quá trình nào được gặt hái. Tuy nhiên, giá trị trả lại có thể được kiểm tra cho id quá trình .

LIBRARIES

Mong đợi tự động biết về hai thư viện tích hợp cho các tập lệnh Mong đợi. Chúng được định nghĩa bởi các thư mục có tên trong các biến exp_library và exp_exec_library. Cả hai đều có nghĩa là chứa các tệp tiện ích có thể được sử dụng bởi các tập lệnh khác.

exp_library chứa các tệp độc lập về kiến ​​trúc. exp_exec_library chứa các tệp phụ thuộc vào kiến ​​trúc. Tùy thuộc vào hệ thống của bạn, cả hai thư mục có thể hoàn toàn trống. Sự tồn tại của tập tin $ exp_exec_library / cat-buffer mô tả bộ đệm của bạn / bin / cat theo mặc định.

PRETTY-IN

Định nghĩa vgrind có sẵn cho các tập lệnh Mong đợi in đẹp mắt. Giả sử định nghĩa vgrind được cung cấp với phân phối Mong đợi được cài đặt đúng, bạn có thể sử dụng nó như sau:

tập tin vgrind -lexpect

VÍ DỤ

Nhiều người không rõ ràng cách đặt mọi thứ lại với nhau mà trang người đàn ông mô tả. Tôi khuyến khích bạn đọc và thử các ví dụ trong thư mục ví dụ về phân phối Mong đợi . Một số trong số đó là các chương trình thực sự. Những người khác chỉ đơn giản là minh họa của một số kỹ thuật, và tất nhiên, một cặp vợ chồng chỉ là hack nhanh chóng. Tệp INSTALL có tổng quan nhanh về các chương trình này.

Các giấy tờ kỳ vọng (xem SEE CSONG) cũng hữu ích. Trong khi một số giấy tờ sử dụng cú pháp tương ứng với các phiên bản trước đó của Kỳ vọng, các lý do kèm theo vẫn hợp lệ và đi vào chi tiết hơn rất nhiều so với trang người đàn ông này.

CAVEATS

Các phần mở rộng có thể va chạm với các tên lệnh của Expect. Ví dụ, gửi được định nghĩa bởi Tk cho một mục đích hoàn toàn khác. Vì lý do này, hầu hết các lệnh Mong đợi cũng có sẵn dưới dạng "exp_XXXX". Lệnh và biến bắt đầu bằng "exp", "inter", "spawn" và "timeout" không có bí danh. Sử dụng tên lệnh mở rộng nếu bạn cần sự tương thích này giữa các môi trường.

Mong đợi có một cái nhìn khá tự do về phạm vi. Đặc biệt, các biến đọc theo các lệnh cụ thể cho chương trình Mong đợi sẽ được tìm kiếm đầu tiên từ phạm vi địa phương và nếu không tìm thấy, trong phạm vi toàn cầu. Ví dụ, điều này làm giảm bớt sự cần thiết phải đặt "thời gian chờ toàn cầu" trong mọi thủ tục bạn viết mà sử dụng mong đợi . Mặt khác, các biến được viết luôn nằm trong phạm vi cục bộ (trừ khi lệnh "toàn cầu" được đưa ra). Vấn đề phổ biến nhất mà nguyên nhân này là khi đẻ trứng được thực hiện trong một quy trình. Bên ngoài quy trình, spawn_id không còn tồn tại, do đó quá trình sinh sản không còn truy cập được nữa chỉ vì phạm vi. Thêm một "toàn cầu spawn_id" vào một thủ tục như vậy.

Nếu bạn không thể kích hoạt khả năng multispawning (tức là, hệ thống của bạn không hỗ trợ chọn (BSD *. *), Thăm dò ý kiến ​​(SVR> 2), cũng không tương đương), Mong đợi sẽ chỉ có thể kiểm soát một tiến trình tại một thời điểm. Trong trường hợp này, không cố gắng thiết lập spawn_id , bạn cũng không nên thực hiện các tiến trình thông qua exec trong khi một tiến trình sinh sản đang chạy. Hơn nữa, bạn sẽ không thể mong đợi từ nhiều quá trình (bao gồm cả người dùng là một) cùng một lúc.

Tham số đầu cuối có thể có ảnh hưởng lớn đến tập lệnh. Ví dụ: nếu một tập lệnh được viết để tìm kiếm lặp lại, nó sẽ bị lỗi nếu bị tắt tiếng. Vì lý do này, Mong đợi các tham số thiết bị đầu cuối sane theo mặc định. Thật không may, điều này có thể làm cho mọi thứ khó chịu cho các chương trình khác. Ví dụ, vỏ emacs muốn thay đổi ánh xạ "thông thường": các dòng mới được ánh xạ tới các dòng mới thay vì các dòng mới trả về, và việc lặp lại bị tắt. Điều này cho phép người dùng sử dụng các emacs để chỉnh sửa dòng đầu vào. Thật không may, Mong đợi không thể đoán được điều này.

Bạn có thể yêu cầu Expect không ghi đè lên các thiết lập mặc định của các tham số đầu cuối, nhưng sau đó bạn phải rất cẩn thận khi viết các kịch bản cho các môi trường như vậy. Trong trường hợp emacs, tránh tùy thuộc vào những thứ như ánh xạ lặp lại và kết thúc của dòng.

Các lệnh chấp nhận các đối số được đưa vào một danh sách duy nhất (các biến thể mong đợitương tác ) sử dụng một heuristic để quyết định xem danh sách đó thực sự là một đối số hay nhiều. Các heuristic có thể thất bại chỉ trong trường hợp khi danh sách thực sự đại diện cho một đối số duy nhất có nhiều nhúng \ n với các ký tự không khoảng trống giữa chúng. Điều này có vẻ không đủ khả thi, tuy nhiên đối số "-nobrace" có thể được sử dụng để buộc một đối số duy nhất được xử lý như một đối số duy nhất. Điều này có thể được sử dụng với mã Expect do máy tạo ra. Tương tự, -brace buộc một đối số duy nhất được xử lý như nhiều mẫu / hành động.

LGSI

Nó thực sự hấp dẫn để đặt tên chương trình "sex" (cho cả "Smart EXEC" hoặc "Send-EXpect"), nhưng ý thức tốt (hoặc có lẽ chỉ Puritanism) chiếm ưu thế.

Trên một số hệ thống, khi một shell được sinh ra, nó phàn nàn về việc không thể truy cập tty nhưng vẫn chạy. Điều này có nghĩa là hệ thống của bạn có cơ chế để đạt được quyền kiểm soát mà Kỳ vọng không biết. Hãy tìm hiểu xem nó là gì và gửi lại thông tin này cho tôi.

Ultrix 4.1 (ít nhất là phiên bản mới nhất xung quanh đây) xem xét thời gian chờ của trên 1000000 để tương đương với 0.

Kỹ thuật số UNIX 4.0A (và có lẽ các phiên bản khác) từ chối phân bổ ptys nếu bạn định nghĩa một trình xử lý SIGCHLD. Xem trang tài trợ để biết thêm thông tin.

IRIX 6.0 không xử lý quyền pty một cách chính xác để nếu mong đợi nỗ lực để phân bổ một pty trước đó được sử dụng bởi người khác, nó không thành công. Nâng cấp lên IRIX 6.1.

Telnet (chỉ được xác minh theo SunOS 4.1.2) treo nếu không đặt TERM. Đây là một vấn đề trong cron, tại và trong các script cgi, không xác định TERM. Vì vậy, bạn phải đặt nó một cách rõ ràng - loại nào thường không liên quan. Nó chỉ cần được thiết lập để một cái gì đó! Sau đây có thể là đủ cho hầu hết các trường hợp.

đặt env (TERM) vt100

Mẹo (chỉ được xác minh trong BSDI BSD / OS 3.1 i386) treo nếu SHELL và HOME không được đặt. Đây là một vấn đề trong cron , tại và trong các script cgi , không xác định các biến môi trường này. Vì vậy, bạn phải đặt chúng một cách rõ ràng - loại nào thường không liên quan. Nó chỉ cần được thiết lập để một cái gì đó! Sau đây có thể là đủ cho hầu hết các trường hợp.

set env (SHELL) / bin / sh thiết lập env (HOME) / usr / local / bin

Một số việc triển khai các pty được thiết kế sao cho hạt nhân ném đi bất kỳ đầu ra chưa đọc nào sau 10 đến 15 giây (số thực tế phụ thuộc vào việc thực hiện) sau khi quá trình đã đóng bộ mô tả tệp. Vì vậy, mong đợi các chương trình như

đẻ trứng ngày ngủ 20 mong đợi

sẽ thất bại. Để tránh điều này, hãy gọi các chương trình không tương tác với exec thay vì đẻ trứng . Trong khi các tình huống như vậy có thể hiểu được, trong thực tế tôi chưa bao giờ gặp phải một tình huống trong đó đầu ra cuối cùng của một chương trình thực sự tương tác sẽ bị mất do hành vi này.

Mặt khác, Cray UNICOS ptys vứt bỏ bất kỳ đầu ra chưa đọc ngay lập tức sau khi quá trình đã đóng bộ mô tả tập tin. Tôi đã báo cáo điều này để Cray và họ đang làm việc trên một sửa chữa.

Đôi khi cần có độ trễ giữa lời nhắc và phản hồi, chẳng hạn như khi giao diện tty đang thay đổi cài đặt UART hoặc tỷ lệ truyền phù hợp bằng cách tìm kiếm bit bắt đầu / dừng. Thông thường, tất cả điều này là yêu cầu là để ngủ trong một hoặc hai giây. Một kỹ thuật mạnh mẽ hơn là thử lại cho đến khi phần cứng sẵn sàng nhận đầu vào. Ví dụ sau sử dụng cả hai chiến lược:

gửi "tốc độ 9600 \ r"; ngủ 1 mong đợi {timeout {send "\ r"; exp_continue} $ prompt}

trap -code sẽ không hoạt động với bất kỳ lệnh nào nằm trong vòng lặp sự kiện của Tcl, chẳng hạn như ngủ. Vấn đề là trong vòng lặp sự kiện, Tcl loại bỏ các mã trả về từ các trình xử lý sự kiện async. Cách giải quyết là đặt cờ trong mã bẫy. Sau đó kiểm tra cờ ngay sau lệnh (ví dụ: ngủ).

Lệnh expect_background bỏ qua các đối số-timeout và không có khái niệm về timeout nói chung.

& # 34; EXPECT HINTS & # 34;

Có một vài điều về Mong đợi có thể không trực quan. Phần này cố gắng giải quyết một số trong những điều này với một vài gợi ý.

Một vấn đề mong đợi phổ biến là làm thế nào để nhận ra lời nhắc shell. Vì chúng được tùy chỉnh khác nhau bởi những người khác nhau và các trình bao khác nhau, nên việc tự động hóa rlogin có thể khó khăn mà không biết lời nhắc. Một quy ước hợp lý là để người dùng lưu trữ một biểu thức chính quy mô tả lời nhắc của họ (đặc biệt, kết thúc của nó) trong biến môi trường EXPECT_PROMPT. Mã như sau có thể được sử dụng. Nếu EXPECT_PROMPT không tồn tại, mã vẫn có cơ hội hoạt động chính xác.

đặt dấu nhắc "(% | # | \\ $) $"; # dấu nhắc mặc định bắt {set prompt $ env (EXPECT_PROMPT)} mong đợi -re $ prompt

Tôi khuyến khích bạn viết các mẫu kỳ vọng bao gồm kết thúc của bất cứ điều gì bạn mong đợi để xem. Điều này tránh được khả năng trả lời câu hỏi trước khi nhìn thấy toàn bộ sự việc. Ngoài ra, trong khi bạn cũng có thể trả lời các câu hỏi trước khi nhìn thấy chúng hoàn toàn, nếu bạn trả lời sớm, câu trả lời của bạn có thể xuất hiện lặp lại ở giữa câu hỏi. Nói cách khác, kết quả đối thoại sẽ chính xác nhưng nhìn tranh giành.

Hầu hết lời nhắc bao gồm ký tự khoảng trắng ở cuối. Ví dụ, lời nhắc từ ftp là 'f', 't', 'p', '>' và. Để khớp với lời nhắc này, bạn phải tính đến từng ký tự này. Đó là một sai lầm phổ biến không bao gồm trống. Đặt trống trong một cách rõ ràng.

Nếu bạn sử dụng một mẫu của biểu mẫu X *, dấu * sẽ khớp với tất cả đầu ra nhận được từ cuối X đến điều cuối cùng nhận được. Điều này nghe có vẻ trực quan nhưng có thể hơi khó hiểu vì cụm từ "điều cuối cùng nhận được" có thể khác nhau tùy thuộc vào tốc độ của máy tính và việc xử lý I / O cả bởi nhân và trình điều khiển thiết bị.

Đặc biệt, con người có xu hướng thấy sản lượng chương trình đến trong khối lớn (nguyên tử) khi trong thực tế hầu hết các chương trình sản xuất ra một dòng tại một thời điểm. Giả sử đây là trường hợp, các * trong mẫu của đoạn trước có thể chỉ phù hợp với sự kết thúc của dòng hiện tại mặc dù có vẻ là nhiều hơn, bởi vì tại thời điểm trận đấu đó là tất cả các đầu ra đã được nhận.

mong đợi không có cách nào để biết rằng đầu ra tiếp theo sẽ đến trừ khi mô hình của bạn đặc biệt giải thích cho nó.

Thậm chí tùy thuộc vào bộ đệm định hướng dòng là không khôn ngoan. Không chỉ các chương trình hiếm khi đưa ra lời hứa về kiểu đệm mà chúng làm, nhưng sự khó tiêu của hệ thống có thể phá vỡ các dòng đầu ra để các đường đứt đoạn tại các vị trí dường như ngẫu nhiên. Vì vậy, nếu bạn có thể diễn tả một vài ký tự cuối cùng của dấu nhắc khi viết mẫu, bạn nên làm như vậy.

Nếu bạn đang chờ đợi một mẫu trong đầu ra cuối cùng của một chương trình và chương trình phát ra một cái gì đó khác thay vào đó, bạn sẽ không thể phát hiện ra rằng với từ khóa timeout . Lý do là mong đợi sẽ không hết thời gian - thay vào đó nó sẽ nhận được một dấu hiệu eof . Sử dụng thay vào đó. Thậm chí tốt hơn, sử dụng cả hai. Bằng cách đó, nếu dòng đó được di chuyển xung quanh, bạn sẽ không phải chỉnh sửa chính dòng đó.

Các dòng mới thường được chuyển đổi thành các dòng vận chuyển, dòng cấp dữ liệu khi đầu ra của trình điều khiển thiết bị đầu cuối. Do đó, nếu bạn muốn một mẫu phù hợp rõ ràng với hai dòng, từ, ví dụ, printf ("foo \ nbar"), bạn nên sử dụng mẫu "foo \ r \ nbar".

Một bản dịch tương tự xảy ra khi đọc từ người dùng, qua expect_user . Trong trường hợp này, khi bạn nhấn trở lại, nó sẽ được dịch sang một dòng mới. Nếu kỳ vọng sau đó vượt qua đó để một chương trình mà thiết lập thiết bị đầu cuối của nó để chế độ thô (như telnet), sẽ có một vấn đề, như chương trình mong đợi một sự trở lại thực sự. (Một số chương trình thực sự tha thứ ở chỗ chúng sẽ tự động dịch các dòng mới để trả về, nhưng hầu hết là không.) Thật không may, không có cách nào để tìm ra rằng một chương trình đặt đầu cuối của nó vào chế độ thô.

Thay vì thay thế dòng mới bằng cách thủ công bằng cách trả về, giải pháp là sử dụng lệnh "stty raw", điều này sẽ ngừng dịch. Tuy nhiên, lưu ý rằng điều này có nghĩa là bạn sẽ không còn nhận được các tính năng chỉnh sửa đường đã nấu nữa.

tương tác ngầm đặt thiết bị đầu cuối của bạn thành chế độ thô nên vấn đề này sẽ không phát sinh sau đó.

Nó thường hữu ích để lưu trữ mật khẩu (hoặc thông tin cá nhân khác) trong kịch bản Mong đợi . Điều này không được khuyến cáo vì bất kỳ thứ gì được lưu trữ trên máy tính đều dễ bị truy cập bởi bất kỳ ai. Do đó, việc nhắc mật khẩu tương tác từ tập lệnh là một ý tưởng thông minh hơn là nhúng chúng theo nghĩa đen. Tuy nhiên, đôi khi nhúng như vậy là khả năng duy nhất.

Thật không may, hệ thống tệp UNIX không có cách trực tiếp để tạo tập lệnh có thể thực thi được nhưng không đọc được. Các hệ thống hỗ trợ các tập lệnh shell setgid có thể gián tiếp mô phỏng điều này như sau:

Tạo tập lệnh Mong đợi (có chứa dữ liệu bí mật) như thường lệ. Quyền của nó là 750 (-rwxr-x ---) và thuộc sở hữu của một nhóm đáng tin cậy, tức là một nhóm được phép đọc nó. Nếu cần, hãy tạo một nhóm mới cho mục đích này. Tiếp theo, tạo một tập lệnh / bin / sh với quyền 2751 (-rwxr-s - x) thuộc sở hữu của cùng một nhóm như trước.

Kết quả là một tập lệnh có thể được thực thi (và đọc) bởi bất kỳ ai. Khi được gọi, nó chạy tập lệnh Expect .

& # 34; XEM CSONG & # 34;

Tcl (3), libexpect (3)
"Khám phá kỳ vọng: Bộ công cụ dựa trên Tcl để tự động hóa các chương trình tương tác" của Don Libes, trang 602, ISBN 1-56592-090-2, O'Reilly và cộng sự, 1995.
"mong đợi: Bảo dưỡng những sự tương tác không thể kiểm soát tương tác" của Don Libes, Kỷ yếu Hội nghị USENIX mùa hè 1990, Anaheim, California, ngày 11-15 tháng 6 năm 1990.
.I "Sử dụng mong đợi để tự động hóa các nhiệm vụ quản trị hệ thống" của Don Libes, Kỷ yếu Hội nghị quản trị hệ thống cài đặt USENIX 1990, Colorado Springs, Colorado, ngày 17-19 / 10/1990.
.I "Tcl: Ngôn ngữ lệnh có thể nhúng" của John Ousterhout, Kỷ yếu Hội nghị USENIX mùa đông 1990, Washington, DC, ngày 22-26 tháng 1 năm 1990..Tôi mong đợi: Các kịch bản để kiểm soát các chương trình tương tác "của Don Libes, Computing Systems , Vol. 4, số 2, Tạp chí Báo chí của Đại học California, tháng 11 năm 1991 .. Tôi "Kiểm tra hồi quy và các chương trình tương tác thử nghiệm tương thích", bởi Don Libes, Kỷ yếu Hội nghị USENIX 1992, trang 135-144, San Antonio, TX, 12-15 tháng 6, 1992 .. Tôi "Kibitz - Kết nối nhiều chương trình tương tác với nhau", bởi Don Libes, Phần mềm - Thực hành & Kinh nghiệm, John Wiley & Sons, West Sussex, Anh, Vol.

23, No. 5, May, 1993..I "Một Debugger cho các ứng dụng Tcl", bởi Don Libes, Kỷ yếu của Hội thảo Tcl / Tk năm 1993, Berkeley, CA, ngày 10-11 tháng 6 năm 1993.

AUTHOR

Don Libes, Viện Tiêu chuẩn và Công nghệ Quốc gia

LỜI CẢM ƠN

Nhờ có John Ousterhout cho Tcl, và Scott Paisley cho cảm hứng. Nhờ Rob Savoye cho mã tự động cấu hình của Expect.

Các tập tin HISTORY tài liệu nhiều sự phát triển của mong đợi . Nó làm cho đọc thú vị và có thể cung cấp cho bạn cái nhìn sâu sắc hơn cho phần mềm này. Nhờ những người được đề cập trong đó, những người đã gửi cho tôi các bản sửa lỗi và đã hỗ trợ khác.

Thiết kế và triển khai Dự kiến ​​đã được trả một phần bởi chính phủ Hoa Kỳ và do đó thuộc phạm vi công cộng. Tuy nhiên, tác giả và NIST sẽ thích tín dụng nếu chương trình và tài liệu này hoặc một phần của chúng được sử dụng.