Η εντολή Linux / Unix Expect

Αναμείνετε είναι ένα πρόγραμμα που μιλάει με άλλα διαδραστικά προγράμματα σύμφωνα με ένα σενάριο. Μετά το σενάριο, η Expect γνωρίζει τι μπορεί να αναμένεται από ένα πρόγραμμα και ποια θα είναι η σωστή απάντηση. Μια ερμηνευμένη γλώσσα παρέχει διακλαδώσεις και δομές ελέγχου υψηλού επιπέδου για την κατεύθυνση του διαλόγου. Επιπλέον, ο χρήστης μπορεί να πάρει τον έλεγχο και να αλληλεπιδρά άμεσα όταν είναι επιθυμητό, ​​μετά επιστρέφοντας τον έλεγχο στο σενάριο.

Το Expectk είναι ένα μίγμα του Expect και του Tk. Συμπεριέχει την επιθυμία του Expect και της Tk. Η προσδοκία μπορεί επίσης να χρησιμοποιηθεί απευθείας σε C ή C ++ χωρίς Tcl.

Το όνομα "Expect" προέρχεται από την ιδέα της αλληλουχίας αποστολής / αναμονής που διαδόθηκε από uucp, kermit και άλλα προγράμματα ελέγχου μόντεμ. Ωστόσο, σε αντίθεση με το uucp, το Expect είναι γενικευμένο ώστε να μπορεί να εκτελείται ως εντολή σε επίπεδο χρήστη με οποιοδήποτε πρόγραμμα και εργασία. Αναμείνετε ότι μπορείτε να μιλήσετε με πολλά προγράμματα ταυτόχρονα.

Τι προσδοκώ ότι μπορεί να κάνει

Για παράδειγμα, εδώ είναι μερικά πράγματα που μπορεί να κάνει η εντολή:

Υπάρχουν διάφοροι λόγοι για τους οποίους το κέλυφος δεν μπορεί να εκτελέσει αυτές τις εργασίες. Όλα είναι δυνατά με το Expect.

Σε γενικές γραμμές, η προσδοκία είναι χρήσιμη για την εκτέλεση οποιουδήποτε προγράμματος που απαιτεί αλληλεπίδραση μεταξύ του προγράμματος και του χρήστη. Το μόνο που χρειάζεται είναι ότι η αλληλεπίδραση μπορεί να χαρακτηριστεί προγραμματικά. Η προσδοκία μπορεί επίσης να δώσει τον έλεγχο στον χρήστη χωρίς να σταματήσει το πρόγραμμα που ελέγχεται. Ομοίως, ο χρήστης μπορεί να επιστρέψει τον έλεγχο στο σενάριο ανά πάσα στιγμή.

Χρήση

Αναμένετε ότι διαβάζει το cmdfile για μια λίστα εντολών που θα εκτελεστούν. Η προσδοκία μπορεί να χρησιμοποιηθεί σιωπηρά σε συστήματα που υποστηρίζουν το #! σημειώνοντας σημειώνοντας το σενάριο ως εκτελέσιμο και κάνοντας την πρώτη γραμμή στο σενάριο:

#! / usr / local / bin / αναμονή -f

Φυσικά, το μονοπάτι πρέπει να περιγράφει με ακρίβεια πού περιμένουν τη ζωή. / usr / local / bin είναι μόνο ένα παράδειγμα.

Η -c σημαία προετοιμάζει μια εντολή που πρέπει να εκτελεστεί πριν από οποιοδήποτε από το σενάριο. Η εντολή πρέπει να αναφέρεται για να αποφευχθεί η διάλυση του κελύφους. Αυτή η επιλογή μπορεί να χρησιμοποιηθεί πολλές φορές. Πολλαπλές εντολές μπορούν να εκτελεστούν με ένα μόνο -c διαχωρίζοντάς τα με ερωτηματικά. Οι εντολές εκτελούνται με τη σειρά που εμφανίζονται. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως -command.

Η σημαία -d επιτρέπει κάποια διαγνωστική έξοδο, η οποία αναφέρει κυρίως την εσωτερική δραστηριότητα των εντολών όπως η αναμονή και η αλληλεπίδραση. Αυτή η σημαία έχει το ίδιο αποτέλεσμα με το "exp_internal 1" στην αρχή ενός σεναρίου Expect, συν την εκτύπωση της έκδοσης Expect.

Η σημαία -D επιτρέπει ένα διαδραστικό εργαλείο εντοπισμού σφαλμάτων. Θα πρέπει να ακολουθήσει μια ακέραια τιμή. Το πρόγραμμα εντοπισμού σφαλμάτων θα πάρει τον έλεγχο πριν από την επόμενη διαδικασία Tcl εάν η τιμή είναι μηδενική ή εάν πατηθεί ένα πλήκτρο ^ C ή ένα σημείο διακοπής ή άλλη εντολή debugger εμφανίζεται στο script. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως - Debug.

Η -f σημαία προετοιμάζει ένα αρχείο από το οποίο να διαβάζει τις εντολές. Η ίδια η σημαία είναι προαιρετική, καθώς είναι χρήσιμη μόνο όταν χρησιμοποιείτε το #! έτσι ώστε να μπορούν να παρέχονται και άλλα επιχειρήματα στη γραμμή εντολών. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως αρχείο.

Από προεπιλογή, το αρχείο εντολών διαβάζεται στη μνήμη και εκτελείται στο σύνολό του. Είναι περιστασιακά επιθυμητό να διαβάζετε τα αρχεία μία γραμμή τη φορά. Για να αναγκάσετε να χειριστείτε αυθαίρετα αρχεία με αυτόν τον τρόπο, χρησιμοποιήστε τη σημαία -b. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως -buffer.

Εάν η συμβολοσειρά "-" παρέχεται ως όνομα αρχείου, αντί να διαβάζεται η τυπική είσοδος. Χρησιμοποιήστε το "./-" για να διαβάσετε από ένα αρχείο που όντως ονομάζεται "-".

Η σημαία -i προκαλεί Προσδοκούμε να ζητήσουμε διαδραστικά εντολές αντί να τις διαβάσουμε από ένα αρχείο. Η προτροπή τερματίζεται με την εντολή εξόδου ή με το EOF. Η -i σημαία θεωρείται ότι δεν χρησιμοποιείται ούτε αρχείο εντολών ούτε -c. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως -interactive.

- μπορεί να χρησιμοποιηθεί για να οριοθετήσει το τέλος των επιλογών. Αυτό είναι χρήσιμο εάν θέλετε να περάσετε ένα παράθυρο που μοιάζει με επιλογή με το σενάριό σας χωρίς να ερμηνεύεται από την Expect. Αυτό μπορεί να τοποθετηθεί χρήσιμα στο #! line για να αποτρέψετε τυχόν ερμηνείες από την Expect. Για παράδειγμα, τα ακόλουθα θα αφήσουν τα αρχικά επιχειρήματα, συμπεριλαμβανομένου του ονόματος της δέσμης ενεργειών στη μεταβλητή argv .

#! / usr / local / bin / αναμονή -

Σημειώστε ότι οι συνηθισμένες συμβάσεις getopt (3) και execve (2) πρέπει να τηρούνται κατά την προσθήκη παραδειγμάτων στο #! γραμμή.

Το αρχείο $ exp_library / expect.rc προέρχεται αυτόματα εάν υπάρχει, εκτός και αν χρησιμοποιείται η σημαία -N. (Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως -NORC.) Αμέσως μετά από αυτό, το αρχείο ~ / .expect.rc προέρχεται αυτόματα, εκτός αν χρησιμοποιείται η σημαία -n. Εάν ορίζεται η μεταβλητή περιβάλλοντος DOTDIR, αντιμετωπίζεται ως κατάλογος και από εκεί διαβάζεται το .expect.rc. Όταν χρησιμοποιείτε το Expectk, αυτή η επιλογή ορίζεται ως -norc. Αυτή η προέλευση πραγματοποιείται μόνο μετά την εκτέλεση οποιασδήποτε σημαίας -c.

-v προκαλεί την προσδοκία να εκτυπώσετε τον αριθμό της έκδοσης και να εξέλθετε. Η αντίστοιχη σημαία στο Expectk, που χρησιμοποιεί τα μεγάλα ονόματα σημαίας, είναι -version.

Τα προαιρετικά args κατασκευάζονται σε μια λίστα και αποθηκεύονται στη μεταβλητή που ονομάζεται argv και. Το argc αρχικοποιείται στο μήκος του argv.

Το Argv0 ορίζεται ως το όνομα του σεναρίου ή του δυαδικού αρχείου αν δεν χρησιμοποιείται σενάριο. Για παράδειγμα, τα ακόλουθα εκτυπώνουν το όνομα της δέσμης ενεργειών και τα πρώτα τρία επιχειρήματα:

send_user "$ argv0 [τόπος $ argv 0 2] \ n"

Εντολές

Αναμείνετε τη χρήση της γλώσσας εντολών εργαλείων. Tcl παρέχει ροή ελέγχου (αν, για, σπάσιμο), αξιολόγηση έκφρασης και πολλά άλλα χαρακτηριστικά, όπως επανάληψη και ορισμό διαδικασίας. Οι εντολές που χρησιμοποιούνται εδώ αλλά δεν έχουν καθοριστεί (set, if, exec) είναι εντολές Tcl. Αναμένετε ότι υποστηρίζετε πρόσθετες εντολές. Εκτός αν ορίζεται διαφορετικά, οι εντολές επιστρέφουν την κενή συμβολοσειρά.

Οι εντολές παρατίθενται αλφαβητικά, ώστε να μπορούν να εντοπιστούν γρήγορα. Ωστόσο, οι νέοι χρήστες ενδέχεται να είναι πιο εύκολο να ξεκινήσουν διαβάζοντας τις περιγραφές του spawn, να στείλουν, να περιμένουν και να αλληλεπιδρούν με αυτή τη σειρά.

κλείνω [-σώτος] [-onexec 0 | 1] [-i spawn_id]

κλείνει τη σύνδεση με την τρέχουσα διαδικασία . Τα περισσότερα διαδραστικά προγράμματα θα ανιχνεύσουν τον EOF στο stdin και την έξοδο του. επομένως, συνήθως αρκεί να σκοτωθεί η διαδικασία επίσης. Η σημαία -i δηλώνει τη διαδικασία κλεισίματος που αντιστοιχεί στο όνομα spawn_id.

Και οι δύο περιμένουν και αλληλεπιδρούν θα εντοπίσουν όταν η τρέχουσα διαδικασία βγαίνει και σιωπηρά κλείσει, αλλά αν σκοτώσετε τη διαδικασία λέγοντας "exec kill kill pid", πρέπει να καλέσετε ρητά το κλείσιμο .

Η σημαία -onexec καθορίζει αν το id spawn είναι κλειστό σε κάθε νέα διαδικασία που γεννήθηκε ή αν η διαδικασία έχει επικαλυφθεί. Για να αφήσετε ανοιχτό το id spawn, χρησιμοποιήστε την τιμή 0. Μία μη-μηδενική τιμή ακέραιος αναγκάζει το σπόρο να είναι κλειστό σε κάθε νέα διαδικασία.

Η σημαία-slave κλείνει τον σκλάβο που σχετίζεται με το αναγνωριστικό ωοτοκίας. Όταν η σύνδεση είναι κλειστή, ο σκλάβος κλείνει αυτόματα και αν είναι ακόμη ανοιχτός.

Ανεξάρτητα από το αν η σύνδεση κλείνει σιωπηρά ή ρητά, πρέπει να καλέσετε την αναμονή για να ξεκαθαρίσετε την αντίστοιχη υποδοχή επεξεργασίας πυρήνα. Η εντολή κλεισίματος δεν καλεί την αναμονή, αφού δεν υπάρχει εγγύηση ότι το κλείσιμο μιας σύνδεσης διεργασίας θα την αναγκάσει να βγεί.

debug [[-now] 0 | 1]

ελέγχει ένα εργαλείο εντοπισμού σφαλμάτων Tcl, το οποίο σας επιτρέπει να ακολουθήσετε τις δηλώσεις και να ορίσετε σημεία διακοπής.

Αν δεν υπάρχουν επιχειρήματα, επιστρέφει ένα 1 αν το πρόγραμμα εντοπισμού σφαλμάτων δεν εκτελείται, διαφορετικά επιστρέφεται ένα 0.

Με ένα όρισμα, ξεκινά το πρόγραμμα εντοπισμού σφαλμάτων. Με ένα όριο 0, το πρόγραμμα εντοπισμού σφαλμάτων διακόπτεται. Εάν προηγείται ένα όρισμα 1 από τη σημαία -now, το πρόγραμμα εντοπισμού σφαλμάτων εκκινείται αμέσως. Διαφορετικά, το πρόγραμμα εντοπισμού σφαλμάτων ξεκινά με την επόμενη εντολή Tcl.

Η εντολή εντοπισμού σφαλμάτων δεν αλλάζει παγίδες. Συγκρίνετε αυτό με την εκκίνηση Αναμένετε με τη σημαία -D.

Η εντολή αποσύνδεσης αποσυνδέει μια διχαλωτή διαδικασία από το τερματικό . Συνεχίζει να τρέχει στο παρασκήνιο. Η διαδικασία δίνεται στη δική της ομάδα επεξεργασίας. Το πρότυπο I / O μεταφέρεται στο / dev / null .

Το ακόλουθο κομμάτι χρησιμοποιεί αποσύνδεση για να συνεχίσει να εκτελείται το σενάριο στο παρασκήνιο.

αν αποσυνδεθείτε {[fork]! = 0}. . .

Το ακόλουθο σενάριο διαβάζει έναν κωδικό πρόσβασης και στη συνέχεια εκτελεί ένα πρόγραμμα κάθε ώρα που απαιτεί κωδικό πρόσβασης κάθε φορά που εκτελείται. Το σενάριο παρέχει τον κωδικό πρόσβασης, έτσι ώστε να χρειάζεται μόνο να το πληκτρολογήσετε μία φορά.

\ n "{} {} {} {} {if {} {} {} 1, συμβολοσειρά) \ r ". . . έξοδος}

Ένα πλεονέκτημα στη χρήση της αποσύνδεσης πάνω από το χαρακτηριστικό ασύγχρονης διεργασίας επεξεργασίας κελύφους (&) είναι ότι το Expect μπορεί να αποθηκεύσει τις παραμέτρους του τερματικού πριν από την αποσύνδεση και αργότερα να τις εφαρμόσει σε νέα ptys. Με το &, το Expect δεν έχει την ευκαιρία να διαβάσει τις παραμέτρους του τερματικού, αφού το τερματικό είναι ήδη αποσυνδεδεμένο από το χρόνο που ο Expect λαμβάνει τον έλεγχο.

exit [-opts] [κατάσταση]

Αιτίες Αναμένετε να αποχωρήσετε ή να προετοιμαστείτε με άλλον τρόπο.

Η σημαία -onexit προκαλεί την χρήση του επόμενου επιχειρήματος ως χειριστή εξόδου. Χωρίς ένα όρισμα, επιστρέφεται ο τρέχων χειριστής εξόδου.

Η σημαία -noexit προκαλεί την προσδοκία να προετοιμαστείτε για έξοδο, αλλά να σταματήσετε να επιστρέφετε πραγματικά στο λειτουργικό σύστημα. Ο χειριστής εξόδου που έχει οριστεί από τον χρήστη εκτελείται καθώς και οι εσωτερικοί χειριστές της Expect. Δεν θα πρέπει να εκτελούνται άλλες εντολές αναμονής. Αυτό είναι χρήσιμο εάν εκτελείτε το πρόγραμμα Expect με άλλες επεκτάσεις Tcl. Ο τρέχων διερμηνέας (και το κύριο παράθυρο, αν υπάρχει στο περιβάλλον Tk) παραμένουν έτσι ώστε άλλες επεκτάσεις Tcl να καθαρίσουν. Αν η έξοδος της Expect επανέλθει (ωστόσο αυτό μπορεί να συμβεί), οι χειριστές δεν επαναλαμβάνονται.

Κατά την έξοδο, όλες οι συνδέσεις στις διεργασίες που έχουν δημιουργηθεί κλείσουν. Το κλείσιμο θα ανιχνεύεται ως EOF από τις διεργασίες που έχουν δημιουργηθεί. η έξοδος δεν κάνει άλλες ενέργειες πέρα ​​από ό, τι κάνει η κανονική διαδικασία _exit (2). Έτσι, μπορούν να συνεχίσουν να τρέχουν διεργασίες που δεν έχουν ελεγχθεί για το EOF. (Μια ποικιλία συνθηκών είναι σημαντικές για τον προσδιορισμό, παραδείγματος χάριν, των σημάτων που θα αποσταλεί μια διαδικασία που γεννήθηκε, αλλά αυτά είναι εξαρτώμενα από το σύστημα, συνήθως τεκμηριωμένα κάτω από την έξοδο (3).) Οι διεργασίες που αναπτύσσονται και συνεχίζουν να τρέχουν θα κληρονομηθούν από το init.

η κατάσταση (ή το 0 αν δεν καθορίζεται) επιστρέφεται ως κατάσταση εξόδου του Expect . η έξοδος εκτελείται σιωπηρά εάν επιτευχθεί το τέλος του σεναρίου.

exp_continue [-continue_timer]
Η εντολή exp_continue επιτρέπει την αναμονή να συνεχίσει την εκτέλεση αντί να επιστρέφει όπως συνήθως. Από προεπιλογή το exp_continue επαναφέρει τον χρονομετρητή χρονικού ορίου. Η σημαία -continue_timer εμποδίζει την επανεκκίνηση του χρονοδιακόπτη. (Δείτε αναμένετε για περισσότερες πληροφορίες.)

exp_internal [-f αρχείο] τιμή
προκαλεί περαιτέρω εντολές για την αποστολή διαγνωστικών πληροφοριών εσωτερικού για να περιμένετε να stderr αν η τιμή είναι μηδενική. Αυτή η έξοδος είναι απενεργοποιημένη αν η τιμή είναι 0. Οι πληροφορίες διάγνωσης περιλαμβάνουν κάθε χαρακτήρα που λαμβάνεται και κάθε προσπάθεια που γίνεται για να ταιριάζει με την τρέχουσα έξοδο έναντι των μοτίβων.

Εάν παρέχεται το προαιρετικό αρχείο , όλες οι κανονικές και οι εντολές αποσφαλμάτωσης εγγράφονται σε αυτό το αρχείο (ανεξάρτητα από την τιμή της τιμής ). Οποιοδήποτε προηγούμενο αρχείο διαγνωστικού ελέγχου είναι κλειστό.

Η σημαία -info προκαλεί exp_internal για να επιστρέψει μια περιγραφή των πιο πρόσφατων μη-πληροφοριών παραδειγμάτων που δόθηκαν.

exp_open [args] [-i spawn_id]
επιστρέφει ένα αναγνωριστικό αρχείου Tcl που αντιστοιχεί στο αρχικό αναγνωριστικό αναπαραγωγής. Το αναγνωριστικό αρχείου μπορεί στη συνέχεια να χρησιμοποιηθεί σαν να ανοίγει με την ανοιχτή εντολή του Tcl. (Το αναγνωριστικό αναπαραγωγής δεν πρέπει πλέον να χρησιμοποιείται. Δεν πρέπει να εκτελεστεί αναμονή .

Η σημαία -leaveopen αφήνει το id spawn ανοιχτό για πρόσβαση μέσω των εντολών Expect. Μια αναμονή πρέπει να εκτελεστεί στο id spawn.

exp_pid [-i spawn_id]
επιστρέφει το αναγνωριστικό διαδικασίας που αντιστοιχεί στην τρέχουσα διαδικασία. Εάν χρησιμοποιείται η σημαία -i , το pid που επιστρέφεται αντιστοιχεί σε εκείνο του αναγνωρισμένου id spawn.

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] έκδοση]
είναι χρήσιμη για να βεβαιωθείτε ότι το σενάριο είναι συμβατό με την τρέχουσα έκδοση του Expect.

Με κανένα επιχείρημα, επιστρέφεται η τρέχουσα έκδοση του Expect . Αυτή η έκδοση μπορεί στη συνέχεια να κωδικοποιηθεί στη δέσμη ενεργειών σας. Εάν γνωρίζετε πραγματικά ότι δεν χρησιμοποιείτε χαρακτηριστικά πρόσφατων εκδόσεων, μπορείτε να ορίσετε μια παλαιότερη έκδοση.

Οι εκδόσεις αποτελούνται από τρεις αριθμούς που χωρίζονται από κουκκίδες. Ο πρώτος είναι ο σημαντικότερος αριθμός. Τα scripts που γράφονται για εκδόσεις του Expect με διαφορετικό μεγάλο αριθμό, σχεδόν σίγουρα δεν θα λειτουργούν. Η exp_version επιστρέφει ένα σφάλμα αν οι κύριοι αριθμοί δεν ταιριάζουν.

Δεύτερος είναι ο μικρός αριθμός. Οι δέσμες ενεργειών γραμμένες για μια έκδοση με μικρότερο αριθμό από την τρέχουσα έκδοση ενδέχεται να εξαρτώνται από κάποια νέα δυνατότητα και ενδέχεται να μην εκτελούνται. Το exp_version επιστρέφει ένα σφάλμα αν οι κύριοι αριθμοί ταιριάζουν, αλλά ο μικρότερος αριθμός του σεναρίου είναι μεγαλύτερος από αυτόν της τρέχουσας προσδοκίας .

Το τρίτο είναι ένας αριθμός που δεν παίζει κανένα ρόλο στη σύγκριση της έκδοσης. Ωστόσο, αυξάνεται όταν η κατανομή λογισμικού Expect αλλάζει με οποιονδήποτε τρόπο, όπως με πρόσθετη τεκμηρίωση ή βελτιστοποίηση. Επαναφέρει σε 0 σε κάθε νέα δευτερεύουσα έκδοση.

Με τη σημαία -exit , το Expect εκτυπώνει ένα σφάλμα και βγαίνει αν η έκδοση είναι παλιά .

περιμένετε [[-opts] pat1 body1] ... [-opts] patn [bodyn]
περιμένει έως ότου ένα από τα πρότυπα ταιριάζει με την έξοδο μιας διεργασίας που γεννήθηκε, έχει περάσει μια συγκεκριμένη χρονική περίοδος ή έχει καταγραφεί ένα τέλος του αρχείου. Εάν το τελικό σώμα είναι άδειο, μπορεί να παραλειφθεί.

Τα μοτίβα από την πιο πρόσφατη εντολή expect_before χρησιμοποιούνται σιωπηρά πριν από οποιαδήποτε άλλα μοτίβα. Τα μοτίβα από την πιο πρόσφατη εντολή expect_after χρησιμοποιούνται σιωπηρά μετά από οποιαδήποτε άλλα μοτίβα.

Εάν τα επιχειρήματα για ολόκληρη τη δήλωση αναμονής απαιτούν περισσότερες από μία γραμμές, όλα τα επιχειρήματα μπορεί να "ενισχυθούν" σε ένα έτσι ώστε να αποφευχθεί η διακοπή κάθε γραμμής με μια ανάστροφη κάθετο. Σε αυτή τη περίπτωση, οι συνήθεις αντικαταστάσεις Tcl θα εμφανιστούν παρά τα τιράντες.

Εάν ένα πρότυπο είναι η λέξη eof , το αντίστοιχο σώμα εκτελείται μετά το τέλος του αρχείου. Εάν ένα πρότυπο είναι το χρονικό όριο της λέξης-κλειδιού, το αντίστοιχο σώμα εκτελείται μετά το χρονοδιάγραμμα. Εάν δεν χρησιμοποιείται καμία λέξη-κλειδί χρονικού ορίου, εκτελείται μια σιωπηρή μηδενική ενέργεια μετά το χρονικό όριο. Η προεπιλεγμένη χρονική περίοδος είναι 10 δευτερόλεπτα, αλλά μπορεί να ρυθμιστεί, για παράδειγμα σε 30, με την εντολή "set timeout 30". Ένα άπειρο χρονικό όριο μπορεί να οριστεί με την τιμή -1. Εάν ένα πρότυπο είναι η προεπιλεγμένη λέξη-κλειδί, το αντίστοιχο σώμα εκτελείται είτε κατά τη λήξη είτε από το τέλος του αρχείου.

Εάν ένα πρότυπο ταιριάζει, τότε εκτελείται το αντίστοιχο σώμα. περιμένετε να επιστρέφει το αποτέλεσμα του σώματος (ή η κενή συμβολοσειρά, αν δεν υπάρχει αντιστοιχισμένο πρότυπο). Σε περίπτωση που αντιστοιχιστούν πολλά μοτίβα, η πρώτη που εμφανίζεται χρησιμοποιείται για την επιλογή ενός σώματος.

Κάθε φορά που φθάνει νέα έξοδος, συγκρίνεται με κάθε πρότυπο με τη σειρά που απαριθμούνται. Έτσι, μπορείτε να δοκιμάσετε για την απουσία ενός αγώνα κάνοντας το τελευταίο μοτίβο κάτι που εγγυάται την εμφάνισή του, όπως μια προτροπή. Σε περιπτώσεις όπου δεν υπάρχει προτροπή, πρέπει να χρησιμοποιήσετε το χρονικό όριο (όπως θα κάνατε αν χειρίζεστε χειροκίνητα).

Τα μοτίβα καθορίζονται με τρεις τρόπους. Από προεπιλογή, τα πρότυπα καθορίζονται όπως και με την εντολή αντιστοίχισης συμβολοσειρών Tcl. (Τέτοια μοτίβα είναι επίσης παρόμοια με τις κανονικές εκφράσεις C-shell) που συνήθως αναφέρονται ως μοτίβα "glob". Η σημαία -gl μπορεί να χρησιμοποιηθεί για την προστασία των μοτίβων που διαφορετικά θα μπορούσαν να ταιριάζουν με τις σημαίες. Κάθε μοτίβο που αρχίζει με ένα "-" πρέπει να προστατεύεται με αυτόν τον τρόπο. (Όλες οι συμβολοσειρές που αρχίζουν με "-" προορίζονται για μελλοντικές επιλογές.)

Για παράδειγμα, το ακόλουθο κομμάτι αναζητά μια επιτυχημένη σύνδεση. (Σημειώστε ότι η διακοπή τεκμαίρεται ότι είναι μια διαδικασία που ορίζεται αλλού στο σενάριο.)

περιμένετε {busy {θέτει πολυάριθμα \ n; exp_continue} απέτυχε να ακυρώσει "έγκυρο κωδικό" abort timeout abort συνδεδεμένος}

Τα αποσπάσματα είναι απαραίτητα για το τέταρτο μοτίβο αφού περιέχει ένα χώρο, που διαφορετικά θα διαχωρίζει το μοτίβο από τη δράση. Τα μοτίβα με την ίδια ενέργεια (όπως το 3ο και το 4ο) απαιτούν εκ νέου καταγραφή των ενεργειών. Αυτό μπορεί να αποφευχθεί χρησιμοποιώντας μοντέλα τύπου regexp (δείτε παρακάτω). Περισσότερες πληροφορίες σχετικά με το σχηματισμό μοτίβων στυλ σε σφαιρία μπορούν να βρεθούν στο εγχειρίδιο Tcl.

Τα μοτίβα τύπου Regexp ακολουθούν τη σύνταξη που ορίζεται από την εντολή regexp (κοντό για την "κανονική έκφραση") του Tcl. τα μοντέλα regexp εισάγονται με τη σημαία -re . Το προηγούμενο παράδειγμα μπορεί να ξαναγραφεί χρησιμοποιώντας ένα regexp ως:

περιμένετε {busy {θέτει πολυάριθμα \ n; exp_continue} -re "απέτυχε | μη έγκυρος κωδικός πρόσβασης" abort timeout abort συνδεδεμένος}

Και οι δύο τύποι μοτίβων είναι "μη σταθεροποιημένοι". Αυτό σημαίνει ότι τα μοτίβα δεν χρειάζεται να ταιριάζουν με ολόκληρη τη συμβολοσειρά, αλλά μπορούν να ξεκινήσουν και να τερματίσουν τον αγώνα οπουδήποτε στη συμβολοσειρά (εφ 'όσον ταιριάζουν όλα τα υπόλοιπα). Χρησιμοποιήστε το ^ για να ταιριάζει με την αρχή μιας συμβολοσειράς και $ για να ταιριάζει με το τέλος. Σημειώστε ότι αν δεν περιμένετε το τέλος μιας συμβολοσειράς, οι απαντήσεις σας μπορούν εύκολα να καταλήξουν στη μέση της συμβολοσειράς καθώς αντανακλώνται από τη διαδικασία που γεννήθηκε. Παρόλο που εξακολουθούν να παράγουν σωστά αποτελέσματα, η έξοδος μπορεί να φαίνεται αφύσικη. Έτσι, η χρήση του $ ενθαρρύνεται αν μπορείτε να περιγράψετε ακριβώς τους χαρακτήρες στο τέλος μιας συμβολοσειράς.

Σημειώστε ότι σε πολλούς επεξεργαστές τα ^ και $ ταιριάζουν με την αρχή και το τέλος των γραμμών αντίστοιχα. Ωστόσο, επειδή η προσδοκία δεν είναι γραμμική προσανατολισμένη, αυτοί οι χαρακτήρες ταιριάζουν με την αρχή και το τέλος των δεδομένων (σε αντίθεση με τις γραμμές) που βρίσκονται αυτήν τη στιγμή στο αναμενόμενο buffer αντιστοίχισης. (Επίσης, ανατρέξτε στη σημείωση παρακάτω σχετικά με τη "δυσπεψία του συστήματος.")

Η σημαία -ex αναγκάζει το πρότυπο να αντιστοιχιστεί ως "ακριβής" συμβολοσειρά. Δεν γίνεται ερμηνεία των *, ^, κλπ (αν και πρέπει να τηρούνται οι συνηθισμένες συμβάσεις Tcl). Τα ακριβή μοτίβα είναι πάντοτε αβασάνιστα.

Η σημαία -nocase προκαλεί τη σύγκριση των κεφαλαίων χαρακτήρων της εξόδου σαν να ήταν πεζά χαρακτήρες. Το μοτίβο δεν επηρεάζεται.

Κατά την ανάγνωση της εξόδου, περισσότερα από 2000 bytes μπορούν να εξαναγκάσουν να ξεχαστούν τα προηγούμενα byte. Αυτό μπορεί να αλλάξει με τη συνάρτηση match_max . (Σημειώστε ότι οι υπερβολικά μεγάλες τιμές μπορούν να επιβραδύνουν την αντιστοίχιση μοτίβων.) Εάν η λίστα είναι full_buffer , εκτελείται το αντίστοιχο σώμα εάν έχουν ληφθεί match_max byte και δεν έχουν αντιστοιχιστεί άλλα μοτίβα. Αν χρησιμοποιείται ή όχι η πλήρης λέξη-κλειδί full_buffer , οι ξεχασμένοι χαρακτήρες γράφονται στο expect_out (buffer).

Εάν η λίστα κατακερματισμού είναι η λέξη-κλειδί μηδέν και επιτρέπονται nulls (μέσω της εντολής remove_nulls ), το αντίστοιχο σώμα εκτελείται αν αντιστοιχεί ένα μόνο ASCII 0. Δεν είναι δυνατή η αντιστοίχιση 0 byte μέσω μοτίβων glob ή regexp.

Με την αντιστοίχιση ενός προτύπου (ή eof ή full_buffer), οποιαδήποτε αντιστοίχιση και προηγουμένως απαράμιλλη έξοδος αποθηκεύεται στη μεταβλητή expect_out (buffer) . Μέχρι 9 αντιστοιχίσεις υποζώνης regexp αποθηκεύονται στις μεταβλητές expect_out (1, string) μέσω του expect_out (9, string) . Εάν η σημαία -indices χρησιμοποιείται πριν από ένα πρότυπο, οι δείκτες έναρξης και λήξης (σε μορφή κατάλληλη για περιπλοκές ) των 10 συμβολοσειρών αποθηκεύονται στις μεταβλητές expect_out (X, start) και expect_out (X, end) όπου X είναι ψηφίο, αντιστοιχεί στη θέση υποστέλεσης στο buffer. Το 0 αναφέρεται σε χορδές που αντιστοιχούν σε ολόκληρο το πρότυπο και παράγονται για πρότυπα σφαιρών καθώς και για μορφές regexp. Για παράδειγμα, αν μια διαδικασία έχει παραγάγει την παραγωγή του "abcdefgh \ n", το αποτέλεσμα:

περιμένετε "cd"

είναι σαν να είχαν εκτελέσει οι ακόλουθες δηλώσεις:

set expect_out (0, συμβολοσειρά) cd set expect_out (buffer) abcd

και το "efgh \ n" παραμένει στο buffer εξόδου. Αν μια διαδικασία παρήγαγε την έξοδο "abbbcabkkkka \ n", το αποτέλεσμα:

αναμένουν -indices -re "b (b *). * (k +)"

είναι σαν να είχαν εκτελέσει οι ακόλουθες δηλώσεις:

(1, τέλος) set expect_out (0, αρχή) 1 set expect_out (0, τέλος) 10 set expect_out (0, τέλος) (2, έναρξη) 10 set expect_out (2, τέλος) 10 set expect_out (2, συμβολοσειρά) k set expect_out (buffer) abbbcabkkkk

και "a \ n" παραμένει στο buffer εξόδου. Το μοτίβο "*" (και -re ". *") Θα ξεπλύνει την προσωρινή μνήμη εξόδου χωρίς να διαβάσει άλλη έξοδο από τη διαδικασία.

Κανονικά, η αντιστοιχισμένη έξοδος απορρίπτεται από τα εσωτερικά αποθέματα του Expect. Αυτό μπορεί να αποφευχθεί προθέτοντας ένα μοτίβο με τη σημαία -notransfer . Αυτή η σημαία είναι ιδιαίτερα χρήσιμη στον πειραματισμό (και μπορεί να συντομευτεί για "-not" για ευκολία κατά τη διάρκεια πειραματισμού).

Το id spawn που σχετίζεται με την αντίστοιχη έξοδο (ή eof ή full_buffer) αποθηκεύεται στο expect_out (spawn_id) .

Η σημαία -timeout προκαλεί την εντολή τρέχουσας αναμονής να χρησιμοποιεί την ακόλουθη τιμή ως χρονικό όριο αντί να χρησιμοποιεί την τιμή της μεταβλητής χρονικού ορίου.

Από προεπιλογή, τα μοτίβα αντιστοιχίζονται με την έξοδο από την τρέχουσα διαδικασία, ωστόσο η παράμετρος -i δηλώνει ότι η έξοδος από την ονομαζόμενη λίστα spawn_id αντιστοιχεί σε οποιοδήποτε από τα παρακάτω πρότυπα (μέχρι το επόμενο -i ). Η λίστα spawn_id θα πρέπει είτε να είναι μια διαχωρισμένη λίστα λευκών λωρίδων spawn_ids ή μια μεταβλητή που αναφέρεται σε μια τέτοια λίστα των spawn_ids.

Για παράδειγμα, το ακόλουθο παράδειγμα περιμένει για "συνδεδεμένο" από την τρέχουσα διαδικασία ή "απασχολημένος", "απέτυχε" ή "μη έγκυρος κωδικός πρόσβασης" από το spawn_id που ονομάζεται από $ proc2.

περιμένετε {-i $ proc2 απασχολημένος {θέτει απασχολημένος \ n; exp_continue} -re "απέτυχε | μη έγκυρος κωδικός πρόσβασης" abort timeout abort συνδεδεμένος}

Η τιμή της παγκόσμιας μεταβλητής any_spawn_id μπορεί να χρησιμοποιηθεί για να ταιριάζει με τα πρότυπα σε οποιαδήποτε spawn_ids που ονομάζονται με όλες τις άλλες σημαίες -i στην τρέχουσα εντολή expect . Το spawn_id από μια σημαία -i χωρίς σχετικό μοτίβο (δηλαδή, ακολουθούμενο αμέσως από άλλο -i ) είναι διαθέσιμο σε οποιοδήποτε άλλο πρότυπο στην ίδια εντολή αναμονής που σχετίζεται με any_spawn_id.

Η σημαία -i μπορεί επίσης να ονομάσει μια σφαιρική μεταβλητή, οπότε η μεταβλητή διαβάζεται για μια λίστα των αναγνωρισμάτων του spawn. Η μεταβλητή επαναδιατυπώνεται κάθε φορά που αλλάζει. Αυτό παρέχει έναν τρόπο αλλαγής της πηγής I / O ενώ η εντολή εκτελείται. Τα ξένα σπέρματα με τον τρόπο αυτό ονομάζονται "έμμεσοι" όχλοι.

Ενέργειες όπως η διακοπή και η συνέχιση δημιουργούν δομές ελέγχου (δηλ. Για proc ) για να συμπεριφέρονται με τον συνήθη τρόπο. Η εντολή exp_continue επιτρέπει την αναμονή να συνεχίσει την εκτέλεση αντί να επιστρέφει όπως συνήθως.

Αυτό είναι χρήσιμο για την αποφυγή ρητών βρόχων ή επανειλημμένων αναμενόμενων δηλώσεων. Το ακόλουθο παράδειγμα είναι μέρος ενός τμήματος για την αυτοματοποίηση του rlogin. Το exp_continue αποφεύγει να γράψει μια δεύτερη δήλωση αναμονής (για να αναζητήσει ξανά το ερώτημα) αν το rlogin ζητά κωδικό πρόσβασης.

αναμένετε τον κωδικό πρόσβασης {password: {stty -echo send_user "για $ user) στο $ host:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out echo exp_continue} λανθασμένη {send_user "μη έγκυρος κωδικός πρόσβασης ή λογαριασμός \ n" εξόδου} timeout {send_user "σύνδεση με $ host timed out \ n" έξοδος} eof {send_user \ re $ prompt}

Για παράδειγμα, το ακόλουθο κομμάτι μπορεί να βοηθήσει ένα χρήστη να καθοδηγήσει μια αλληλεπίδραση που είναι ήδη πλήρως αυτοματοποιημένη. Σε αυτή την περίπτωση, το τερματικό τίθεται σε ακατέργαστη λειτουργία. Εάν ο χρήστης πιέσει "+", αυξάνεται μια μεταβλητή. Εάν πιεστεί το "p", αποστέλλονται αρκετές επιστροφές στη διαδικασία, ίσως για να το σπρώξουν με κάποιο τρόπο και το "i" επιτρέπει στον χρήστη να αλληλεπιδράσει με τη διαδικασία, απομακρύνοντας αποτελεσματικά τον έλεγχο από το σενάριο. Σε κάθε περίπτωση, το exp_continue επιτρέπει στο ρεύμα να αναμένει να συνεχίσει την αντιστοίχιση προτύπων μετά την εκτέλεση της τρέχουσας ενέργειας.

stty ακατέργαστο -έχει αναμένει_από {-i $ user_spawn_id "p" {send "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {αλληλεπίδραση; 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_before και expect_after όπως ακριβώς περιμένουν .

Όταν αξιολογούνται οι ενέργειες expect_background , η επεξεργασία φόντου για το ίδιο αναγνωριστικό ωοτοκίας είναι αποκλεισμένη. Η επεξεργασία του φόντου ξεκλειδώνεται όταν ολοκληρωθεί η ενέργεια. Ενώ η επεξεργασία παρασκηνίου είναι αποκλεισμένη, είναι δυνατό να αναμένετε ένα (προσκήνιο) στο ίδιο αναγνωριστικό αναπαραγωγής.

Δεν είναι δυνατό να εκτελεστεί μια αναμονή, ενώ η αναμονή_πλαισίου είναι ξεκλειδωμένη. expect_background για ένα συγκεκριμένο id spawn διαγράφεται δηλώνοντας ένα νέο πεδίο αναμονής expectback με το ίδιο id spawn. Η δήλωση του expect_background χωρίς πρότυπο αφαιρεί το δεδομένο id spawn από την ικανότητα να ταιριάζει με τα μοτίβα στο παρασκήνιο.

περιμένετε πριν [expect_args]
παίρνει τα ίδια επιχειρήματα που περιμένουν , ωστόσο επιστρέφει αμέσως. Τα ζευγάρια μοτίβων-δράσης από την πιο πρόσφατη προσδοκία πριν με το ίδιο αναγνωριστικό ωοτοκίας προστίθενται σιωπηρά στις επόμενες εντολές αναμονής. Εάν ένα πρότυπο ταιριάζει, αντιμετωπίζεται σαν να είχε οριστεί στην εντολή αναμονής και το σχετικό σώμα εκτελέστηκε στο πλαίσιο της εντολής αναμονής. Εάν τα πρότυπα και από τις δύο προσδοκίες και πριν από την προσδοκία μπορούν να ταιριάξουν, το μοντέλο expect_before χρησιμοποιείται.

Αν δεν έχει καθοριστεί πρότυπο, το αναγνωριστικό αναπαραγωγής δεν ελέγχεται για τυχόν μοτίβα.

Αν δεν αντικατασταθεί από μια σημαία -i , περιμένετε πριν τα πρότυπα να ταιριάξουν με το id spawn που καθορίστηκε τη στιγμή που εκτελέστηκε η εντολή expect_before (όχι όταν το σχέδιό του ταιριάζει).

Η σημαία -info προκαλεί αναμονή πριν να επιστρέψετε τις τρέχουσες προδιαγραφές για τα πρότυπα που θα ταιριάζουν. Από προεπιλογή, αναφέρει το τρέχον αναγνωριστικό αναπαραγωγής. Μπορεί να δοθεί μια προαιρετική προδιαγραφή για το id spawn για πληροφορίες σχετικά με αυτό το id spawn. Για παράδειγμα

περιμένετε_εμφανίσετε -info -i $ proc

Μπορεί να δοθεί το πολύ μία προδιαγραφή id spawn. Η σημαία -η άμεση καταστέλλει τα άμεσα ευρήματα που προέρχονται από έμμεσες προδιαγραφές.

Αντί της προδιαγραφής id spawn, η σημαία "-all" θα προκαλέσει "-info" για να αναφέρει όλα τα σπέρματα.

Η έξοδος της σημαίας -info μπορεί να επαναχρησιμοποιηθεί ως το επιχείρημα για να περιμένετε πριν.

expect_tty [expect_args]
είναι σαν να περιμένουμε, αλλά διαβάζει χαρακτήρες από / dev / tty (δηλαδή πληκτρολογήσεις από το χρήστη). Από προεπιλογή, η ανάγνωση πραγματοποιείται σε κατάσταση μαγειρέματος. Έτσι, οι γραμμές πρέπει να τελειώνουν με μια επιστροφή για να περιμένουν να τις δουν. Αυτό μπορεί να αλλάξει μέσω stty (δείτε την εντολή stty παρακάτω).

expect_user [expect_args]
είναι σαν να περιμένουμε αλλά διαβάζει χαρακτήρες από stdin (δηλαδή πληκτρολογήσεις από το χρήστη). Από προεπιλογή, η ανάγνωση πραγματοποιείται σε κατάσταση μαγειρέματος. Έτσι, οι γραμμές πρέπει να τελειώνουν με μια επιστροφή για να περιμένουν να τις δουν. Αυτό μπορεί να αλλάξει μέσω stty (δείτε την εντολή stty παρακάτω).

πιρούνι
δημιουργεί μια νέα διαδικασία . Η νέα διαδικασία είναι ένα ακριβές αντίγραφο της τρέχουσας διαδικασίας Expect . Με την επιτυχία, η πιρούνια επιστρέφει 0 στη νέα (παιδική) διαδικασία και επιστρέφει το αναγνωριστικό διαδικασίας της διαδικασίας παιδιού στη γονική διαδικασία . Σε περίπτωση αποτυχίας (πάντοτε λόγω έλλειψης πόρων, π.χ. χώρος ανταλλαγής, μνήμης), η πιρούνια επιστρέφει -1 στη γονική διαδικασία και δεν δημιουργείται καμία διαδικασία παιδιού.

Οι εξελισσόμενες διεργασίες εξέρχονται μέσω της εντολής εξόδου , ακριβώς όπως και η αρχική διαδικασία . Μπορείτε να γράψετε στα αρχεία καταγραφής τις διεργασίες με πεσέτες. Εάν δεν απενεργοποιήσετε την εκσφαλμάτωση ή την καταγραφή των περισσότερων διαδικασιών, το αποτέλεσμα μπορεί να προκαλέσει σύγχυση.

Ορισμένες υλοποιήσεις pty μπορεί να συγχέονται από πολλούς αναγνώστες και συγγραφείς, ακόμη και στιγμιαία. Έτσι, είναι πιο ασφαλές να πιρούνι πριν από τις διαδικασίες ωοτοκίας.

αλληλεπιδράσει [string1 body1] ... [stringn [bodyn]]
δίνει τον έλεγχο της τρέχουσας διαδικασίας στον χρήστη, έτσι ώστε οι πληκτρολογήσεις αποστέλλονται στην τρέχουσα διαδικασία και επιστρέφουν το stdout και stderr της τρέχουσας διαδικασίας .

Τα ζεύγη συμβολοσειράς-σώματος μπορούν να οριστούν ως επιχειρήματα, οπότε το σώμα εκτελείται όταν εισαχθεί η αντίστοιχη συμβολοσειρά. (Από προεπιλογή, η συμβολοσειρά δεν αποστέλλεται στην τρέχουσα διαδικασία .) Η εντολή διερμηνέα υποτίθεται, αν λείπει το τελικό σώμα.

Εάν τα επιχειρήματα σε ολόκληρη τη δήλωση αλληλεπίδρασης απαιτούν περισσότερες από μία γραμμές, όλα τα επιχειρήματα μπορούν να "ενισχυθούν" σε ένα έτσι ώστε να αποφευχθεί η διακοπή κάθε γραμμής με ανάστροφη κάθετο. Σε αυτή τη περίπτωση, οι συνήθεις αντικαταστάσεις Tcl θα εμφανιστούν παρά τα τιράντες.

Για παράδειγμα, η ακόλουθη εντολή τρέχει αλληλεπιδρούν με τα ακόλουθα ζεύγη συμβολοσειράς-σώματος: Όταν πατηθεί το ^ Z, αναμένεται η αναμονή. (Η παράμετρος -reset επαναφέρει τις λειτουργίες τερματικού.) Όταν πιέζεται το ^ A, ο χρήστης βλέπει "πληκτρολογήσατε ένα χειριστήριο-Α" και η διαδικασία αποστέλλεται a ^ A. Όταν πατηθεί το $, ο χρήστης βλέπει την ημερομηνία. Όταν πιέσετε το πλήκτρο ^ C, αναμένετε τις εξόδους. Αν εισάγεται "foo", ο χρήστης βλέπει "bar". Όταν πατηθεί το ~~, ο διερμηνέας Expect εκτελείται διαδραστικά.

set CTRLZ \ 032 αλληλεπιδρούν {-αποζημίωση $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "πληκτρολογήσατε τον έλεγχο-A \ n"; αποστολή "\ 001"} $ {send_user "Η ημερομηνία είναι [μορφή ωρολογίου [δευτερόλεπτα δευτερόλεπτα]]"} \ 003 exit foo {send_user "bar"} ~~}

Στα ζεύγη συμβολοσειράς-σώματος, οι συμβολοσειρές αντιστοιχίζονται με τη σειρά που αναφέρονται ως επιχειρήματα. Οι χορδές που ταιριάζουν εν μέρει δεν αποστέλλονται στην τρέχουσα διαδικασία εν αναμονή του υπολοίπου που έρχεται. Αν οι χαρακτήρες εισάγονται έτσι ώστε να μην υπάρχει πλέον πιθανότητα ταίριασμα, μόνο το τμήμα της συμβολοσειράς θα σταλεί στη διαδικασία που δεν μπορεί να αρχίσει άλλο ταιριάζει. Επομένως, οι συμβολοσειρές που είναι υποστοιχίες των μερικών αντιστοιχιών μπορούν να ταιριάζουν αργότερα, αν οι αρχικές συμβολοσειρές που προσπαθούσαν να τακτοποιηθούν τελικά αποτύχουν.

Από προεπιλογή, η αντιστοίχιση συμβολοσειρών είναι ακριβής, χωρίς να υπάρχουν άγριες κάρτες (Αντίθετα, η εντολή αναμονής χρησιμοποιεί πρότυπα στυλ σε σφαίρα από προεπιλογή.) Η σημαία -ex μπορεί να χρησιμοποιηθεί για την προστασία μοτίβων που διαφορετικά θα μπορούσαν να ταιριάζουν με τις σημαίες αλληλεπίδρασης . Κάθε μοτίβο που αρχίζει με ένα "-" πρέπει να προστατεύεται με αυτόν τον τρόπο. (Όλες οι συμβολοσειρές που αρχίζουν με "-" προορίζονται για μελλοντικές επιλογές.)

Η σημαία -re υποχρεώνει τη συμβολοσειρά να ερμηνευτεί ως μοτίβο τύπου regexp. Σε αυτήν την περίπτωση, οι αντίστοιχες υποστοιχίες αποθηκεύονται στη μεταβλητή interact_out παρόμοια με τον τρόπο που αναμένεται να αποθηκεύει την έξοδο της στη μεταβλητή expect_out . Η σημαία -indices υποστηρίζεται παρομοίως.

Το μοτίβο eof εισάγει μια ενέργεια που εκτελείται μετά το τέλος του αρχείου. Ένα ξεχωριστό μοτίβο eof μπορεί επίσης να ακολουθήσει τη σημαία -output στην οποία περίπτωση αντιστοιχεί σε ανίχνευση eof κατά την εγγραφή της εξόδου. Η προεπιλεγμένη ενέργεια eof είναι "επιστροφή", έτσι ώστε η αλληλεπίδραση απλώς επιστρέφει σε οποιονδήποτε EOF.

Το χρονικό όριο του προτύπου εισάγει ένα χρονικό όριο (σε δευτερόλεπτα) και μια ενέργεια που εκτελείται αφού δεν έχουν διαβαστεί κάποιοι χαρακτήρες για δεδομένη ώρα. Το πρότυπο χρονικού ορίου ισχύει για την πιο πρόσφατα καθορισμένη διαδικασία . Δεν υπάρχει προεπιλεγμένο χρονικό όριο. Η ειδική μεταβλητή "timeout" (χρησιμοποιείται από την εντολή αναμονής) δεν επηρεάζει αυτό το χρονικό όριο.

Για παράδειγμα, η ακόλουθη δήλωση θα μπορούσε να χρησιμοποιηθεί για την αυτόλογη δημοσίευση χρηστών που δεν έχουν πληκτρολογήσει τίποτα για μία ώρα αλλά που εξακολουθούν να λαμβάνουν συχνά μηνύματα συστήματος:

αλληλεπίδραση - εισαγωγή $ user_spawn_id timeout 3600 επιστροφή-εξόδου \ $ spawn_id

Αν το πρότυπο είναι η λέξη null και επιτρέπονται nulls (μέσω της εντολής remove_nulls ), το αντίστοιχο σώμα εκτελείται αν αντιστοιχεί ένα μόνο ASCII 0. Δεν είναι δυνατή η αντιστοίχιση 0 byte μέσω μοτίβων glob ή regexp.

Προβαθμίζοντας ένα μοτίβο με τη σημαία -wririte, η μεταβλητή interact_out (spawn_id) θα ρυθμιστεί στο spawn_id που ταιριάζει με το μοτίβο (ή eof).

Ενέργειες όπως η διακοπή και η συνέχιση δημιουργούν δομές ελέγχου (δηλ. Για proc ) για να συμπεριφέρονται με τον συνήθη τρόπο. Ωστόσο, οι αιτίες επιστροφής αλληλεπιδρούν για να επιστρέψουν στον καλούντα, ενώ οι αιτίες inter_return αλληλεπιδρούν για να προκαλέσουν επιστροφή στον καλούντα. Για παράδειγμα, εάν το "proc foo" ονομάζεται αλληλεπιδρούν και στη συνέχεια εκτελείται η ενέργεια inter_return , ο proc foo θα επέστρεφε. (Αυτό σημαίνει ότι εάν αλληλεπιδρούν οι κλήσεις με διερμηνέα , η αλληλογραφία με την επιστροφή θα προκαλέσει τη συνέχιση της αλληλεπίδρασης, ενώ η inter_return θα προκαλέσει την αλληλεπίδραση να επιστρέψει στον καλούντα.)

Κατά τη διάρκεια της αλληλεπίδρασης χρησιμοποιείται η ακατέργαστη λειτουργία, έτσι ώστε όλοι οι χαρακτήρες να μπορούν να μεταβιβαστούν στην τρέχουσα διαδικασία . Αν η τρέχουσα διαδικασία δεν εντοπίσει τα σήματα ελέγχου της εργασίας, θα σταματήσει εάν σταλεί ένα σήμα διακοπής (από προεπιλογή ^ Z). Για να το επανεκκινήσετε, στείλτε ένα μήνυμα συνεχούς κλήσης (όπως π.χ. με το "kill-CONT"). Αν θέλετε πραγματικά να στείλετε ένα SIGSTOP σε μια τέτοια διαδικασία (από ^ Z), σκεφτείτε πρώτα την αναπαραγωγή csh και στη συνέχεια εκτελέστε το πρόγραμμά σας. Από την άλλη πλευρά, εάν θέλετε να στείλετε ένα SIGSTOP για να αναμείνετε τον εαυτό σας, καλείτε πρώτα τον διερμηνέα (ίσως χρησιμοποιώντας έναν χαρακτήρα διαφυγής) και, στη συνέχεια, πιέστε το πλήκτρο ^ Z.

Τα ζεύγη συμβολοσειρών μπορούν να χρησιμοποιηθούν ως συντομογραφία για να αποφευχθεί η είσοδος στον διερμηνέα και η εκτέλεση εντολών διαδραστικά. Η προηγούμενη λειτουργία τερματικού χρησιμοποιείται ενώ εκτελείται το σώμα ενός ζεύγους στοιχειοσειράς-σώματος.

Για την ταχύτητα, οι ενέργειες εκτελούνται από προεπιλογή σε ακατέργαστη λειτουργία. Η σημαία -reset επαναφέρει το τερματικό στην κατάσταση λειτουργίας που είχε πριν εκτελεστεί η αλληλεπίδραση (πάντοτε στη λειτουργία μαγειρέματος). Σημειώστε ότι οι χαρακτήρες που εισάγονται κατά τη μεταγωγή της λειτουργίας ενδέχεται να χαθούν (ένα ατυχές χαρακτηριστικό του προγράμματος οδήγησης του τερματικού σε ορισμένα συστήματα). Ο μόνος λόγος για να χρησιμοποιήσετε την επαναφορά είναι εάν η ενέργεια σας εξαρτάται από τη λειτουργία σε κατάσταση μαγειρέματος.

Η σημαία -echo στέλνει χαρακτήρες που αντιστοιχούν στο ακόλουθο μοτίβο πίσω στη διαδικασία που τις δημιούργησε καθώς κάθε χαρακτήρας διαβάζεται. Αυτό μπορεί να είναι χρήσιμο όταν ο χρήστης χρειάζεται να δει ανατροφοδότηση από μερικώς δακτυλογραφημένα μοτίβα.

Αν ένα πρότυπο επαναλαμβάνεται αλλά τελικά δεν ανταποκρίνεται, οι χαρακτήρες αποστέλλονται στη διεργασία που γεννήθηκε. Εάν η διαδικασία που γεννήθηκε στη συνέχεια τους αντηχεί, ο χρήστης θα δει τους χαρακτήρες δύο φορές. -echo είναι πιθανώς μόνο κατάλληλο σε καταστάσεις όπου ο χρήστης είναι απίθανο να μην ολοκληρώσει το μοτίβο. Για παράδειγμα, το ακόλουθο απόσπασμα προέρχεται από το rftp, το σενάριο αναδρομικό-ftp, όπου ο χρήστης καλείται να εισέλθει, ~ p ή ~ l, για να βρει, να βάλει ή να ταξινομήσει τον τρέχοντα κατάλογο αναδρομικά. Αυτά είναι τόσο μακριά από τις κανονικές εντολές ftp, ότι ο χρήστης είναι απίθανο να πληκτρολογεί ~ ακολουθούμενο από οτιδήποτε άλλο, εκτός από λάθος, οπότε πιθανότατα θα αγνοήσουν το αποτέλεσμα ούτως ή άλλως.

αλληλεπιδρούν {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Η σημαία -nobuffer αποστέλλει χαρακτήρες που αντιστοιχούν στο ακόλουθο μοτίβο στη διαδικασία εξόδου καθώς διαβάζονται οι χαρακτήρες.

Αυτό είναι χρήσιμο όταν θέλετε να αφήσετε ένα πρόγραμμα να επαναφέρει το πρότυπο. Για παράδειγμα, τα ακόλουθα μπορούν να χρησιμοποιηθούν για την παρακολούθηση του τόπου κλήσης ενός ατόμου (μόντεμ τύπου Hayes). Κάθε φορά που βλέπετε το "atd", το σενάριο καταγράφει την υπόλοιπη γραμμή.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" επιστροφή βάζει $ log "[μορφή ωρολογίου [δευτερόλεπτα δευτερόλεπτα]]: dialed $ interact_out (1, string)" interact -nobuffer "atd"

Κατά τη διάρκεια της αλληλεπίδρασης , η προηγούμενη χρήση του log_user αγνοείται. Συγκεκριμένα, η αλληλεπίδραση θα αναγκάσει την έξοδο της να καταγραφεί (αποστέλλεται στην τυπική έξοδο), δεδομένου ότι υποτίθεται ότι ο χρήστης δεν επιθυμεί να αλληλεπιδράσει τυφλά.

Η σημαία -o προκαλεί την εφαρμογή οποιωνδήποτε ακόλουθων ζευγών κλειδιού-σώματος στην έξοδο της τρέχουσας διαδικασίας . Αυτό μπορεί να είναι χρήσιμο, για παράδειγμα, όταν πρόκειται για κεντρικούς υπολογιστές που στέλνουν ανεπιθύμητους χαρακτήρες κατά τη διάρκεια μιας περιόδου λειτουργίας telnet.

Από προεπιλογή, η αλληλεπίδραση αναμένει ότι ο χρήστης θα γράψει stdin και θα διαβάζει το stdout της ίδιας της διαδικασίας Expect . Η σημαία -u (για το χρήστη) κάνει την αλληλεπίδραση του χρήστη με τη διαδικασία που ονομάζεται από το όρισμα του (το οποίο πρέπει να είναι ένα γονίδιο που δημιούργησε).

Αυτό επιτρέπει τη σύνδεση δύο μη σχετικών διαδικασιών χωρίς τη χρήση ενός ρητού βρόχου. Για να βοηθήσετε στην απομάκρυνση των σφαλμάτων, αναμένετε ότι τα διαγνωστικά πάνε πάντα στο stderr (ή stdout για ορισμένες πληροφορίες καταγραφής και εντοπισμού σφαλμάτων). Για τον ίδιο λόγο, η εντολή διερμηνέα θα διαβάσει διαδραστικά από τον stdin.

Για παράδειγμα, το ακόλουθο τμήμα δημιουργεί μια διαδικασία σύνδεσης. Στη συνέχεια, καλεί τον χρήστη (δεν φαίνεται) και τελικά συνδέει τα δύο μαζί. Φυσικά, οποιαδήποτε διαδικασία μπορεί να αντικατασταθεί από την είσοδο. Ένα κέλυφος, για παράδειγμα, θα επέτρεπε στο χρήστη να δουλεύει χωρίς να παρέχει λογαριασμό και κωδικό πρόσβασης.

spawn login set $ spawn_id spawn μόντεμ # κλήση πίσω στο χρήστη # σύνδεση χρήστης να συνδεθεί αλληλεπιδρούν -u $ login

Για να στείλετε την έξοδο σε πολλαπλές διεργασίες, απαριθμήστε κάθε λίστα αναγνωριστικών ωοτοκίας που προηγήθηκε με τη σημαία -output . Η είσοδος για μια ομάδα εξόδων ριπών εξόδου μπορεί να προσδιοριστεί από έναν κατάλογο αναγνωριστικών ωοτοκίας που προηγήθηκε από μια σημαία εισόδου. (Τόσο η είσοδος όσο και η έξοδος μπορούν να πάρουν λίστες με την ίδια μορφή με τη σημαία -i στην εντολή expect , εκτός από το ότι any_spawn_id δεν έχει νόημα να αλληλεπιδράσει .) Όλες οι ακόλουθες σημαίες και συμβολοσειρές (ή μοτίβα) εμφανίζεται η σημαία εισαγωγής. Αν δεν εμφανιστεί καμία εισαγωγή, το -output υποδηλώνει "-input $ user_spawn_id -output". (Παρομοίως, με μοτίβα που δεν έχουν -για την εισαγωγή .) Αν καθορίζεται μία είσοδος, αντικαθιστά το $ user_spawn_id. Εάν έχει οριστεί μια δεύτερη είσοδος , αντικαθιστά το $ spawn_id. Μπορούν να καθοριστούν πρόσθετες σημαίες εισόδου .

Οι δύο υποθετικές διαδικασίες εισαγωγής προεπιλεγμένες ώστε να έχουν τις εξόδους τους καθορισμένες ως $ spawn_id και $ user_spawn_id (αντίστροφα). Εάν εμφανίζεται μια σημαία εισόδου χωρίς σημαία εξόδου , οι χαρακτήρες από αυτήν τη διαδικασία απορρίπτονται.

Η σημαία -i εισάγει μια αντικατάσταση για το τρέχον spawn_id όταν δεν χρησιμοποιούνται άλλες σημαίες εισόδου ή εξόδου . Η σημαία A -i υποδηλώνει σημαία -o.

Είναι δυνατό να αλλάξετε τις διεργασίες με τις οποίες αλληλεπιδρούν χρησιμοποιώντας έμμεσες εξάρσεις ωοτοκίας. (Οι έμμεσες αναγνωρίσεις σπέρματος περιγράφονται στην ενότητα σχετικά με την εντολή αναμονής.) Οι έμμεσες αναγνωρίσεις αναπαραγωγής μπορούν να καθοριστούν με τις σημαίες -i, -u, -input ή -outout.

διερμηνέας [args]
προκαλεί στο χρήστη να ερωτηθεί διαδραστικά για τις εντολές Expect και Tcl. Το αποτέλεσμα κάθε εντολής εκτυπώνεται.

Ενέργειες όπως η διακοπή και η συνέχιση δημιουργούν δομές ελέγχου (δηλ. Για proc ) για να συμπεριφέρονται με τον συνήθη τρόπο. Ωστόσο, η επιστροφή προκαλεί την επανάληψη του διερμηνέα στον καλούντα, ενώ το inter_return προκαλεί την ερμηνεία του διερμηνέα ώστε να επιστρέψει στον καλούντα. Για παράδειγμα, εάν ο "proc foo" ονομάζεται διερμηνέας που στη συνέχεια εκτέλεσε την ενέργεια inter_return , ο proc foo θα επέστρεφε. Οποιαδήποτε άλλη εντολή αναγκάζει τον διερμηνέα να συνεχίσει να ζητά νέες εντολές.

Από προεπιλογή, η προτροπή περιέχει δύο ακέραιους αριθμούς. Ο πρώτος ακέραιος περιγράφει το βάθος της στοίβας αξιολόγησης (δηλαδή πόσες φορές έχει κληθεί η Tcl_Eval). Ο δεύτερος ακέραιος είναι το αναγνωριστικό ιστορικού Tcl. Η ερώτηση μπορεί να οριστεί καθορίζοντας μια διαδικασία που ονομάζεται "prompt1" της οποίας η τιμή επιστροφής γίνεται η επόμενη προτροπή. Αν μια δήλωση έχει ανοικτά εισαγωγικά, παρενθέσεις, τιράντες ή παρενθέσεις, εκδίδεται μια δευτερεύουσα ερώτηση (από προεπιλογή "+>") κατά τη νέα γραμμή. Η δευτερεύουσα ερώτηση μπορεί να οριστεί καθορίζοντας μια διαδικασία που ονομάζεται "prompt2".

Κατά τη διάρκεια του διερμηνέα , χρησιμοποιείται η μαγειρευμένη λειτουργία, ακόμη και αν ο καλών της χρησιμοποιεί ακατέργαστη λειτουργία.

Αν ο stdin είναι κλειστός, ο διερμηνέας θα επιστρέψει εκτός αν χρησιμοποιηθεί η σημαία -eof , στην οποία περίπτωση θα επικαλεσθεί το επόμενο όρισμα.

log_file [args] [[-α] αρχείο]
Αν παρέχεται ένα όνομα αρχείου, το log_file θα καταγράψει ένα αρχείο μεταγραφής της περιόδου λειτουργίας (αρχής από εκείνο το σημείο) στο αρχείο. Το log_file θα σταματήσει την εγγραφή αν δεν έχει δοθεί κάποιο όρισμα. Οποιοδήποτε προηγούμενο αρχείο καταγραφής κλείνει.

Αντί ενός ονόματος αρχείου, μπορεί να παρέχεται ένα αναγνωριστικό αρχείου Tcl χρησιμοποιώντας τις σημαίες -open ή -leaveopen . Αυτό είναι παρόμοιο με την εντολή spawn . (Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα).)

Οι εξόδους σημαίας -a εξόδου για καταγραφή που καταστέλλεται από την εντολή log_user .

Από προεπιλογή, η εντολή log_file προστίθεται στα παλιά αρχεία αντί να τους κόβει, για την ευκολία να μπορούν να αποσυνδέονται και να εκτελούνται πολλές φορές σε μία συνεδρία. Για να κόψετε τα αρχεία, χρησιμοποιήστε τη σημαία -notappend .

Η σημαία -info προκαλεί το log_file για να επιστρέψει μια περιγραφή των πιο πρόσφατων μη-πληροφοριών παραδειγμάτων .

log_user -info | 0 | 1
Από προεπιλογή, ο διάλογος αποστολής / αναμονής καταγράφεται στο stdout (και ένα αρχείο καταγραφής αν είναι ανοιχτό). Η καταχώρηση στο stdout απενεργοποιείται από την εντολή "log_user 0" και ενεργοποιείται ξανά από το "log_user 1". Η καταγραφή στο αρχείο καταγραφής είναι αμετάβλητη.

Η σημαία -info αναγκάζει το log_user να επιστρέψει μια περιγραφή των πιο πρόσφατων μη-πληροφοριών παραδειγμάτων.

match_max [-d] [-i spawn_id] [μέγεθος]
ορίζει το μέγεθος του buffer (σε bytes) που χρησιμοποιείται εσωτερικά από το αναμενόμενο . Με κανένα επιχείρημα μεγέθους, επιστρέφεται το τρέχον μέγεθος.

Με τη σημαία -d , έχει οριστεί το προεπιλεγμένο μέγεθος. (Η αρχική προεπιλογή είναι 2000.) Με τη σημαία -i , το μέγεθος έχει οριστεί για το όνομα spawn id, διαφορετικά έχει οριστεί για την τρέχουσα διαδικασία .

επικάλυψη [- # spawn_id] [- # spawn_id] [...] πρόγραμμα [args]
εκτελεί " αρχεία προγράμματος " στη θέση του τρέχοντος προγράμματος Expect , το οποίο τερματίζεται. Ένα γυμνό σχόλιο παύλα υποχρεώνει μια παύλα μπροστά από το όνομα της εντολής σαν να ήταν ένα κέλυφος σύνδεσης. Όλα τα spawn_ids είναι κλειστά εκτός από εκείνα που ονομάζονται ως arguments. Αυτά χαρτογραφούνται στα αναγνωριστικά αρχείων που ονομάζονται.

Τα Spawn_ids αντιστοιχίζονται σε αναγνωριστικά αρχείων για να κληρονομήσουν το νέο πρόγραμμα. Για παράδειγμα, η ακόλουθη γραμμή τρέχει το σκάκι και επιτρέπει να ελέγχεται από την τρέχουσα διαδικασία - ας πούμε, ένα master σκάκι.

επικάλυψη -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id σκάκι

Αυτό είναι πιο αποτελεσματικό από το "interact -u", ωστόσο, θυσιάζει την ικανότητα να κάνει προγραμματισμένη αλληλεπίδραση αφού η διαδικασία Expect δεν είναι πλέον σε έλεγχο.

Σημειώστε ότι δεν υπάρχει τερματικό ελέγχου. Έτσι, αν αποσυνδέσετε ή επαναπροσδιορίσετε την τυπική είσοδο, τα προγράμματα που κάνουν έλεγχο της εργασίας (κελύφη, σύνδεση, κ.λπ.) δεν θα λειτουργήσουν σωστά.

ισοτιμία [-d] [-i spawn_id] [αξία]
ορίζει αν η ισοτιμία θα πρέπει να διατηρείται ή να απογυμνώνεται από την έξοδο των γεννηθεισών διαδικασιών. Αν η τιμή είναι μηδέν, αποτιμάται η ισοτιμία, διαφορετικά δεν αφαιρείται. Με κανένα επιχείρημα τιμής, επιστρέφεται η τρέχουσα τιμή.

Με τη σημαία -d , έχει οριστεί η προεπιλεγμένη τιμή ισοτιμίας. (Η αρχική προεπιλογή είναι 1, δηλαδή η ισοτιμία δεν απογυμνώνεται.) Με τη σημαία -i , η τιμή ισοτιμίας έχει οριστεί για το όνομα id spawn, διαφορετικά έχει οριστεί για την τρέχουσα διαδικασία .

remove_nulls [-d] [-i spawn_id] [αξία]
ορίζει αν τα μηδενικά διατηρούνται ή αφαιρούνται από την έξοδο των διεργασιών που δημιουργήθηκαν πριν από την αντιστοίχιση ή την αποθήκευση των προτύπων στη μεταβλητή expect_out ή interact_out . Εάν η τιμή είναι 1, καταργούνται τα μηδενικά. Εάν η τιμή είναι 0, τα nulls δεν καταργούνται. Με κανένα επιχείρημα τιμής, επιστρέφεται η τρέχουσα τιμή.

Με τη σημαία -d , έχει οριστεί η προεπιλεγμένη τιμή. (Η αρχική προεπιλογή είναι 1, δηλαδή καταργούνται τα nulls.) Με τη σημαία -i , η τιμή έχει οριστεί για το όνομα id spawn, διαφορετικά έχει οριστεί για την τρέχουσα διαδικασία .

Εάν αφαιρεθούν ή όχι μηδενικά, αναμένετε ότι θα καταγράψει μηδενικά bytes στο αρχείο καταγραφής και στο stdout.

στείλτε τη συμβολοσειρά [-flags]
Στέλνει τη συμβολοσειρά στην τρέχουσα διαδικασία . Για παράδειγμα, η εντολή

στείλτε "hello world \ r"

στέλνει τους χαρακτήρες, το helloworld στην τρέχουσα διαδικασία . (Το Tcl περιλαμβάνει μια εντολή τύπου printf (που ονομάζεται μορφή ) η οποία μπορεί να κατασκευάσει αυθαίρετα πολύπλοκες χορδές.)

Οι χαρακτήρες αποστέλλονται αμέσως, παρόλο που τα προγράμματα με γραμμική μνήμη εισόδου δεν διαβάζουν τους χαρακτήρες μέχρι να σταλεί ένας χαρακτήρας επιστροφής. Ένας χαρακτήρας επιστροφής σημειώνεται "\ r".

Η - σημαία υποχρεώνει το επόμενο επιχείρημα να ερμηνευτεί ως μια συμβολοσειρά παρά ως μια σημαία. Οποιαδήποτε συμβολοσειρά μπορεί να προηγείται από το "-" αν πράγματι μοιάζει με σημαία. Αυτό παρέχει ένα αξιόπιστο μηχανισμό για τον καθορισμό των μεταβλητών συμβολοσειρών χωρίς να παρακωλύεται από εκείνους που τυχαία μοιάζουν με σημαίες. (Όλες οι συμβολοσειρές που αρχίζουν με "-" προορίζονται για μελλοντικές επιλογές.)

Η σημαία -i δηλώνει ότι η συμβολοσειρά στέλνεται στο όνομα spawn_id. Εάν το spawn_id είναι user_spawn_id και το τερματικό βρίσκεται σε κατάσταση raw, νέες γραμμές στη συμβολοσειρά μεταφράζονται σε ακολουθίες return-newline έτσι ώστε να εμφανίζονται σαν το τερματικό σε κατάσταση μαγειρέματος. Η σημαία -raw απενεργοποιεί αυτή τη μετάφραση.

Η σημαία -null στέλνει μηδενικούς χαρακτήρες (0 bytes). Από προεπιλογή, αποστέλλεται ένα μηδέν. Ένας ακέραιος αριθμός μπορεί να ακολουθήσει το πλήκτρο -null για να υποδείξει πόσα nulls να στείλει.

Η σημαία -break δημιουργεί μια κατάσταση διακοπής. Αυτό έχει νόημα μόνο αν το id spawn αναφέρεται σε μια συσκευή tty που ανοίγει μέσω του "spawn -open". Αν έχετε δημιουργήσει μια διαδικασία όπως η συμβουλή, θα πρέπει να χρησιμοποιήσετε τη σύμβαση συμβουλών για να δημιουργήσετε ένα διάλειμμα.

Οι έξοδοι -s σημαίας εξόδου για να σταλούν "αργά", αποφεύγοντας έτσι την κοινή κατάσταση όπου ένας υπολογιστής outtypes ένα buffer εισόδου που είχε σχεδιαστεί για έναν άνθρωπο που ποτέ δεν θα outtype το ίδιο buffer . Αυτή η έξοδος ελέγχεται από την τιμή της μεταβλητής "send_slow" η οποία λαμβάνει μια λίστα δύο στοιχείων. Το πρώτο στοιχείο είναι ένας ακέραιος που περιγράφει τον αριθμό των bytes που στέλνονται ατομικά. Το δεύτερο στοιχείο είναι ένας πραγματικός αριθμός που περιγράφει τον αριθμό των δευτερολέπτων με τα οποία πρέπει να διαχωρίζονται τα ατομικά μηνύματα. Για παράδειγμα, "set send_slow {10 .001}" θα αναγκάσει "send -s" για να στείλει συμβολοσειρές με 1 χιλιοστά του δευτερολέπτου μεταξύ κάθε 10 χαρακτήρων που στέλνονται.

Οι δυνάμεις -h σημαίας σημαίνουν ότι πρέπει να αποστέλλονται (κάπως) σαν ένας άνθρωπος που δακτυλογράφει πραγματικά. Εμφανίζονται καθυστερήσεις μεταξύ των χαρακτήρων. (Ο αλγόριθμος βασίζεται σε μια κατανομή Weibull, με τροποποιήσεις που ταιριάζουν στη συγκεκριμένη εφαρμογή.) Αυτή η έξοδος ελέγχεται από την τιμή της μεταβλητής "send_human" η οποία λαμβάνει μια λίστα πέντε στοιχείων. Τα πρώτα δύο στοιχεία είναι ο μέσος χρόνος διάρκειας των χαρακτήρων σε δευτερόλεπτα. Το πρώτο χρησιμοποιείται από προεπιλογή. Το δεύτερο χρησιμοποιείται σε τελικές λέξεις, για να προσομοιώνει τις λεπτές παύσεις που εμφανίζονται περιστασιακά σε τέτοιες μεταβάσεις. Η τρίτη παράμετρος είναι ένα μέτρο μεταβλητότητας όπου το .1 είναι αρκετά μεταβλητό, το 1 είναι λογικά μεταβλητό και το 10 είναι πολύ αμετάβλητο. Τα άκρα είναι 0 έως άπειρο. Οι τελευταίες δύο παράμετροι είναι, αντίστοιχα, ο ελάχιστος και ο μέγιστος χρόνος επιβίβασης. Το ελάχιστο και το μέγιστο χρησιμοποιούνται τελευταία και "clip" την τελευταία φορά. Ο τελικός μέσος όρος μπορεί να είναι αρκετά διαφορετικός από τον δεδομένο μέσο όρο εάν οι ελάχιστες και οι μέγιστες τιμές του κλιπ είναι αρκετές.

Για παράδειγμα, η ακόλουθη εντολή εξομοιώνει έναν γρήγορο και συνεπή δακτυλογράφο:

set send_human {.1 .3 1 .05 2} αποστολή -h "Είμαι πεινασμένος. Ας κάνουμε μεσημεριανό γεύμα."

ενώ τα ακόλουθα μπορεί να είναι πιο κατάλληλα μετά από ένα hangover:

ορίστε send_human {.4 .4 .2 .5 100} στείλτε -h "Goodd πάρτι βράδυ βράδυ!"

Σημειώστε ότι τα σφάλματα δεν προσομοιάζονται, αν και μπορείτε να ρυθμίσετε μόνοι σας καταστάσεις διόρθωσης σφαλμάτων ενσωματώνοντας λάθη και διορθώσεις σε ένα επιχείρημα αποστολής.

Οι σημαίες για την αποστολή μηδενικών χαρακτήρων, την αποστολή διακοπών, την αναγκαστική αργή έξοδο και την έξοδο σε ανθρώπινο στυλ είναι αμοιβαία αποκλειστικές. Θα χρησιμοποιηθεί μόνο αυτή που καθορίστηκε τελευταία. Επιπλέον, δεν μπορεί να καθοριστεί παράγων συμβολοσειράς με τις σημαίες για την αποστολή μηδενικών χαρακτήρων ή διακοπών.

Είναι μια καλή ιδέα να προηγηθεί η πρώτη αποστολή σε μια διαδικασία από την αναμονή . αναμένουν ότι θα περιμένουν να ξεκινήσει η διαδικασία , ενώ η αποστολή δεν μπορεί. Ειδικότερα, εάν ολοκληρωθεί η πρώτη αποστολή προτού αρχίσει η διαδικασία , κινδυνεύετε να αγνοήσετε τα δεδομένα σας. Σε περιπτώσεις όπου τα διαδραστικά προγράμματα δεν προσφέρουν αρχική προτροπή, μπορείτε να προχωρήσετε στην αποστολή με καθυστέρηση όπως στο:

# Για να αποφύγετε να δώσετε συμβουλές hackers σχετικά με το πώς να εισέλθει, # το σύστημα αυτό δεν προτρέπει για έναν εξωτερικό κωδικό πρόσβασης. # Περιμένετε 5 δευτερόλεπτα για exec για να ολοκληρωθεί spawn telnet very.secure.gov ύπνος 5 στείλετε τον κωδικό πρόσβασης

exp_send είναι ένα ψευδώνυμο για αποστολή. Εάν χρησιμοποιείτε το Expectk ή κάποια άλλη παραλλαγή του Expect στο περιβάλλον Tk, η αποστολή ορίζεται από το Tk για έναν τελείως διαφορετικό σκοπό. exp_send παρέχεται για τη συμβατότητα μεταξύ των περιβαλλόντων. Παρόμοια ψευδώνυμα παρέχονται και για άλλες εντολές αποστολής της Expect.

send_error [-flags] συμβολοσειρά
είναι σαν να στείλετε , εκτός από το ότι η έξοδος αποστέλλεται στον stderr και όχι στην τρέχουσα διαδικασία .

send_log [-] συμβολοσειρά
είναι σαν την αποστολή , εκτός από το ότι η συμβολοσειρά αποστέλλεται μόνο στο αρχείο καταγραφής (βλ. log_file .) Τα επιχειρήματα αγνοούνται αν δεν είναι ανοιχτό κανένα αρχείο καταγραφής.

send_tty [-flags] συμβολοσειρά
είναι σαν να στείλετε , εκτός από το ότι η έξοδος αποστέλλεται στο / dev / tty παρά στην τρέχουσα διαδικασία .

send_user [-flags] συμβολοσειρά
είναι σαν να στείλετε , εκτός από το ότι η έξοδος στέλνεται στο stdout παρά στην τρέχουσα διαδικασία .

ύπνου
προκαλεί το σενάριο να κοιμάται για τον δεδομένο αριθμό δευτερολέπτων. Τα δευτερόλεπτα μπορεί να είναι ένας δεκαδικός αριθμός. Διακοπεί (και συμβάντα Tk, αν χρησιμοποιείτε το Expectk) επεξεργάζεστε ενώ αναμένετε το Sleep.

spawn [args] πρόγραμμα [args]
δημιουργεί μια νέα διαδικασία που τρέχει " args προγράμματος ". Ο stdin, stdout και stderr συνδέονται με το Expect, έτσι ώστε να μπορούν να διαβάζονται και να γράφονται από άλλες εντολές Expect . Η σύνδεση διακόπτεται κλείνοντας ή εάν η ίδια η διαδικασία κλείνει κάποιο από τα αναγνωριστικά αρχείου.

Όταν μια διαδικασία ξεκινάει από την αναπαραγωγή , η μεταβλητή spawn_id ορίζεται σε έναν περιγραφέα που αναφέρεται σε αυτή τη διαδικασία . Η διαδικασία που περιγράφεται από το spawn_id θεωρείται η "τρέχουσα διαδικασία ". το spawn_id μπορεί να διαβαστεί ή να γραφτεί, πράγμα που παρέχει έλεγχο της εργασίας.

Το user_spawn_id είναι μια σφαιρική μεταβλητή που περιέχει έναν περιγραφέα ο οποίος αναφέρεται στον χρήστη. Για παράδειγμα, όταν το spawn_id έχει οριστεί σε αυτήν την τιμή, περιμένετε να συμπεριφέρεται όπως το expect_user .

.I error_spawn_id είναι μια σφαιρική μεταβλητή που περιέχει έναν περιγραφέα που αναφέρεται στο τυπικό σφάλμα. Για παράδειγμα, όταν το spawn_id έχει οριστεί σε αυτήν την τιμή, η αποστολή συμπεριφέρεται σαν send_error .

Το tty_spawn_id είναι μια σφαιρική μεταβλητή που περιέχει έναν περιγραφέα που αναφέρεται στο / dev / tty. Εάν το / dev / tty δεν υπάρχει (όπως σε ένα script cron, at ή batch), τότε το tty_spawn_id δεν έχει οριστεί. Αυτό μπορεί να δοκιμαστεί ως εξής:

αν {{vars tty_spawn_id]} {# / dev / tty υπάρχει} αλλιώς {# / dev / tty δεν υπάρχει # πιθανώς σε cron, παρτίδα ή σε δέσμη ενεργειών}

spawn επιστρέφει την ταυτότητα διαδικασίας UNIX. Αν δεν δημιουργηθεί καμία διαδικασία , επιστρέφει 0. Η μεταβλητή spawn_out (σκλάβος, όνομα) έχει οριστεί στο όνομα της συσκευής pty slave.

Από προεπιλογή, το spawn αντηχεί το όνομα της εντολής και τα επιχειρήματα. Η σημαία -noecho σταματά να αναδύεται από αυτό.

Η σημαία -console προκαλεί την ανακατεύθυνση της εξόδου της κονσόλας στη διεργασία που δημιουργήθηκε. Αυτό δεν υποστηρίζεται σε όλα τα συστήματα.

Εσωτερικά, ο spawn χρησιμοποιεί ένα pty, προετοιμασμένο με τον ίδιο τρόπο όπως το tty του χρήστη. Αυτό προετοιμάζεται περαιτέρω έτσι ώστε όλες οι ρυθμίσεις να είναι "λογικές" (σύμφωνα με το stty (1)). Εάν ορίζεται η μεταβλητή stty_init , ερμηνεύεται ως στυλ αντιστοίχησης ως περαιτέρω διαμόρφωση. Για παράδειγμα, το "set stty_init raw" θα προκαλέσει την εκκίνηση των τερματικών των περαιτέρω διεργασιών που ξεκίνησαν σε ακατέργαστη λειτουργία. -nottycopy παραλείπει την αρχικοποίηση με βάση το tty του χρήστη. -nottyinit παραλείπει την " έξυπνη " προετοιμασία.

Κανονικά, το spawn χρειάζεται λίγο χρόνο για να εκτελέσει. Αν παρατηρήσετε ότι ο ωοτοκίας παίρνει ένα σημαντικό χρονικό διάστημα, πιθανότατα συναντάτε ptys που είναι σφηνωμένα. Ορισμένες δοκιμές εκτελούνται σε ptys για να αποφευχθούν εμπλοκές με παραπλανητικές διαδικασίες. (Αυτά παίρνουν 10 δευτερόλεπτα ανά σφήνα pty.) Το Running Expect με την επιλογή -d θα δείξει εάν το Expect συναντά πολλές ptys σε περιττές καταστάσεις. Εάν δεν μπορείτε να σκοτώσετε τις διεργασίες στις οποίες επισυνάπτονται αυτές οι ptys, η μόνη σας προσφυγή μπορεί να είναι η επανεκκίνηση.

Εάν το πρόγραμμα δεν μπορεί να δημιουργηθεί επιτυχώς επειδή το exec (2) αποτυγχάνει (π.χ. όταν το πρόγραμμα δεν υπάρχει), θα επιστραφεί ένα μήνυμα σφάλματος από την επόμενη εντολή αλληλεπίδρασης ή αναμονής, σαν να είχε τρέξει το πρόγραμμα και να παραγάγει το μήνυμα σφάλματος ως έξοδο. Αυτή η συμπεριφορά είναι μια φυσική συνέπεια της εφαρμογής του spawn . Εσωτερικά, περόνες ψεκασμού, μετά την οποία η διαδικασία που γεννήθηκε δεν έχει τρόπο επικοινωνίας με την αρχική διαδικασία Expect εκτός από την επικοινωνία μέσω του spawn_id.

Η σημαία -open προκαλεί την ερμηνεία του επόμενου όρου ως αναγνωριστικό αρχείου Tcl (δηλαδή επιστρέφεται με ανοιχτό .) Το id spawn μπορεί στη συνέχεια να χρησιμοποιηθεί σαν να ήταν μια διαδικασία που γεννήθηκε. (Το αναγνωριστικό αρχείου δεν θα πρέπει πλέον να χρησιμοποιείται.) Αυτό σας επιτρέπει να αντιμετωπίζετε τις πρώτες συσκευές, τα αρχεία και τους αγωγούς ως διαδικασίες που έχουν δημιουργηθεί χωρίς τη χρήση ενός pty. 0 επιστρέφεται για να υποδεικνύει ότι δεν υπάρχει σχετική διαδικασία . Όταν είναι κλειστή η σύνδεση με τη διαδικασία που γεννήθηκε, το ίδιο είναι το αναγνωριστικό αρχείου Tcl. Η σημαία -leaveopen είναι παρόμοια με το άνοιγμα, εκτός από το ότι -leaveopen αναγκάζει το αναγνωριστικό αρχείου να παραμείνει ανοιχτό ακόμη και μετά το κλείσιμο του id spawn.

Η σημαία -typ προκαλεί το άνοιγμα του pty, αλλά δεν δημιουργήθηκε καμία διαδικασία . 0 επιστρέφεται για να υποδεικνύει ότι δεν υπάρχει σχετική διαδικασία . Το Spawn_id ορίζεται ως συνήθως.

Η μεταβλητή spawn_out (slave, fd) έχει οριστεί σε ένα αναγνωριστικό αρχείου που αντιστοιχεί στον pty slave. Μπορεί να κλείσει χρησιμοποιώντας "close-slave".

Η σημαία -ignore ορίζει ένα σήμα που πρέπει να αγνοηθεί στη διαδικασία που δημιουργήθηκε. Διαφορετικά, τα σήματα λαμβάνουν την προεπιλεγμένη συμπεριφορά. Τα σήματα ονομάζονται όπως στην εντολή trap , εκτός από το ότι κάθε σήμα απαιτεί ξεχωριστή σημαία.

επίπεδο στραγγαλισμού
προκαλεί την εκτύπωση των ακόλουθων δηλώσεων πριν από την εκτέλεσή τους. (Η εντολή Trace εντοπίζει τις μεταβλητές.) Το επίπεδο δείχνει πόσο μακριά βρίσκεται η στοίβα κλήσεων για τον εντοπισμό. Για παράδειγμα, η ακόλουθη εντολή τρέχει Αναμονή κατά τον εντοπισμό των πρώτων 4 επιπέδων κλήσεων, αλλά καμία από αυτά δεν είναι κάτω από αυτό.

περιμένετε -c "strace 4" script.exp

Η σημαία -info αναγκάζει το strace να επιστρέψει μια περιγραφή των πιο πρόσφατων μη-πληροφοριών παραδειγμάτων .

stty args
αλλάζει τις λειτουργίες τερματικού παρόμοια με την εξωτερική εντολή stty.

Από προεπιλογή, έχετε πρόσβαση στο τερματικό ελέγχου. Οι άλλοι τερματικοί σταθμοί είναι προσβάσιμοι προσθέτοντας "Requests for status επιστρέφοντας το ως αποτέλεσμα της εντολής. Αν δεν ζητηθεί κατάσταση και προσπελάσει το τερματικό ελέγχου, επιστρέφει η προηγούμενη κατάσταση των πρώτων και των ηχώ χαρακτηριστικών σε μορφή που αργότερα μπορεί να γίνει που χρησιμοποιείται από την εντολή.

Για παράδειγμα, τα ανεπεξέργαστα ή -απεξεργασμένα επιχειρήματα θέτουν το τερματικό σε ακατέργαστη λειτουργία. Τα επιχειρήματα -για παράδειγμα ή μαγειρεμένα, έθεσαν το τερματικό σε κατάσταση μαγειρέματος. Τα επιχειρήματα echo και -έχουμε να θέσουμε το τερματικό σε λειτουργία echo και noecho αντίστοιχα.

Το ακόλουθο παράδειγμα περιγράφει τον τρόπο προσωρινής απενεργοποίησης της αντήχησης. Αυτό θα μπορούσε να χρησιμοποιηθεί σε διαφορετικά αυτόματα σενάρια για να αποφευχθεί η ενσωμάτωση κωδικών πρόσβασης σε αυτά. (Δείτε περισσότερες συζητήσεις σχετικά με αυτό κάτω από EXPECT ΣΥΜΒΟΥΛΕΣ παρακάτω.)

stty -echo send_user "Κωδικός πρόσβασης:" expect_user -re "(. *) \ n" ορισμός κωδικού πρόσβασης $ expect_out (1, string) stty echo

συστήματα αρχείων
δίνει args στο sh (1) ως είσοδο, ακριβώς σαν να είχε πληκτρολογηθεί ως εντολή από ένα τερματικό. Περιμένετε να περιμένετε έως ότου τελειώσει το κέλυφος. Η κατάσταση επιστροφής από το sh χειρίζεται με τον ίδιο τρόπο που το exec χειρίζεται την κατάσταση επιστροφής του.

Σε αντίθεση με το exec που ανακατευθύνει stdin και stdout στο σενάριο, το σύστημα δεν εκτελεί καμία ανακατεύθυνση (διαφορετική από εκείνη που υποδεικνύεται από την ίδια την συμβολοσειρά). Έτσι, είναι δυνατή η χρήση προγραμμάτων που πρέπει να μιλούν απευθείας στο / dev / tty. Για τον ίδιο λόγο, τα αποτελέσματα του συστήματος δεν καταγράφονται στο ημερολόγιο.

timestamp [args]
επιστρέφει μια χρονική σήμανση. Με κανένα επιχείρημα, ο αριθμός των δευτερολέπτων από την επιστροφή της εποχής.

Η σημαία -format εισάγει μια συμβολοσειρά που επιστρέφεται αλλά με υποκαταστάσεις που γίνονται σύμφωνα με τους κανόνες POSIX για το strftime. Για παράδειγμα, το% a αντικαθίσταται από ένα συντομευμένο όνομα της εβδομάδας (π.χ. Sat). Άλλοι είναι:

% a ένα συντομογραφημένο όνομα της εβδομάδας% Ένα πλήρες όνομα της εβδομάδας% b συντομογραφικό όνομα% B πλήρες όνομα μήνα% c ημερομηνία ως εξής: Τετ Οκτ 6 11:45:56 1993% d ημέρα του μήνα (01-31% H ώρα (00-23)% Ι ώρα (01-12)% j ημέρα (001-366)% m μήνας (01-12)% Μ λεπτά (00-59)% p am ή pm% S δεύτερης (00-61) % u ημέρα (1-7, Δευτέρα είναι η πρώτη ημέρα της εβδομάδας)% U εβδομάδα (00-53, πρώτη Κυριακή είναι η πρώτη ημέρα της εβδομάδας ένα)% V εβδομάδα (01-53, στυλ ISO 8601) 6)% W εβδομάδα (00-53, πρώτη Δευτέρα είναι η πρώτη ημέρα της εβδομάδας ένα)% x ημερομηνία-ώρα όπως στο: Τετ Οκτ 6 1993% Χ Χρόνος ως σε: 23:59:59% y έτος (00-99) % Y έτος ως σε: 1993% Z ζώνη ώρας (ή τίποτα αν όχι προσδιοριστέο) %% ένα γυμνό σημάδι τοις εκατό

Άλλες% προδιαγραφές είναι απροσδιόριστες. Άλλοι χαρακτήρες θα περάσουν από άθικτο. Υποστηρίζεται μόνο η γλώσσα C.

Η σημαία δευτερολέπτων εισάγει ένα δευτερόλεπτο από την εποχή που θα χρησιμοποιηθεί ως πηγή από την οποία θα μορφοποιηθεί. Διαφορετικά, χρησιμοποιείται η τρέχουσα ώρα.

Η σημαία -gmt εξάγει την έξοδο της χρονικής σήμανσης για τη χρήση της ζώνης ώρας GMT . Χωρίς σημαία, χρησιμοποιείται η τοπική ζώνη ώρας.

παγίδα [[εντολή] σήματα]
προκαλεί την εκτέλεση της δεδομένης εντολής μετά την μελλοντική λήψη οποιουδήποτε από τα συγκεκριμένα σήματα. Η εντολή εκτελείται σε παγκόσμιο πεδίο. Εάν η εντολή απουσιάζει, η ενέργεια σήματος επιστρέφεται. Εάν η εντολή είναι η συμβολοσειρά SIG_IGN, τα σήματα αγνοούνται. Εάν η εντολή είναι η συμβολοσειρά SIG_DFL, τα σήματα οδηγούν στην προεπιλογή του συστήματος. σήματα είναι είτε ένα μόνο σήμα ή μια λίστα σημάτων. Τα σήματα μπορούν να καθορίζονται αριθμητικά ή συμβολικά σύμφωνα με το σήμα (3). Το πρόθεμα "SIG" μπορεί να παραλειφθεί.

Αν δεν υπάρχουν επιχειρήματα (ή το όρισμα -number), η παγίδα επιστρέφει τον αριθμό σήματος της τρέχουσας εντολής παγίδευσης.

Η σημαία -code χρησιμοποιεί τον κωδικό επιστροφής της εντολής στη θέση του οποίου ο κώδικας Tcl επρόκειτο να επιστρέψει όταν ξεκίνησε αρχικά η εντολή.

Η σημαία -interp προκαλεί την αξιολόγηση της εντολής χρησιμοποιώντας τον ενεργό διερμηνέα τη στιγμή που άρχισε να τρέχει η εντολή και όχι όταν δηλώθηκε η παγίδα.

Η σημαία -name προκαλεί την εντολή παγίδας να επιστρέψει το όνομα του σήματος της εντολής παγίδευσης που εκτελείται αυτή τη στιγμή.

Η σημαία -max αναγκάζει την εντολή παγίδας να επιστρέψει τον μεγαλύτερο αριθμό σήματος που μπορεί να οριστεί.

Για παράδειγμα, η εντολή "trap {send_user" Ouch! "} SIGINT" θα εκτυπώσει "Ouch!" κάθε φορά που ο χρήστης πιέζει ^ C.

Από προεπιλογή, το SIGINT (το οποίο μπορεί συνήθως να παραχθεί πατώντας το πλήκτρο ^ C) και το SIGTERM να προκαλέσει την έξοδο Expect. Αυτό οφείλεται στην ακόλουθη παγίδα, που δημιουργήθηκε από προεπιλογή κατά την εκκίνηση του Expect.

έξοδος παγίδας {SIGINT SIGTERM}

Εάν χρησιμοποιείτε τη σημαία -D για να ξεκινήσετε το πρόγραμμα εντοπισμού σφαλμάτων, το SIGINT επαναπροσδιορίζεται για να ξεκινήσει το διαδραστικό εργαλείο εντοπισμού σφαλμάτων. Αυτό οφείλεται στην ακόλουθη παγίδα:

παγίδα {exp_debug 1} SIGINT

Η παγίδα εντοπισμού σφαλμάτων μπορεί να αλλάξει ρυθμίζοντας τη μεταβλητή περιβάλλοντος EXPECT_DEBUG_INIT σε μια νέα εντολή trap.

Μπορείτε, φυσικά, να παρακάμψετε και τα δύο απλά προσθέτοντας εντολές παγίδευσης στο σενάριό σας. Συγκεκριμένα, αν έχετε το δικό σας "SIGINT εξόδου παγίδας", αυτό θα αντικαταστήσει την παγίδα εντοπισμού σφαλμάτων. Αυτό είναι χρήσιμο εάν θέλετε να εμποδίσετε τους χρήστες να φτάσουν στο debugger καθόλου.

Εάν θέλετε να ορίσετε τη δική σας παγίδα στο SIGINT, αλλά ακόμα να παγιδεύσετε το πρόγραμμα εντοπισμού σφαλμάτων όταν εκτελείται, χρησιμοποιήστε:

αν {! [exp_debug]} {trap mystuff SIGINT}

Εναλλακτικά, μπορείτε να παγιδεύσετε το εργαλείο εντοπισμού σφαλμάτων χρησιμοποιώντας κάποιο άλλο σήμα.

η παγίδα δεν θα σας επιτρέψει να αντικαταστήσετε τη δράση για το SIGALRM, καθώς αυτό χρησιμοποιείται εσωτερικά για να περιμένετε . Η εντολή αποσύνδεσης ορίζει το SIGALRM σε SIG_IGN (αγνοείται). Μπορείτε να το επανενεργοποιήσετε για όσο διάστημα την απενεργοποιείτε κατά τις επόμενες εντολές αναπαραγωγής.

Δείτε το σήμα (3) για περισσότερες πληροφορίες.

περιμένετε [args]
καθυστερεί μέχρι να τερματιστεί μια διεργασία που δημιουργήθηκε (ή η τρέχουσα διαδικασία αν δεν κατονομάζεται κανένας).

αναμονή κανονικά επιστρέφει μια λίστα με τέσσερις ακέραιους αριθμούς. Ο πρώτος ακέραιος είναι το pid της διαδικασίας που περίμενε. Ο δεύτερος ακέραιος είναι το αντίστοιχο id spawn. Ο τρίτος ακέραιος είναι -1 αν παρουσιαστεί σφάλμα λειτουργικού συστήματος ή 0 διαφορετικά. Εάν ο τρίτος ακέραιος ήταν 0, ο τέταρτος ακέραιος είναι η κατάσταση που επιστρέφεται από τη διαδικασία που γεννήθηκε. Εάν ο τρίτος ακέραιος ήταν -1, ο τέταρτος ακέραιος είναι η τιμή του errno που έχει οριστεί από το λειτουργικό σύστημα. Επίσης έχει οριστεί η σφαιρική μεταβλητή errorCode.

Πρόσθετα στοιχεία ενδέχεται να εμφανιστούν στο τέλος της τιμής επιστροφής από την αναμονή . Ένα προαιρετικό πέμπτο στοιχείο προσδιορίζει μια κατηγορία πληροφοριών. Επί του παρόντος, η μόνη δυνατή τιμή για αυτό το στοιχείο είναι CHILDKILLED, οπότε οι επόμενες δύο τιμές είναι το σήμα σήματος τύπου C και μια σύντομη περιγραφή κειμένου.

Η σημαία -i δηλώνει τη διαδικασία αναμονής που αντιστοιχεί στο όνομα spawn_id (ΟΧΙ το αναγνωριστικό διαδικασίας ). Μέσα σε ένα χειριστήριο SIGCHLD, είναι δυνατόν να περιμένουμε για οποιαδήποτε διαδικασία που γεννήθηκε χρησιμοποιώντας το id spawn -1.

Η σημαία -nowait αναγκάζει την αναμονή να επιστρέψει αμέσως με την ένδειξη μιας επιτυχούς αναμονής. Όταν η διαδικασία εξέρχεται (αργότερα), θα εξαφανιστεί αυτόματα χωρίς να απαιτείται ρητή αναμονή.

Η εντολή αναμονής μπορεί επίσης να χρησιμοποιηθεί για να περιμένει μια διακεκομμένη διαδικασία χρησιμοποιώντας τα επιχειρήματα "-i -1". Σε αντίθεση με τη χρήση της με διεργασίες που δημιουργήθηκαν, αυτή η εντολή μπορεί να εκτελεστεί ανά πάσα στιγμή. Δεν υπάρχει κανένας έλεγχος για το ποια διαδικασία αποκομίζεται. Ωστόσο, η τιμή επιστροφής μπορεί να ελεγχθεί για το αναγνωριστικό διαδικασίας .

ΒΙΒΛΙΟΘΗΚΕΣ

Αναμένετε ότι αυτόματα γνωρίζει δύο ενσωματωμένες βιβλιοθήκες για τις δέσμες ενεργειών Expect. Αυτά ορίζονται από τους καταλόγους που ονομάζονται στις μεταβλητές exp_library και exp_exec_library. Και οι δύο προορίζονται να περιέχουν αρχεία χρησιμότητας που μπορούν να χρησιμοποιηθούν από άλλα σενάρια.

Το exp_library περιέχει αρχεία ανεξάρτητα από την αρχιτεκτονική. Το exp_exec_library περιέχει αρχεία εξαρτώμενα από την αρχιτεκτονική. Ανάλογα με το σύστημά σας, και οι δύο κατάλογοι μπορεί να είναι εντελώς άδειοι. Η ύπαρξη του αρχείου $ exp_exec_library / cat-buffers περιγράφει από προεπιλογή αν τα buffers σας / bin / cat.

ΕΚΤΥΠΩΣΗ

Ένας ορισμός vgrind είναι διαθέσιμος για εκτυπώσεις μεγάλου μεγέθους. Υποθέτοντας ότι ο ορισμός vgrind που παρέχεται με τη διανομή Expect έχει εγκατασταθεί σωστά, μπορείτε να τον χρησιμοποιήσετε ως εξής:

vgrind-ευέλικτο αρχείο

ΠΑΡΑΔΕΙΓΜΑΤΑ

Πολλοί δεν είναι προφανείς πώς να βάλουν τα πάντα μαζί ότι περιγράφει η σελίδα man . Σας ενθαρρύνω να διαβάσετε και να δοκιμάσετε τα παραδείγματα στον κατάλογο παραδειγμάτων της διανομής Expect . Ορισμένα από αυτά είναι πραγματικά προγράμματα. Άλλοι είναι απλώς επεξηγηματικές για ορισμένες τεχνικές, και φυσικά, ένα ζευγάρι είναι απλά γρήγορες αμυχές. Το αρχείο INSTALL έχει μια γρήγορη επισκόπηση αυτών των προγραμμάτων.

Τα έγγραφα προσδοκίας (βλέπε ΒΛΕΠΕ ΕΠΙΣΗΣ) είναι επίσης χρήσιμα. Ενώ ορισμένα έγγραφα χρησιμοποιούν σύνταξη που αντιστοιχεί σε προηγούμενες εκδόσεις του Expect, οι λογικές που συνοδεύουν εξακολουθούν να ισχύουν και εξελίσσονται πολύ περισσότερο από αυτή τη σελίδα.

ΚΑΒΑΤΕΣ

Οι επεκτάσεις ενδέχεται να συγκρουστούν με τα ονόματα εντολών του Expect. Για παράδειγμα, η αποστολή ορίζεται από το Tk για έναν τελείως διαφορετικό σκοπό. Για το λόγο αυτό, οι περισσότερες από τις εντολές Expect είναι επίσης διαθέσιμες ως "exp_XXXX". Οι εντολές και οι μεταβλητές που αρχίζουν με "exp", "inter", "spawn" και "timeout" δεν έχουν ψευδώνυμα. Χρησιμοποιήστε τα διευρυμένα ονόματα εντολών εάν χρειάζεστε αυτή τη συμβατότητα μεταξύ των περιβαλλόντων.

Αναμείνετε μια αρκετά φιλελεύθερη άποψη του πεδίου εφαρμογής. Συγκεκριμένα, οι μεταβλητές που διαβάζονται με εντολές ειδικά για το πρόγραμμα Expect θα αναζητηθούν πρώτα από την τοπική εμβέλεια και αν δεν βρεθούν στο παγκόσμιο πεδίο εφαρμογής. Για παράδειγμα, αυτό παρακάμπτει την ανάγκη να τοποθετηθεί "global timeout" σε κάθε διαδικασία που γράφετε ότι χρησιμοποιεί τις προσδοκίες . Από την άλλη πλευρά, οι μεταβλητές που γράφονται είναι πάντα στο τοπικό πεδίο εφαρμογής (εκτός εάν εκδοθεί μια "παγκόσμια" εντολή). Το πιο συνηθισμένο πρόβλημα που προκαλείται είναι όταν το spawn εκτελείται σε μια διαδικασία. Εκτός της διαδικασίας, το spawn_id δεν υπάρχει πια, οπότε η διαδικασία που γεννήθηκε δεν είναι πλέον προσπελάσιμη απλώς και μόνο λόγω οριοθέτησης. Προσθέστε μια "global spawn_id" σε μια τέτοια διαδικασία.

Εάν δεν μπορείτε να ενεργοποιήσετε την δυνατότητα πολλαπλής ανάφλεξης (δηλαδή το σύστημά σας δεν υποστηρίζει ούτε επιλογή BSD *. *), Δημοσκόπηση (SVR> 2), ούτε κάτι αντίστοιχο), αναμένετε ότι θα είναι σε θέση μόνο να ελέγχει μία μόνο διαδικασία τη φορά. Σε αυτή την περίπτωση, μην επιχειρήσετε να ορίσετε το spawn_id , ούτε πρέπει να εκτελέσετε διαδικασίες μέσω exec ενώ εκτελείται μια διαδικασία που γεννήθηκε. Επιπλέον, δεν θα μπορείτε να περιμένετε από πολλές διαδικασίες (συμπεριλαμβανομένου του χρήστη ως ένα) ταυτόχρονα.

Οι παράμετροι τερματικού μπορούν να έχουν μεγάλη επίδραση στα σενάρια. Για παράδειγμα, αν γράφεται μια δέσμη ενεργειών για να αναζητήσετε μια ηχώ, θα αποτύχει αν η απενεργοποίηση της ηχώ είναι απενεργοποιημένη. Για το λόγο αυτό, αναμένουμε από τις προεπιλεγμένες παραμέτρους των τερματικών δυνάμεων. Δυστυχώς, αυτό μπορεί να κάνει τα πράγματα δυσάρεστα για άλλα προγράμματα. Για παράδειγμα, το κέλυφος του emacs θέλει να αλλάξει τις "συνήθεις" αντιστοιχίσεις: οι νέες γραμμές χαρτογραφούνται στις νέες γραμμές αντί για τις νέες γραμμές μεταφοράς και επιστροφής και η απήχηση είναι απενεργοποιημένη. Αυτό επιτρέπει σε κάποιον να χρησιμοποιεί emacs για να επεξεργαστεί τη γραμμή εισόδου. Δυστυχώς, η Expect δεν μπορεί να μαντέψει αυτό.

Μπορείτε να ζητήσετε να μην αντικατασταθεί η προεπιλεγμένη ρύθμιση των παραμέτρων τερματικού, αλλά πρέπει να είστε πολύ προσεκτικοί όταν γράφετε σενάρια για τέτοια περιβάλλοντα. Στην περίπτωση των emacs, αποφύγετε να εξαρτάτε από πράγματα όπως echoing και end-of-line mappings.

Οι εντολές που δέχτηκαν τα επιχειρήματα που ενσωματώθηκαν σε μια ενιαία λίστα (οι αναμενόμενες παραλλαγές και η αλληλεπίδραση ) χρησιμοποιούν ένα ευρετικό για να αποφασίσουν εάν η λίστα είναι στην πραγματικότητα ένα ή πολλά. Ο ευρετικός μπορεί να αποτύχει μόνο στην περίπτωση που ο κατάλογος στην πραγματικότητα αντιπροσωπεύει ένα μόνο όρισμα που έχει πολλαπλά ενσωματωμένα \ n με χαρακτήρες που δεν είναι κενές μεταξύ τους. Αυτό φαίνεται αρκετά απίθανο, ωστόσο το επιχείρημα "-μπεραξία" μπορεί να χρησιμοποιηθεί για να αναγκάσει ένα μόνο επιχείρημα να αντιμετωπιστεί ως ένα μόνο επιχείρημα. Αυτό θα μπορούσε ενδεχομένως να χρησιμοποιηθεί με τον κώδικα Expect που δημιουργήθηκε από τον υπολογιστή. Παρομοίως, η -συγκρότηση αναγκάζει ένα μόνο επιχείρημα για να χειριστεί ως πολλαπλά μοτίβα / δράσεις.

BUGS

Ήταν πραγματικά δελεαστικό να ονομάσουμε το πρόγραμμα "φύλο" (είτε για το "Smart EXec" είτε για το "Send-Expect"), αλλά επικράτησε η καλή έννοια (ή ίσως ακριβώς ο Πουριτανισμός).

Σε ορισμένα συστήματα, όταν δημιουργείται ένα κέλυφος, διαμαρτύρεται για το γεγονός ότι δεν μπορεί να έχει πρόσβαση στο tty αλλά τρέχει ούτως ή άλλως. Αυτό σημαίνει ότι το σύστημά σας έχει έναν μηχανισμό για να αποκτήσει τον έλεγχο που δεν γνωρίζει η Expect . Μάθετε τι είναι και στείλτε αυτές τις πληροφορίες πίσω σε μένα.

Το Ultrix 4.1 (τουλάχιστον οι τελευταίες εκδόσεις γύρω από αυτό το σημείο) θεωρεί ότι τα χρονικά όρια άνω των 1000000 είναι ισοδύναμα με το 0.

Το ψηφιακό UNIX 4.0A (και πιθανώς άλλες εκδόσεις) αρνείται να διαθέσει ptys αν καθορίσετε ένα χειριστήριο SIGCHLD. Δείτε τη σελίδα για περισσότερες πληροφορίες.

Το IRIX 6.0 δεν χειρίζεται σωστά τα δικαιώματα pty, έτσι ώστε αν αναμένεται η προσπάθεια να εκχωρηθεί ένα pty που χρησιμοποιήθηκε προηγουμένως από κάποιον άλλο, αποτυγχάνει. Αναβάθμιση σε IRIX 6.1.

Το Telnet (επαληθευμένο μόνο κάτω από το SunOS 4.1.2) κρέμεται αν δεν έχει οριστεί το TERM. Αυτό είναι ένα πρόβλημα υπό cron, σε και σε cgi scripts, τα οποία δεν ορίζουν TERM. Έτσι, πρέπει να το ορίσετε ρητά - σε ποιο τύπο είναι συνήθως άσχετο. Απλώς πρέπει να τεθεί σε κάτι! Τα ακόλουθα πιθανόν να επαρκούν για τις περισσότερες περιπτώσεις.

set env (TERM) vt100

Η συμβουλή (επαληθευμένη μόνο σύμφωνα με το BSDI BSD / OS 3.1 i386) κρέμεται εάν δεν έχουν ρυθμιστεί το SHELL και το HOME. Αυτό είναι ένα πρόβλημα υπό cron , σε και σε cgi scripts, τα οποία δεν ορίζουν αυτές τις μεταβλητές περιβάλλοντος. Έτσι, πρέπει να τα ορίσετε ρητά - σε ποιο τύπο είναι συνήθως άσχετο. Απλώς πρέπει να τεθεί σε κάτι! Τα ακόλουθα πιθανόν να επαρκούν για τις περισσότερες περιπτώσεις.

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

Ορισμένες υλοποιήσεις των ptys έχουν σχεδιαστεί έτσι ώστε ο πυρήνας να απομακρύνει κάθε μη αναγνωσμένη έξοδο μετά από 10 έως 15 δευτερόλεπτα (ο πραγματικός αριθμός εξαρτάται από την υλοποίηση) αφού η διαδικασία έχει κλείσει τον περιγραφέα αρχείου. Έτσι Περιμένετε προγράμματα όπως

ημερομηνία άφιξης ύπνου 20 αναμένουν

θα αποτύχει. Για να αποφευχθεί αυτό, επικαλούνται μη αλληλεπιδραστικά προγράμματα με exec και όχι με αναπαραγωγή . Παρόλο που είναι κατανοητές αυτές οι καταστάσεις, στην πράξη δεν αντιμετώπισα ποτέ μια κατάσταση στην οποία η τελική παραγωγή ενός πραγματικά διαδραστικού προγράμματος θα χαθεί λόγω αυτής της συμπεριφοράς.

Από την άλλη πλευρά, το Cray UNICOS ptys πετάει κάθε μη αναγνωσμένη έξοδο αμέσως μετά τη διαδικασία που έχει κλείσει ο περιγραφέας αρχείου. Έχω αναφέρει αυτό στον Cray και δουλεύουν σε μια επιδιόρθωση.

Μερικές φορές απαιτείται μια καθυστέρηση μεταξύ της προτροπής και της απόκρισης, όπως όταν μια διεπαφή tty αλλάζει τις ρυθμίσεις UART ή τις αντίστοιχες ταχύτητες baud αναζητώντας bits start / stop. Συνήθως, όλα αυτά απαιτούνται είναι να κοιμηθεί για ένα δευτερόλεπτο ή δύο. Μια πιο στιβαρή τεχνική είναι να προσπαθήσετε ξανά μέχρι να είναι έτοιμο το υλικό για είσοδο. Το παρακάτω παράδειγμα χρησιμοποιεί και τις δύο στρατηγικές:

στείλτε "ταχύτητα 9600 \ r"; ύπνος 1 περιμένετε {timeout {αποστολή "\ r"; exp_continue} $ prompt}

ο κωδικός trap δεν θα λειτουργήσει με οποιαδήποτε εντολή που βρίσκεται στο βρόχο συμβάντων του Tcl, όπως ο ύπνος. Το πρόβλημα είναι ότι στον βρόχο συμβάντων, το Tcl απορρίπτει τους κωδικούς επιστροφής από διαχειριστές συμβάντων async. Μια λύση είναι να ορίσετε μια σημαία στον κωδικό παγίδευσης. Στη συνέχεια, ελέγξτε τη σημαία αμέσως μετά την εντολή (δηλαδή, ύπνος).

Η εντολή expect_background αγνοεί τα όρια -timeout και γενικά δεν έχει έννοια για χρονικά όρια.

& # 34; EXPECT HINTS & # 34;

Υπάρχουν μερικά πράγματα σχετικά με την προσδοκία ότι μπορεί να μην είναι διαισθητική. Αυτή η ενότητα προσπαθεί να αντιμετωπίσει μερικά από αυτά τα πράγματα με μερικές προτάσεις.

Ένα κοινό πρόβλημα αναμονής είναι ο τρόπος αναγνώρισης των εντολών του κελύφους. Δεδομένου ότι αυτά είναι προσαρμοσμένα διαφορετικά από διαφορετικά άτομα και διαφορετικά κελύφη, η αυτοματοποίηση του φορητού rlogin μπορεί να είναι δύσκολη χωρίς να γνωρίζετε την προτροπή. Μια λογική σύμβαση είναι να αποθηκεύονται οι χρήστες μια κανονική έκφραση που περιγράφει την προτροπή τους (ειδικότερα, το τέλος της) στη μεταβλητή περιβάλλοντος EXPECT_PROMPT. Μπορεί να χρησιμοποιηθεί κωδικός όπως παρακάτω. Εάν το EXPECT_PROMPT δεν υπάρχει, ο κώδικας εξακολουθεί να έχει καλές πιθανότητες να λειτουργήσει σωστά.

($) $ ($) $ ($) $ ($)

Σας ενθαρρύνω να γράψετε περιμένετε πρότυπα που περιλαμβάνουν το τέλος ό, τι περιμένετε να δείτε. Αυτό αποτρέπει τη δυνατότητα απάντησης σε μια ερώτηση πριν δει ολόκληρο το πράγμα. Επιπλέον, παρόλο που μπορεί να είστε σε θέση να απαντήσετε σε ερωτήσεις πριν τις δείτε πλήρως, αν απαντήσετε νωρίς, η απάντησή σας μπορεί να εμφανιστεί ξανά στο κέντρο της ερώτησης. Με άλλα λόγια, ο διάλογος που θα προκύψει θα είναι σωστός, αλλά θα μοιάζει κρυμμένος.

Οι περισσότερες προτροπές περιλαμβάνουν έναν χαρακτήρα στο τέλος. Για παράδειγμα, η εντολή από το ftp είναι 'f', 't', 'p', '>' και. Για να ταιριάζει με αυτήν την ερώτηση, πρέπει να λογαριάσετε για καθέναν από αυτούς τους χαρακτήρες. Είναι συνηθισμένο λάθος να μην συμπεριληφθεί το κενό. Τοποθετήστε το κενό σε ρητά.

Εάν χρησιμοποιείτε ένα μοτίβο του εντύπου X *, το * θα αντιστοιχεί σε όλη την έξοδο που λαμβάνεται από το τέλος του Χ στο τελευταίο πράγμα που λάβατε. Αυτό ακούγεται διαισθητικό, αλλά μπορεί να είναι κάπως συγκεχυμένο επειδή η φράση "τελευταίο πράγμα που λάβατε" μπορεί να διαφέρει ανάλογα με την ταχύτητα του υπολογιστή και την επεξεργασία των εισόδων / εξόδων τόσο από τον πυρήνα όσο και από τον οδηγό της συσκευής.

Ειδικότερα, οι άνθρωποι τείνουν να βλέπουν το πρόγραμμα να φτάνει σε τεράστιες ποσότητες (ατομικά), όταν στην πραγματικότητα τα περισσότερα προγράμματα παράγουν μια γραμμή παραγωγής τη φορά. Υποθέτοντας ότι αυτό συμβαίνει, το * στο πρότυπο της προηγούμενης παραγράφου μπορεί να ταιριάζει μόνο με το τέλος της τρέχουσας γραμμής, παρόλο που φαίνεται να υπάρχει περισσότερος λόγος, επειδή κατά τη στιγμή του αγώνα ήταν όλη η έξοδος που είχε ληφθεί.

αναμένετε ότι δεν υπάρχει κανένας τρόπος να γνωρίζετε ότι θα έρχεται περισσότερη παραγωγή εκτός αν το πρότυπό σας το εξειδικεύει ειδικά.

Ακόμη και ανάλογα με τη ρύθμιση γραμμών που είναι προσανατολισμένη προς τη γραμμή είναι άστοχη. Όχι μόνο τα προγράμματα σπάνια κάνουν υποσχέσεις σχετικά με το είδος των buffering που κάνουν, αλλά η δυσπεψία του συστήματος μπορεί να σπάσει τις γραμμές παραγωγής έτσι ώστε οι γραμμές να σπάσουν σε φαινομενικά τυχαίες θέσεις. Έτσι, εάν μπορείτε να εκφράσετε τους τελευταίους χαρακτήρες μιας προτροπής κατά τη σύνταξη σχεδίων, είναι συνετό να το κάνετε.

Αν περιμένετε ένα πρότυπο στην τελευταία έξοδο ενός προγράμματος και το πρόγραμμα εκπέμπει κάτι άλλο, δεν θα μπορείτε να το εντοπίσετε με τη λέξη-κλειδί χρονικού ορίου . Ο λόγος είναι ότι αναμένεται ότι δεν θα χρονοτριβεί - αντ 'αυτού θα πάρει μια eof ένδειξη. Χρησιμοποιήστε αυτό αντ 'αυτού. Ακόμα καλύτερα, χρησιμοποιήστε και τα δύο. Με αυτόν τον τρόπο, αν αυτή η γραμμή κινείται πάντα, δεν θα χρειαστεί να επεξεργαστείτε την ίδια την γραμμή.

Οι γραμμές γραμμής συνήθως μετατρέπονται σε επιστροφή μεταφοράς, ακολουθίες γραμμής τροφοδοσίας όταν εξέρχονται από το πρόγραμμα οδήγησης του τερματικού. Έτσι, εάν θέλετε ένα μοτίβο που αντιστοιχεί ρητά στις δύο γραμμές, από, για παράδειγμα, printf ("foo \ nbar"), θα πρέπει να χρησιμοποιήσετε το μοτίβο "foo \ r \ nbar".

Μια παρόμοια μετάφραση εμφανίζεται κατά την ανάγνωση από το χρήστη, μέσω του expect_user . Σε αυτή την περίπτωση, όταν πατάτε επιστροφή, θα μεταφραστεί σε μια νέα γραμμή. Αν το Expect τότε περάσει σε ένα πρόγραμμα που θέτει το τερματικό του σε κατάσταση raw (όπως το telnet), θα υπάρξει πρόβλημα, καθώς το πρόγραμμα αναμένει πραγματική απόδοση. (Ορισμένα προγράμματα συγχωρούν πραγματικά ότι αυτομάτως θα μεταφράζουν νέες γραμμές στις επιστροφές, αλλά οι περισσότεροι δεν το κάνουν.) Δυστυχώς, δεν υπάρχει τρόπος να διαπιστώσετε ότι ένα πρόγραμμα έθεσε το τερματικό του σε ακατέργαστη λειτουργία.

Αντί να αντικαθιστάτε με μη αυτόματο τρόπο τις νέες γραμμές με επιστροφές, η λύση είναι να χρησιμοποιήσετε την εντολή "stty raw", η οποία θα σταματήσει τη μετάφραση. Σημειώστε, ωστόσο, ότι αυτό σημαίνει ότι δεν θα έχετε πλέον τις μαγειρεμένες λειτουργίες επεξεργασίας γραμμής.

αλληλεπιδρούν σιωπηρά ορίστε το τερματικό σας σε ακατέργαστη λειτουργία, οπότε αυτό το πρόβλημα δεν θα προκύψει στη συνέχεια.

Συχνά είναι χρήσιμο να αποθηκεύονται κωδικοί πρόσβασης (ή άλλες προσωπικές πληροφορίες) στα αναμενόμενα σενάρια. Αυτό δεν συνιστάται, δεδομένου ότι οτιδήποτε αποθηκεύεται σε έναν υπολογιστή είναι επιρρεπής στην πρόσβαση σε κανέναν. Έτσι, η διαδραστική προτροπή για κωδικούς πρόσβασης από ένα σενάριο είναι μια πιο έξυπνη ιδέα από την ενσωμάτωσή τους κυριολεκτικά. Παρ 'όλα αυτά, μερικές φορές τέτοια ενσωμάτωση είναι η μόνη δυνατότητα.

Δυστυχώς, το σύστημα αρχείων UNIX δεν έχει άμεσο τρόπο δημιουργίας σεναρίων τα οποία είναι εκτελέσιμα, αλλά δεν μπορούν να διαβαστούν. Τα συστήματα που υποστηρίζουν δέσμες ενεργειών setgid μπορούν να προσομοιώσουν έμμεσα ως εξής:

Δημιουργήστε το σενάριο προσδοκία (που περιέχει τα μυστικά δεδομένα) ως συνήθως. Κάνετε τα άδειά του 750 (-rwxr-x ---) και ανήκει σε μια αξιόπιστη ομάδα, δηλαδή μια ομάδα που μπορεί να την διαβάσει. Εάν είναι απαραίτητο, δημιουργήστε μια νέα ομάδα για αυτό το σκοπό. Στη συνέχεια, δημιουργήστε μια δέσμη ενεργειών a / bin / sh με δικαιώματα 2751 (-rwxr-s - x) που ανήκουν στην ίδια ομάδα όπως και πριν.

Το αποτέλεσμα είναι ένα σενάριο που μπορεί να εκτελεστεί (και να διαβαστεί) από οποιονδήποτε. Όταν ενεργοποιείται, εκτελείται η δέσμη ενεργειών Expect .

& # 34; ΒΛΕΠΕ ΕΠΙΣΗΣ & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: A Tcl-Based Toolkit για την αυτοματοποίηση διαδραστικών προγραμμάτων" από τον Don Libes, σελ. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"αναμένουν: θεραπεύοντας αυτές τις ανεξέλεγκτες προσαρμογές της αλληλεπίδρασης" από τον Don Libes, Πρακτικά του καλοκαιριού 1990 USENIX Conference, Anaheim, Καλιφόρνια, 11-15 Ιουνίου 1990.
. "Χρήση αναμένεται να αυτοματοποιήσει τις εργασίες διαχείρισης συστήματος" από τον Don Libes, Proceedings of 1990 USENIX Μεγάλο Σύστημα Εγκαταστάσεων Διοίκησης, Κολοράντο Σπρινγκς, Κολοράντο, 17-19 Οκτωβρίου 1990.
. "Tcl: Ενσωματωμένη γλώσσα εντολών" από τον John Ousterhout, Πρακτικά του Winter 1990 USENIX Conference, Ουάσινγκτον, DC, 22-26 Ιανουαρίου 1990. Αναμένω: Σενάρια για τον έλεγχο των διαδραστικών προγραμμάτων από τον Don Libes, , Vol. 4, Νο. 2, Πανεπιστημίου Καλιφόρνιας, Νοέμβριος 1991. Ι "Δοκιμασία παλινδρόμησης και συμμόρφωση με διαδραστικά προγράμματα δοκιμών", από Don Libes, Proceedings of the US 1992 Conference USENIX, σελ. 135-144, San Antonio, 12-15 Ιουνίου 1992. "Kibitz - Σύνδεση πολλαπλών αλληλεπιδραστικών προγραμμάτων μαζί", από τον Don Libes, Software-Practice & Experience, John Wiley & Sons, West Sussex, England, Vol.

23, Νο. 5, May, 1993. I "Debugger for Tcl Applications", από Don Libes, Proceedings of the Tcl / Tk Workshop 1993, Berkeley CA, 10-11 Ιουνίου 1993.

ΣΥΓΓΡΑΦΕΑΣ

Don Libes, Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας

ΑΝΑΓΝΩΡΙΣΕΙΣ

Χάρη στον John Ousterhout για την Tcl και τον Scott Paisley για έμπνευση. Χάρη στον Rob Savoye για τον κώδικα αυτόματης διαμόρφωσης της Expect.

Το αρχείο ΙΣΤΟΡΙΑΣ τεκμηριώνει μεγάλο μέρος της εξέλιξης της αναμονής . Κάνει ενδιαφέρουσα ανάγνωση και μπορεί να σας δώσει περισσότερες πληροφορίες για αυτό το λογισμικό. Χάρη στους ανθρώπους που αναφέρονται σε αυτό που μου έστειλε διορθώσεις σφαλμάτων και έδωσα άλλη βοήθεια.

Ο σχεδιασμός και η εφαρμογή του Expect καταβλήθηκε εν μέρει από την αμερικανική κυβέρνηση και επομένως είναι δημόσιος τομέας. Ωστόσο, ο συγγραφέας και ο NIST θα ήθελαν να πιστώσουν εάν αυτό το πρόγραμμα και η τεκμηρίωση ή τμήματα αυτών χρησιμοποιούνται.