Skip to main content

คาดหวังให้คำแนะนำและตัวอย่างคำสั่งของ Linux / Unix

Writing 2D Games in C using SDL by Thomas Lively (มิถุนายน 2026)

Writing 2D Games in C using SDL by Thomas Lively (มิถุนายน 2026)
Anonim

Expect คือโปรแกรมที่พูดถึงโปรแกรมโต้ตอบอื่น ๆ ตามสคริปต์ หลังจากที่สคริปต์คาดว่าจะรู้ว่าสิ่งที่คาดหวังจากโปรแกรมและสิ่งที่ควรได้รับการตอบสนองที่ถูกต้อง ภาษาที่ตีความจะมีโครงสร้างการควบคุมสาขาและระดับสูงในการกำหนดกรอบโต้ตอบ นอกจากนี้ผู้ใช้สามารถควบคุมและโต้ตอบโดยตรงได้เมื่อต้องการจากนั้นกลับไปควบคุมสคริปต์

Expectk เป็นส่วนผสมของ Expect และ Tk มันมีลักษณะเหมือน Expect และ Tk's ปรารถนา Expect สามารถใช้งานได้โดยตรงใน C หรือ C ++ โดยไม่มี Tcl

ชื่อ "คาดหวัง" มาจากแนวคิดการส่ง / คาดหวังลำดับที่นิยมโดย uucp, kermit และโปรแกรมควบคุมโมเด็มอื่น ๆ อย่างไรก็ตามไม่เหมือน uucp คาดว่าจะเป็นแบบ generalised เพื่อให้สามารถรันเป็นคำสั่งระดับผู้ใช้กับโปรแกรมและงานต่างๆได้ คาดว่าจะสามารถพูดคุยกับหลายโปรแกรมในเวลาเดียวกัน

สิ่งที่คาดหวังได้

ตัวอย่างเช่นนี่คือบางสิ่งที่คำสั่งคาดหวังสามารถทำได้:

  • ทำให้คอมพิวเตอร์ของคุณโทรกลับเพื่อให้คุณสามารถเข้าสู่ระบบได้โดยไม่ต้องเสียค่าโทร
  • เริ่มเกมและหากการกำหนดค่าที่เหมาะสมไม่ปรากฏขึ้นให้เริ่มต้นใหม่อีกครั้งและอีกครั้ง) จนกว่าจะมีการส่งมอบแล้วส่งมอบการควบคุมให้กับคุณ
  • เรียกใช้ fsck และในการตอบคำถามของคำตอบ "ใช่" หรือ "ไม่" หรือให้การควบคุมกลับไปหาคุณตามเกณฑ์ที่กำหนดไว้
  • เชื่อมต่อกับเครือข่ายอื่นและเรียกดูจดหมายของคุณโดยอัตโนมัติเพื่อให้ดูเหมือนว่าระบบเดิมของคุณถูกส่งไปยังระบบภายในของคุณ
  • ดำเนินการตัวแปรสภาพแวดล้อมไดเร็กทอรีปัจจุบันหรือข้อมูลใด ๆ ใน rlogin, telnet, tip, su หรือ chgrp

มีสาเหตุหลายประการที่เปลือกไม่สามารถปฏิบัติงานเหล่านี้ได้ ทั้งหมดนี้เป็นไปได้ด้วย Expect

โดยทั่วไป Expect จะเป็นประโยชน์สำหรับการเรียกใช้โปรแกรมใด ๆ ที่ต้องการการโต้ตอบระหว่างโปรแกรมกับผู้ใช้ สิ่งที่จำเป็นคือปฏิสัมพันธ์สามารถระบุได้ทางโปรแกรม คาดหวังยังสามารถให้การควบคุมกลับไปยังผู้ใช้โดยไม่หยุดชะงักโปรแกรมที่ถูกควบคุม ในทำนองเดียวกันผู้ใช้สามารถกลับการควบคุมสคริปต์ได้ตลอดเวลา

การใช้

คาดว่าจะอ่าน cmdfile สำหรับรายการคำสั่งที่จะรัน คาดหวังว่าจะสามารถเรียกใช้โดยปริยายในระบบที่สนับสนุน #! สัญกรณ์โดยการทำเครื่องหมายสคริปต์เป็นไฟล์ปฏิบัติการและทำบรรทัดแรกในสคริปต์:

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

แน่นอนเส้นทางต้องบรรยายถึงสิ่งที่คาดว่าจะมีชีวิตอยู่ / usr / local / bin เป็นเพียงตัวอย่างเท่านั้น

ธง -c จะนำคำสั่งไปใช้ก่อนที่จะใช้ในสคริปต์ คำสั่งควรถูกยกมาเพื่อป้องกันไม่ให้ถูกทำลายโดยเปลือก ตัวเลือกนี้อาจใช้หลายครั้ง คำสั่งหลายคำอาจทำงานด้วย single -c โดยการแยกด้วยเครื่องหมายอัฒภาค คำสั่งจะถูกดำเนินการตามลำดับที่ปรากฏ เมื่อใช้ Expectk ตัวเลือกนี้จะถูกระบุเป็น -command

ค่าสถานะ -d ช่วยให้สามารถตรวจจับการวินิจฉัยได้ซึ่งส่วนใหญ่รายงานถึงกิจกรรมภายในของคำสั่งต่างๆเช่นคาดหวังและโต้ตอบ ธงนี้มีลักษณะเช่นเดียวกับ "exp_internal 1" ที่จุดเริ่มต้นของสคริปต์ Expect พร้อมด้วยพิมพ์ Expect

ธง -D ช่วยให้ดีบักแบบโต้ตอบ ค่าจำนวนเต็มควรเป็นไปตาม ตัวดีบักจะควบคุมก่อนขั้นตอน Tcl ถัดไปถ้าค่าไม่เป็นศูนย์หรือถ้ากดปุ่ม ^ C หรือจุดหยุดทำงานหรือคำสั่งดีบักเกอร์ที่เหมาะสมอื่น ๆ จะปรากฏในสคริปต์ เมื่อใช้ Expectk ตัวเลือกนี้จะระบุเป็น -ตรวจแก้จุดบกพร่อง

ธง f จะนำไฟล์มาอ่านคำสั่ง ธงตัวเองเป็นตัวเลือกเนื่องจากเป็นประโยชน์เฉพาะเมื่อใช้ #! สัญกรณ์ดังนั้นอาร์กิวเมนต์อื่น ๆ อาจถูกจัดเตรียมไว้ในบรรทัดคำสั่ง เมื่อใช้ Expectk ตัวเลือกนี้จะถูกระบุเป็น -file

แฟ้มคำสั่งจะถูกอ่านลงในหน่วยความจำและดำเนินการอย่างครบถ้วน บางครั้งก็ควรอ่านไฟล์ทีละบรรทัด เพื่อที่จะบังคับให้ไฟล์ใด ๆ ได้รับการจัดการด้วยวิธีนี้ให้ใช้ค่าสถานะ -b เมื่อใช้ Expectk ตัวเลือกนี้จะถูกระบุเป็น -buffer

ถ้าสตริง "-" ระบุเป็นชื่อไฟล์จะมีการอ่านข้อมูลมาตรฐานแทน ใช้ "./-" เพื่ออ่านจากแฟ้มที่มีชื่อว่า "-"

สาเหตุ -i ทำให้ Expect โต้ตอบโต้ตอบสำหรับคำสั่งแทนการอ่านจากไฟล์ การแจ้งเตือนถูกยกเลิกโดยใช้คำสั่ง exit หรือเมื่อ EOF -i-flag จะสันนิษฐานถ้าไม่มีใช้ไฟล์คำสั่งหรือ -c เมื่อใช้ Expectk ตัวเลือกนี้จะถูกระบุเป็น -interactive

- อาจถูกใช้เพื่อกำหนดค่าตัวเลือกท้ายสุด วิธีนี้จะเป็นประโยชน์ถ้าคุณต้องการส่งอาร์กิวเมนต์ตัวเลือกให้กับสคริปต์ของคุณโดยไม่ได้ถูกแปลโดย Expect นี้จะมีประโยชน์ใน #! line เพื่อป้องกันการตีความที่ไม่เหมือนใครโดย Expect ตัวอย่างเช่นต่อไปนี้จะปล่อยอาร์กิวเมนต์เดิมรวมถึงชื่อสคริปต์ในตัวแปร argv .

#! / usr / local / bin / expect -

โปรดทราบว่าต้องใช้ข้อตกลง getopt (3) และ execve (2) ตามปกติเมื่อเพิ่มอาร์กิวเมนต์ลงใน #! เส้น

ไฟล์ $ exp_library / expect.rc มีอยู่โดยอัตโนมัติหากมีอยู่เว้นแต่จะมีการใช้ค่าสถานะ -N (เมื่อใช้ Expectk ตัวเลือกนี้จะระบุเป็น -NORC) ทันทีหลังจากนี้ไฟล์ ~ / .expect.rc จะได้รับการประมวลผลโดยอัตโนมัติเว้นแต่จะมีการใช้งาน -n flag ไว้ ถ้ามีการกำหนดตัวแปร DOTDIR สภาพแวดล้อมตัวแปรจะถือว่าเป็นไดเร็กทอรีและอ่าน. expect.rc จากที่นั่น เมื่อใช้ Expectk ตัวเลือกนี้จะระบุเป็น -norcการจัดหานี้เกิดขึ้นเฉพาะหลังจากดำเนินการแฟล็กใด ๆ -c

สาเหตุที่คาดว่าจะพิมพ์หมายเลขเวอร์ชันและออก ธงที่เกี่ยวข้องใน Expectk ซึ่งใช้ชื่อธงแบบยาวคือ --version

อาร์กิวเมนต์ตัวเลือกถูกสร้างขึ้นในรายการและเก็บไว้ในตัวแปรชื่อ argv และ argc ถูกเตรียมใช้งานตามความยาวของ argv

Argv0 ถูกกำหนดให้เป็นชื่อของสคริปต์หรือไบนารีหากไม่มีสคริปต์ถูกใช้ ตัวอย่างเช่นต่อไปนี้จะพิมพ์ชื่อของสคริปต์และอาร์กิวเมนต์สามตัวแรก:

send_user "$ argv0 lrange $ argv 0 2 n"

คำสั่ง

Expect ใช้ Tool Command Language Tcl ให้การควบคุมการไหล (ถ้า, สำหรับ, ทำลาย), การประเมินผลการแสดงออกและคุณสมบัติอื่น ๆ เช่น recursionand ขั้นตอนคำจำกัดความ คำสั่งที่ใช้ที่นี่ แต่ไม่ได้กำหนดไว้ (set, if, exec) เป็นคำสั่ง Tcl Expect รองรับคำสั่งเพิ่มเติม ถ้าไม่ได้ระบุไว้เป็นอย่างอื่นคำสั่งจะส่งคืนสตริงที่ว่างเปล่า

คำสั่งจะเรียงลำดับตามตัวอักษรเพื่อให้สามารถตั้งได้อย่างรวดเร็ว อย่างไรก็ตามผู้ใช้รายใหม่อาจเริ่มต้นได้ง่ายขึ้นโดยอ่านคำอธิบายเกี่ยวกับการวางไข่ส่งคาดหวังและโต้ตอบในลำดับดังกล่าว

ปิด -slave -onexec 0 | 1 -i spawn_id

ปิดการเชื่อมต่อกับกระบวนการปัจจุบัน โปรแกรมโต้ตอบส่วนใหญ่จะตรวจจับ EOF บน stdin และ exit; ดังนั้น ปิด ปกติพอเพียงที่จะฆ่ากระบวนการเช่นกัน ธง -i ประกาศกระบวนการที่จะปิดสอดคล้องกับชื่อ spawn_id

ทั้งสองคาดหวังและมีปฏิสัมพันธ์จะตรวจพบเมื่อกระบวนการปัจจุบันออกมาและปิดบังไว้โดยปริยาย แต่ถ้าคุณฆ่ากระบวนการโดยกล่าวว่า "exec kill $ pid" คุณต้องติดต่ออย่างใกล้ชิด.

ธง -onexec กำหนดว่าจะวางรหัสวางไข่ไว้ในกระบวนการที่เกิดใหม่หรือถ้ากระบวนการนี้ซ้อนทับ หากต้องการปล่อยรหัสวางไข่ให้เปิดใช้ค่า 0. ค่าจำนวนเต็มที่ไม่ใช่ศูนย์บังคับให้วางไข่ปิดลงในกระบวนการใหม่ ๆ

ธงสไลลาจะปิดทาสที่เชื่อมโยงกับรหัสวางไข่ เมื่อปิดการเชื่อมต่อทาสจะปิดโดยอัตโนมัติหากยังเปิดอยู่

ไม่ว่าการเชื่อมต่อจะปิดโดยปริยายหรืออย่างชัดเจนคุณควรเรียกใช้เพื่อรอให้ชัดเจนขึ้นช่องกระบวนการเคอร์เนลที่สอดคล้องกัน คำสั่ง close ไม่เรียกรอเนื่องจากไม่มีการรับประกันว่าการปิดการเชื่อมต่อกระบวนการจะทำให้ออกไป

debug now 0 | 1

ควบคุมดีบัก Tcl ช่วยให้คุณสามารถก้าวผ่านงบและตั้งค่าจุดสั่งหยุด

ไม่มีอาร์กิวเมนต์ 1 จะถูกส่งกลับถ้าดีบักเกอร์ไม่ทำงานมิฉะนั้น 0 จะถูกส่งกลับ

ด้วยอาร์กิวเมนต์ที่ 1 เริ่มต้นดีบักเกอร์ ด้วยอาร์กิวเมนต์ 0 ดีบั๊กจะหยุดลง ถ้าอาร์กิวเมนต์ 1 ถูกนำหน้าด้วยแฟล็ก now, debugger จะเริ่มทำงานทันที มิฉะนั้นดีบักเกอร์จะเริ่มต้นด้วยคำสั่ง Tcl ถัดไป

คำสั่งแก้ปัญหาจะไม่เปลี่ยนกับดักใด ๆ เปรียบเทียบนี้เพื่อเริ่มต้นคาดหวังกับธง -D

คำสั่ง disconnect disconnects กระบวนการ forked จาก terminal. มันยังคงทำงานอยู่เบื้องหลัง กระบวนการนี้จะมีกลุ่มกระบวนการของตัวเอง มาตรฐาน I / O ถูกเปลี่ยนเส้นทางไปที่ / dev / null

ส่วนต่อไปนี้ใช้ยกเลิกการเชื่อมต่อเพื่อเรียกใช้สคริปต์ต่อในพื้นหลัง

ถ้า {fork! = 0} ออกจากการเชื่อมต่อ . .

สคริปต์ต่อไปนี้อ่านรหัสผ่านและเรียกใช้โปรแกรมทุกๆชั่วโมงที่ต้องการรหัสผ่านในแต่ละครั้งที่มีการเรียกใช้ สคริปต์มีรหัสผ่านเพื่อให้คุณต้องพิมพ์เพียงครั้งเดียวเท่านั้น

send_user "password? " expect_user -re "(. *) n" สำหรับ {} 1 {} {if {fork! = 0} {sleep 3600; continue} ยกเลิกการวางไข่ priv_prog expect รหัสผ่าน: ส่ง "$ expect_out ( 1 สตริง) r " . . ออก}

ข้อดีของการยกเลิกการเชื่อมต่อกับคุณลักษณะของอะซิงโครนัสของเชลล์ (&) คือ Expect สามารถบันทึกพารามิเตอร์เทอร์มินัลก่อนตัดการเชื่อมต่อและนำไปใช้กับ ptys ใหม่ได้ ด้วย &, Expect ไม่มีโอกาสอ่านค่าพารามิเตอร์ของเทอร์มินัลเนื่องจากเทอร์มินอลถูกยกเลิกการเชื่อมต่อตามเวลาที่คาดว่าจะได้รับการควบคุม

ออก -opts สถานะ

สาเหตุคาดว่าจะออกหรือเตรียมทำเช่นนั้น

-onexit ธงทำให้อาร์กิวเมนต์ถัดไปถูกใช้เป็นตัวจัดการทางออก ไม่มีอาร์กิวเมนต์ตัวจัดการทางออกปัจจุบันจะถูกส่งกลับ

-ไม่มีทางออก สาเหตุธง คาดหวัง เพื่อเตรียมพร้อมในการออกจากระบบ แต่หยุดการทำงานของระบบปฏิบัติการจริง ตัวจัดการการดำเนินการออกจากผู้ใช้ที่กำหนดไว้จะทำงานเหมือนกับตัวจัดการภายในของ Expect เอง ไม่ควรดำเนินการคำสั่ง Expect เพิ่มเติม นี้จะเป็นประโยชน์ถ้าคุณกำลังเรียกใช้คาดว่าจะมีส่วนขยาย Tcl อื่น ๆ ล่ามปัจจุบัน (และหน้าต่างหลักถ้าอยู่ในสภาพแวดล้อม Tk) ยังคงอยู่เพื่อให้ส่วนขยาย Tcl อื่นสามารถล้างข้อมูลได้ ถ้าคาดหวัง ทางออก เรียกอีกครั้ง (อย่างไรก็ตามอาจเกิดขึ้นได้) ตัวดำเนินการจะไม่เรียกใช้อีกครั้ง

เมื่อออกจากการเชื่อมต่อกับกระบวนการสืบพันธุ์จะถูกปิด การปิดจะถูกตรวจพบเป็น EOF โดยกระบวนการที่เกิดขึ้น ทางออก จะไม่มีการกระทำอื่นใดนอกเหนือจากที่ปกติ _exit (2) ทำ ดังนั้นกระบอกไม้ไผ่กระบวนการที่ไม่ได้ตรวจสอบสำหรับ EOF อาจทำงานต่อไป (เงื่อนไขต่าง ๆ มีความสำคัญต่อการพิจารณาตัวอย่างเช่นสิ่งที่ส่งสัญญาณว่ากระบวนการที่เกิดขึ้นจะถูกส่งไปหรือไม่ แต่ระบบเหล่านี้ขึ้นอยู่กับระบบโดยทั่วไปจะมีการบันทึกไว้ภายใต้ exit (3)) กระบวนการที่เรียกว่า spawned จะถูกสืบทอดมาโดย init

สถานะ (หรือ 0 หากไม่ได้ระบุ) จะถูกส่งกลับเป็นสถานะการออกจาก คาดหวัง . ทางออก จะดำเนินการโดยปริยายถ้าสิ้นสุดสคริปต์

exp_continue -continue_timer

คำสั่ง exp_continue ช่วยให้ คาดหวัง ตัวเองเพื่อดำเนินการต่อไปแทนที่จะกลับมาเหมือนปกติ โดยค่าเริ่มต้น exp_continue ตั้งเวลาจับเวลาหมดเวลา -continue_timer ธงป้องกันไม่ให้ตัวตั้งเวลาเริ่มต้นใหม่ (ดู คาดหวัง สำหรับข้อมูลเพิ่มเติม.)

ค่า exp_internal -ffile

ทำให้เกิดคำสั่งเพิ่มเติมเพื่อส่งข้อมูลการวินิจฉัยไปยังภายใน คาดหวัง เพื่อ stderr ถ้า ราคา ไม่ใช่ศูนย์ เอาท์พุทนี้ถูกปิดใช้งานถ้า ราคา คือ 0 ข้อมูลการวินิจฉัยประกอบด้วยอักขระทุกตัวที่ได้รับและความพยายามทุกอย่างที่ทำเพื่อให้ตรงกับผลลัพธ์ปัจจุบันกับรูปแบบ

หากเป็นอุปกรณ์เสริม ไฟล์ มีการจัดเตรียมเอาท์พุทปกติและการแก้จุดบกพร่องทั้งหมดจะถูกเขียนลงในไฟล์นั้น (ไม่คำนึงถึงค่าของ ราคา ) แฟ้มผลลัพธ์การวินิจฉัยก่อนหน้านี้ถูกปิด

-ข้อมูล flag ทำให้ exp_internal เพื่อส่งคำอธิบายอาร์กิวเมนต์ที่ไม่ใช่ข้อมูลล่าสุดที่ได้รับ

exp_open args -i spawn_id

ส่งกลับตัวระบุไฟล์ Tcl ที่ตรงกับรหัสวางไข่เดิม ตัวระบุไฟล์สามารถใช้งานได้เหมือนกับที่เปิดโดย Tcl's เปิด คำสั่ง (รหัสวางไข่ไม่ควรใช้อีกต่อไป A รอ ไม่ควรดำเนินการ

-leaveopen ธงออก id วางไข่เปิดเพื่อเข้าถึงผ่านคำสั่ง Expect รอ ต้องดำเนินการกับรหัสวางไข่

exp_pid -i spawn_id

ส่งกลับรหัสกระบวนการที่สอดคล้องกับกระบวนการที่เกิดขึ้นในปัจจุบัน ถ้า -ผม flag จะใช้ pid ที่ส่งกลับจะตรงกับรหัสของ spawn id

exp_send

เป็นนามแฝงสำหรับ ส่ง .

exp_send_error

เป็นนามแฝงสำหรับ send_error .

exp_send_log

เป็นนามแฝงสำหรับ send_log .

exp_send_tty

เป็นนามแฝงสำหรับ send_tty .

exp_send_user

เป็นนามแฝงสำหรับ send_user .

exp_version -exit version

เป็นประโยชน์สำหรับการมั่นใจว่าสคริปต์สามารถทำงานร่วมกับเวอร์ชันปัจจุบันของ Expect ได้

ไม่มีอาร์กิวเมนต์เวอร์ชันปัจจุบันของ คาดหวัง จะถูกส่งกลับ เวอร์ชันนี้อาจถูกเข้ารหัสในสคริปต์ของคุณ ถ้าคุณรู้จริงว่าคุณไม่ได้ใช้คุณลักษณะของเวอร์ชันล่าสุดคุณสามารถระบุเวอร์ชันก่อนหน้าได้

รุ่นประกอบด้วยสามตัวเลขที่คั่นด้วยจุด อันดับแรกคือจำนวนที่สำคัญ สคริปต์ที่เขียนขึ้นสำหรับเวอร์ชันของ คาดหวัง กับตัวเลขหลักที่แตกต่างกันเกือบจะไม่ทำงานแน่นอน exp_version ส่งกลับข้อผิดพลาดหากตัวเลขหลักไม่ตรงกัน

ประการที่สองคือตัวเลขรอง สคริปต์ที่เขียนขึ้นสำหรับเวอร์ชันที่มีจำนวนน้อยกว่าเวอร์ชันปัจจุบันอาจขึ้นอยู่กับคุณลักษณะใหม่ ๆ และอาจไม่ทำงาน exp_version ส่งกลับค่าข้อผิดพลาดหากหมายเลขหลักตรงกัน แต่ตัวเลขรองสคริปต์มีค่ามากกว่าจำนวนที่เรียกใช้ คาดหวัง .

ประการที่สามคือจำนวนที่ไม่มีส่วนใดในการเปรียบเทียบเวอร์ชัน อย่างไรก็ตามจะเพิ่มขึ้นเมื่อ คาดหวัง การกระจายซอฟต์แวร์มีการเปลี่ยนแปลงในทางใด ๆ เช่นโดยเอกสารเพิ่มเติมหรือการเพิ่มประสิทธิภาพ จะมีการรีเซ็ตเป็น 0 สำหรับแต่ละรุ่นใหม่

กับ ทางออก ธง, คาดหวัง พิมพ์ข้อผิดพลาดและออกถ้าเวอร์ชันล้าสมัย

คาดว่า -opts pat1 body1 … -opts patn bodyn

รอจนกว่ารูปแบบใดรูปแบบหนึ่งจะตรงกับผลลัพธ์ของกระบวนการที่พลิกกลับช่วงเวลาที่ระบุได้ผ่านไปแล้วหรือเห็นไฟล์สิ้นสุดลง ถ้าร่างกายสุดท้ายว่างเปล่าอาจถูกละไว้

รูปแบบจากล่าสุด expect_before คำสั่งจะถูกใช้โดยปริยายก่อนรูปแบบอื่น ๆ รูปแบบจากล่าสุด expect_after คำสั่งจะถูกใช้โดยปริยายหลังจากที่มีรูปแบบอื่น ๆ

ถ้าอาร์กิวเมนต์ทั้งหมด คาดหวัง ต้องมีมากกว่าหนึ่งบรรทัดอาร์กิวเมนต์ทั้งหมดอาจถูก "ยึด" ไว้เพื่อหลีกเลี่ยงการยกเลิกแต่ละบรรทัดด้วยเครื่องหมายทับขวา ในกรณีนี้การแทนที่ Tcl ตามปกติจะเกิดขึ้นแม้จะมีวงเล็บปีกกา

หากรูปแบบเป็นคำหลัก EOF , ร่างกายที่สอดคล้องกันจะถูกดำเนินการเมื่อสิ้นสุดของแฟ้ม หากรูปแบบเป็นคำหลัก หมดเวลา , ร่างกายที่สอดคล้องกันจะถูกดำเนินการเมื่อหมดเวลา หากไม่มีการใช้คำหลัก timeout คำว่า null action จะดำเนินการเมื่อหมดเวลา ระยะหมดเวลาเริ่มต้นคือ 10 วินาที แต่อาจตั้งค่าได้เช่น 30 โดยใช้คำสั่ง "set outout 30" การหมดเวลา infinite สามารถกำหนดโดยค่า -1 หากรูปแบบเป็นคำหลัก ค่าเริ่มต้น , ตัวที่เกี่ยวข้องจะถูกดำเนินการเมื่อหมดเวลาหรือสิ้นสุดของแฟ้ม

ถ้ารูปแบบตรงกับตัวทำนองเดียวกัน คาดหวัง ส่งกลับผลลัพธ์ของเนื้อความ (หรือสตริงที่ว่างเปล่าถ้าไม่มีรูปแบบตรง) ในกรณีที่มีรูปแบบหลายรูปแบบที่ตรงกันรูปแบบที่ปรากฏขึ้นก่อนจะใช้เพื่อเลือกเนื้อหา

ทุกครั้งที่มีการส่งออกใหม่จะได้รับการเปรียบเทียบกับแต่ละรูปแบบตามลำดับที่ระบุไว้ ดังนั้นคุณอาจทดสอบเพื่อไม่ให้มีการจับคู่โดยการทำให้รูปแบบบางอย่างที่ผ่านมามีการรับประกันว่าจะปรากฏเช่นข้อความแจ้ง ในกรณีที่ไม่มีพรอมต์คุณต้องใช้ หมดเวลา (เช่นเดียวกับที่คุณทำถ้าคุณโต้ตอบด้วยตนเอง)

รูปแบบถูกระบุด้วยสามวิธี โดยค่าเริ่มต้นรูปแบบจะระบุตามด้วย Tcl's สตริงการจับคู่ คำสั่ง (รูปแบบดังกล่าวยังคล้ายกับการแสดงผลปกติของ C-shell ซึ่งมักเรียกว่า "glob") -gl ธงอาจถูกนำมาใช้เพื่อป้องกันรูปแบบที่อาจตรงกัน คาดหวัง ธงจากการทำเช่นนั้น รูปแบบที่ขึ้นต้นด้วย "-" ควรได้รับการป้องกันด้วยวิธีนี้ (สตริงทั้งหมดที่ขึ้นต้นด้วย "-" สงวนไว้สำหรับตัวเลือกในอนาคต)

ตัวอย่างเช่นส่วนต่อไปนี้จะมองหาการเข้าสู่ระบบที่ประสบความสำเร็จ (โปรดทราบว่า ทำแท้ง ถูกสันนิษฐานว่าเป็นขั้นตอนที่กำหนดไว้ในที่อื่น ๆ ในสคริปต์)

คาดหวัง {busy {ทำให้ยุ่ง n; exp_continue} ล้มเหลวยกเลิก "รหัสผ่านที่ไม่ถูกต้อง" ยกเลิกการหมดเวลายกเลิกการเชื่อมต่อ}

คำพูดเป็นสิ่งจำเป็นในรูปแบบที่สี่เนื่องจากมีช่องว่างซึ่งจะแยกรูปแบบออกจากการทำงานรูปแบบที่มีการดำเนินการเดียวกัน (เช่น 3 และ 4) จำเป็นต้องมีการแสดงการดำเนินการอีกครั้ง ซึ่งสามารถหลีกเลี่ยงได้โดยใช้รูปแบบ regexp (ดูด้านล่าง) ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบของรูปแบบโลกสามารถดูได้จากคู่มือ Tcl

รูปแบบ Regexp เป็นไปตามไวยากรณ์ที่ Tcl กำหนด regexp (ย่อมาจาก "นิพจน์ทั่วไป") คำสั่ง รูปแบบ regexp นำมาใช้กับธง -re . ตัวอย่างก่อนหน้านี้สามารถเขียนใหม่โดยใช้ regexp เป็น:

คาดหวัง {busy {ทำให้ยุ่ง n; exp_continue} -re "ล้มเหลว | รหัสผ่านไม่ถูกต้อง" ยกเลิกการหมดเวลายกเลิกการเชื่อมต่อ}

ทั้งสองรูปแบบคือ "unanchored" ซึ่งหมายความว่ารูปแบบไม่ต้องตรงกับสตริงทั้งหมด แต่สามารถเริ่มต้นและสิ้นสุดการจับคู่ได้ทุกที่ในสตริง (ตราบเท่าที่ทุกอย่างตรงกับ) ใช้ ^ เพื่อจับคู่จุดเริ่มต้นของสตริงและ $ เพื่อให้ตรงกับจุดสิ้นสุด โปรดทราบว่าถ้าคุณไม่รอให้สตริงจบการตอบสนองของคุณจะจบลงตรงกลางของสตริงเพราะจะมีการสะท้อนออกมาจากกระบวนการที่เกิดขึ้น ในขณะที่ยังให้ผลลัพธ์ที่ถูกต้องเอาต์พุตอาจดูผิดปกติ ดังนั้นการใช้ $ เป็นกำลังใจถ้าคุณสามารถอธิบายตัวอักษรที่ท้ายสตริงได้

โปรดทราบว่าในบรรณาธิการจำนวนมาก ^ และ $ ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของบรรทัดตามลำดับ อย่างไรก็ตามเนื่องจากคาดว่าจะไม่ได้เป็นเส้นตรงอักขระเหล่านี้จะตรงกับจุดเริ่มต้นและจุดสิ้นสุดของข้อมูล (ในทางตรงข้ามกับเส้น) ปัจจุบันอยู่ในบัฟเฟอร์การจับคู่คาดหวัง (โปรดดูหมายเหตุด้านล่างเกี่ยวกับ "การไม่ย่อยของระบบ")

-Ex ธงทำให้รูปแบบที่จะจับคู่เป็นสตริง "แน่นอน" ทำไม่ได้การตีความของ *, ^, ฯลฯ (แม้ว่าจะต้องมีการปฏิบัติตามอนุสัญญา Tcl ตามปกติ) รูปแบบที่แน่นอนไม่มีการเปลี่ยนแปลง

-nocase flag ทำให้อักขระตัวพิมพ์ใหญ่ของเอาต์พุตสามารถเปรียบเทียบได้เหมือนกับว่าตัวพิมพ์เล็กเป็นตัวพิมพ์เล็ก รูปแบบไม่ได้รับผลกระทบ

ในขณะที่อ่านผลลัพธ์มากกว่า 2,000 ไบต์สามารถบังคับไบต์ก่อนหน้าให้ "ลืม" ได้ ซึ่งอาจมีการเปลี่ยนแปลงด้วยฟังก์ชัน match_max . (โปรดทราบว่าค่าที่มากเกินไปอาจทำให้ตัวจัดรูปแบบช้าลงได้) ถ้า patlist คือ full_buffer , ตัวที่เกี่ยวข้องจะถูกดำเนินการถ้า match_max ไบต์ได้รับและไม่มีรูปแบบอื่น ๆ ที่ตรงกัน หรือไม่ full_buffer คำหลักถูกใช้ตัวอักษรที่ลืมจะถูกเขียนไปยัง expect_out (บัฟเฟอร์)

ถ้า patlist เป็นคำหลัก โมฆะ , และ nulls ได้รับอนุญาต (ผ่าน remove_nulls คำสั่ง) ร่างกายที่สอดคล้องกันจะถูกดำเนินการถ้า ASCII เดียวถูกจับคู่ ไม่สามารถจับคู่ 0 ไบต์ผ่านรูปแบบ glob หรือ regexp

เมื่อจับคู่รูปแบบ (หรือ eof หรือ full_buffer) ผลลัพธ์ที่ตรงกันและไม่ตรงกันก่อนหน้านี้จะถูกบันทึกไว้ในตัวแปร expect_out (กันชน) . สามารถจับคู่สตาร์ทอาร์เรย์ regexp ได้สูงสุด 9 รายการในตัวแปร expect_out (1, สตริง) ตลอด expect_out (9, สตริง) . ถ้า -indices ธงใช้ก่อนรูปแบบดัชนีเริ่มต้นและสิ้นสุด (ในรูปแบบที่เหมาะสมสำหรับ lrange ) ของ 10 สตริงจะถูกเก็บไว้ในตัวแปร expect_out (X เริ่มต้น) และ expect_out (x, จบ) โดยที่ X เป็นตัวเลขตรงกับตำแหน่งสตริงในบัฟเฟอร์ 0 หมายถึงสตริงที่ตรงกับรูปแบบทั้งหมดและถูกสร้างขึ้นสำหรับรูปแบบของโลกรวมถึงรูปแบบ regexp ตัวอย่างเช่นถ้ากระบวนการผลิตผลลัพธ์ของ "abcdefgh n" ผลลัพธ์ของ:

คาดว่า "cd"

เป็นถ้างบต่อไปนี้ได้ดำเนินการ:

ตั้งค่า expect_out (0, string) cd set expect_out (buffer) abcd

และ "efgh n" จะถูกทิ้งไว้ในบัฟเฟอร์เอาท์พุท ถ้ากระบวนการผลิตผลลัพธ์ "abbbcabkkkka n" ผลของ:

คาดว่า -indices -re "b (b *). * (k +)"

เป็นถ้างบต่อไปนี้ได้ดำเนินการ:

ตั้ง expect_out (0, start) 1 set expect_out (0, end) 10 set expect_out (0, string) ตั้งค่า expect_out (1, start) 2 set expect_out (1, end) 3 ชุด expect_out (1 สตริง) bb ตั้ง expect_out (2, เริ่มต้น) 10 ชุด expect_out (2, end) 10 ชุด expect_out (2, สตริง) k set expect_out (buffer) abbbcabkkkk

และ "a n" ถูกทิ้งไว้ในบัฟเฟอร์เอาท์พุท รูปแบบ "*" (และ -re ". *") จะล้างบัฟเฟอร์เอาต์พุตโดยไม่ต้องอ่านผลลัพธ์เพิ่มเติมจากกระบวนการ

โดยปกติผลลัพธ์ที่ตรงกันจะถูกทิ้งออกจากบัฟเฟอร์ภายในของ Expect ซึ่งอาจป้องกันได้ด้วยการใช้คำนำหน้ากับรูปแบบ -notransfer ธง. ธงนี้เป็นประโยชน์อย่างยิ่งในการทดลอง (และสามารถอธิบายได้โดยย่อว่า "ไม่" เพื่อความสะดวกในขณะที่ทำการทดลอง)

ระบบจะเก็บรหัสวางไข่ที่เกี่ยวข้องกับผลลัพธ์การจับคู่ (หรือ eof หรือ full_buffer) expect_out (spawn_id) .

-หมดเวลา flag ทำให้คำสั่ง current expect ใช้ค่าต่อไปนี้เป็น timeout แทนการใช้ค่าของตัวแปร timeout

โดยค่าเริ่มต้นรูปแบบจะถูกจับคู่กับผลลัพธ์จากกระบวนการปัจจุบันอย่างไรก็ตาม -ผม flag ประกาศเอาท์พุทจากรายการ spawn_id ที่มีชื่อจะจับคู่กับรูปแบบใด ๆ ต่อไปนี้ (ขึ้นไปข้างหน้า -ผม ) รายการ spawn_id ควรเป็นรายการ spawn_ids ที่แยกกันเป็นช่องว่างหรือตัวแปรที่อ้างถึงรายการ spawn_ids

ตัวอย่างเช่นตัวอย่างต่อไปนี้รอให้ "เชื่อมต่อ" จากกระบวนการปัจจุบันหรือ "ไม่ว่าง", "ล้มเหลว" หรือ "รหัสผ่านไม่ถูกต้อง" จาก spawn_id โดยชื่อ $ proc2

คาดหวังว่า {-i $ proc2 busy {ทำให้ยุ่ง n; exp_continue} -re "ล้มเหลว | รหัสผ่านไม่ถูกต้อง" ยกเลิกการหมดเวลายกเลิกการเชื่อมต่อ}

ค่าของตัวแปรส่วนกลาง any_spawn_id อาจใช้เพื่อจับคู่รูปแบบกับ spawn_ids ใด ๆ ที่มีชื่ออยู่ทั้งหมด -ผม ธงในปัจจุบัน คาดหวัง คำสั่ง spawn_id จาก a -ผม ธงที่ไม่มีรูปแบบที่เกี่ยวข้อง (กล่าวคือตามด้วยอีกคนหนึ่ง -ผม ) จะใช้ได้กับรูปแบบอื่น ๆ ในรูปแบบเดียวกัน คาดหวัง คำสั่งที่เกี่ยวข้อง any_spawn_id

-ผม ธงยังสามารถตั้งชื่อตัวแปรระดับโลกซึ่งในกรณีนี้จะมีการอ่านตัวแปรสำหรับรายการรหัสวางไข่ ตัวแปรจะอ่านซ้ำทุกครั้งที่มีการเปลี่ยนแปลง นี่เป็นวิธีการเปลี่ยนแหล่ง I / O ในขณะที่คำสั่งกำลังทำงานอยู่ รหัสวางไข่ที่ให้มาด้วยวิธีนี้เรียกว่า id โดยกำเนิด "ทางอ้อม"

การกระทำเช่น หยุด และ ต่อ ทำให้โครงสร้างการควบคุม (กล่าวคือ สำหรับ , proc ) จะประพฤติตามปกติ คำสั่ง exp_continue ช่วยให้ คาดหวัง ตัวเองเพื่อดำเนินการต่อไปแทนที่จะกลับมาเหมือนปกติ

วิธีนี้มีประโยชน์ในการหลีกเลี่ยงความซ้ำซ้อนหรือข้อความคาดหวังซ้ำ ๆ ตัวอย่างต่อไปนี้เป็นส่วนหนึ่งของส่วนที่จะทำให้ rlogin ทำงานโดยอัตโนมัติ exp_continue หลีกเลี่ยงการเขียนวินาที คาดหวัง (เพื่อค้นหาพรอมต์อีกครั้ง) ถ้า rlogin พร้อมท์ให้ใส่รหัสผ่าน

คาดว่า {รหัสผ่าน: {stty -echo send_user "รหัสผ่าน (สำหรับ $ user) บน host $:" expect_user -re "(. *) n" send_user " n" ส่ง "$ expect_out (1, string) " stty echo exp_continue} ไม่ถูกต้อง {send_user "รหัสผ่านหรือบัญชีที่ไม่ถูกต้อง n" exit} timeout {send_user "การเชื่อมต่อกับโฮสต์ $ หมดเวลา n" exit} eof {send_user "การเชื่อมต่อไปยังโฮสต์ล้มเหลว: $ expect_out (buffer)" exit} $ prompt}

ตัวอย่างเช่นส่วนต่อไปนี้อาจช่วยให้คู่มือผู้ใช้มีปฏิสัมพันธ์ที่มีอยู่แล้วโดยอัตโนมัติทั้งหมด ในกรณีนี้เทอร์มินัลจะเข้าสู่โหมดดิบ ถ้าผู้ใช้กด "+" ตัวแปรจะเพิ่มขึ้น ถ้ากดปุ่ม "p" ผลตอบแทนหลายรายการจะถูกส่งไปยังกระบวนการนี้อาจจะเป็นการกระตุ้นให้เกิดผลบางอย่างและ "i" ช่วยให้ผู้ใช้โต้ตอบกับกระบวนการนี้ได้อย่างมีประสิทธิภาพและขโมยตัวควบคุมออกจากสคริปต์ได้อย่างมีประสิทธิภาพ ในแต่ละกรณี exp_continue ช่วยให้ปัจจุบัน คาดหวัง เพื่อดำเนินการจับคู่รูปแบบต่อไปหลังจากดำเนินการในปัจจุบัน

stty raw -echo expect_after {-i $ user_spawn_id "p" {send " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "ออกจาก" ออก}

โดยค่าเริ่มต้น, exp_continue ตั้งเวลาจับเวลาหมดเวลา จับเวลาจะไม่เริ่มใหม่ถ้า exp_continue ถูกเรียกด้วย -continue_timer ธง.

expect_after expect_args

ทำงานเหมือนกันกับ expect_before ยกเว้นว่าถ้ารูปแบบจากทั้งสอง คาดหวัง และ expect_after สามารถจับคู่ได้ คาดหวัง ใช้รูปแบบ ดู expect_before คำสั่งสำหรับข้อมูลเพิ่มเติม

expect_background expect_args

ใช้อาร์กิวเมนต์เดียวกับคาดหวัง แต่จะส่งกลับทันที รูปแบบจะได้รับการทดสอบเมื่อมีการป้อนข้อมูลใหม่ รูปแบบหมดเวลา และค่าเริ่มต้น ไม่มีความหมายเลยexpect_background และถูกทิ้งไว้อย่างเงียบ ๆ ไม่เช่นนั้นexpect_background ใช้คำสั่งexpect_before และexpect_after รูปแบบเช่นเดียวกับคาดหวัง ทำ.

เมื่อexpect_background การประมวลผลพื้นหลังสำหรับรหัสวางไข่เดียวกันจะถูกบล็อก การประมวลผลเบื้องหลังจะยกเลิกการปิดกั้นเมื่อการดำเนินการเสร็จสิ้น ขณะประมวลผลพื้นหลังถูกบล็อกคุณสามารถทำ (เบื้องหน้า)คาดหวัง เกี่ยวกับรหัสวางไข่เดียวกัน

ไม่สามารถดำเนินการได้คาดหวัง ขณะที่ aexpect_background ไม่มีการบล็อกexpect_background สำหรับ ID วางไข่โดยเฉพาะจะถูกลบโดยการประกาศใหม่ expect_background ที่มีรหัสวางไข่เดียวกัน ภาษณ์expect_background ไม่มีรูปแบบเอา ID วางไข่ที่ได้รับจากความสามารถในการจับคู่รูปแบบในพื้นหลัง

expect_before expect_args

ใช้อาร์กิวเมนต์เดียวกับคาดหวัง แต่จะส่งกลับทันที รูปแบบการกระทำคู่จากล่าสุดexpect_before มี id วางไข่เดียวกันจะถูกเพิ่มโดยปริยายต่อไปนี้คาดหวัง คำสั่ง ถ้ารูปแบบตรงกับมันจะถือว่าเป็นถ้าได้รับการระบุไว้ในคาดหวัง คำสั่งตัวเองและร่างกายที่เกี่ยวข้องจะถูกดำเนินการในบริบทของคาดหวัง คำสั่ง ถ้ารูปแบบจากทั้งสองexpect_before และคาดหวัง สามารถจับคู่ได้expect_before ใช้รูปแบบ

หากไม่มีการระบุรูปแบบรหัสการวางไข่จะไม่ได้รับการตรวจสอบสำหรับรูปแบบใด ๆ

ยกเว้นกรณีที่ a-ผม ธง,expect_before รูปแบบตรงกับรหัสวางไข่ที่กำหนดไว้ในขณะที่expect_before คำสั่งถูกเรียกใช้ (ไม่ใช่เมื่อรูปแบบถูกจับคู่)

สาเหตุ - ธงข้อมูลexpect_before เพื่อคืนค่าข้อกำหนดปัจจุบันของรูปแบบที่จะจับคู่ โดยค่าเริ่มต้นจะรายงาน ID การวางไข่ปัจจุบัน อาจระบุข้อมูลรหัส id วางไข่สำหรับข้อมูลเกี่ยวกับ ID การวางไข่ ตัวอย่างเช่น

expect_before -info -i $ proc

อาจได้รับข้อกำหนดเกี่ยวกับการวางไข่มากที่สุด ธง - ตรงที่จะยับยั้งรหัสวางไข่โดยตรงที่มาจากข้อกำหนดทางอ้อมเท่านั้น

แทนที่จะเป็นข้อกำหนดเกี่ยวกับรหัสวางไข่เครื่องหมาย "-all" จะทำให้ "ข้อมูล" รายงานเกี่ยวกับรหัสการวางไข่ทั้งหมด

เอาท์พุทของอินฟอร์แฟกค์สามารถนำกลับมาใช้ซ้ำได้เนื่องจากอาร์กิวเมนต์ที่คาดว่าจะได้รับก่อน

expect_tty expect_args

ก็เหมือนคาดหวัง แต่จะอ่านอักขระจาก / dev / tty (เช่นการกดแป้นพิมพ์จากผู้ใช้) การอ่านจะดำเนินการในโหมดปรุงอาหาร ดังนั้นเส้นต้องจบลงด้วยการกลับมาเพื่อให้คาดหวัง เพื่อดูพวกเขา นี้อาจมีการเปลี่ยนแปลงผ่านทางstty (ดูstty คำสั่งด้านล่าง)

expect_user expect_args

ก็เหมือนคาดหวัง แต่จะอ่านอักขระจาก stdin (เช่นการกดแป้นพิมพ์จากผู้ใช้) การอ่านจะดำเนินการในโหมดปรุงอาหาร ดังนั้นเส้นต้องจบลงด้วยการกลับมาเพื่อให้คาดหวัง เพื่อดูพวกเขานี้อาจมีการเปลี่ยนแปลงผ่านทางstty (ดูstty คำสั่งด้านล่าง)

ส้อม

สร้างกระบวนการใหม่ กระบวนการใหม่นี้เป็นสำเนาที่ถูกต้องของปัจจุบันคาดหวัง กระบวนการ. เกี่ยวกับความสำเร็จ,ส้อม ส่งกลับ 0 ไปยังกระบวนการใหม่ (child) และส่งคืน ID กระบวนการของกระบวนการย่อยไปยังกระบวนการหลัก เกี่ยวกับความล้มเหลว (เนื่องมาจากการขาดทรัพยากรเช่นพื้นที่แลกเปลี่ยนหน่วยความจำ)ส้อม ส่งกลับค่า -1 ไปยังโพรเซสที่ผู้ปกครองและไม่มีกระบวนการลูกถูกสร้างขึ้น

กระบวนการสาละวนจะออกผ่านทางทางออก คำสั่งเช่นเดียวกับกระบวนการเดิม กระบวนการ Forked ได้รับอนุญาตให้เขียนลงในแฟ้มบันทึก ถ้าคุณไม่ปิดใช้งานการดีบักหรือเข้าสู่กระบวนการส่วนใหญ่ผลลัพธ์อาจทำให้เกิดความสับสน

การใช้งาน PPS บางอย่างอาจสร้างความสับสนโดยผู้อ่านและนักเขียนหลายคนแม้แต่ในเวลาอันใกล้ ดังนั้นจึงปลอดภัยที่สุดส้อม ก่อนกระบวนการวางไข่

<