Expect to program, który komunikuje się z innymi interaktywnymi programami zgodnie ze skryptem. Podążając za skryptem, Expect wie, czego można oczekiwać od programu i jaka powinna być właściwa odpowiedź. Interpretowany język zapewnia rozgałęzione i wysokopoziomowe struktury kontrolne do kierowania dialogiem. Ponadto użytkownik może przejąć kontrolę i bezpośrednio interakcję w razie potrzeby, a następnie przywrócić kontrolę nad skryptem.
Expectk jest mieszaniną Expect i Tk. Zachowuje się dokładnie tak, jak się tego spodziewamy i życzę Tk. Expect może być również użyty bezpośrednio w C lub C ++ bez Tcl.
Nazwa "Expect" pochodzi od idei sekwencji send / expect spopularyzowanych przez uucp, kermit i inne programy sterujące modemem. Jednak w przeciwieństwie do uucp, Expect jest uogólniony, dzięki czemu może być uruchamiany jako polecenie na poziomie użytkownika z myślą o każdym programie i zadaniu. Expect może rozmawiać z kilkoma programami w tym samym czasie.
Czego można oczekiwać
Na przykład, oto kilka rzeczy, które może wykonać polecenie expect:
- Powoduje, że Twój komputer oddzwoni, abyś mógł się zalogować, nie płacąc za połączenie.
- Rozpocznij grę i jeśli optymalna konfiguracja się nie pojawi, uruchom ją ponownie i od nowa), aż to nastąpi, a następnie przekaż kontrolę.
- Uruchom program fsck iw odpowiedzi na jego pytania odpowiedz "tak" lub "nie" lub przekaż kontrolę, na podstawie wcześniej określonych kryteriów.
- Połącz się z inną siecią i automatycznie pobieraj pocztę, aby wyglądała tak, jakby była pierwotnie wysłana do twojego systemu lokalnego.
- Przenoszenie zmiennych środowiskowych, bieżącego katalogu lub dowolnego rodzaju informacji przez rlogin, telnet, tip, su lub chgrp
Istnieje wiele powodów, dla których powłoka nie może wykonać tych zadań. Wszystkie są możliwe dzięki Expect.
Ogólnie rzecz biorąc, Expect jest przydatny do uruchamiania dowolnego programu, który wymaga interakcji między programem a użytkownikiem. Wszystko, co konieczne, to to, że interakcję można scharakteryzować programowo. Expect może również przekazać użytkownikowi kontrolę, nie zatrzymując kontrolowanego programu. Podobnie, użytkownik może w dowolnym momencie przywrócić kontrolę skryptowi.
Stosowanie
Spodziewaj się czyta cmdfile dla listy poleceń do wykonania. Expect można wywoływać niejawnie na systemach obsługujących #! notacja poprzez zaznaczenie skryptu jako wykonywalnego i utworzenie pierwszego wiersza w skrypcie:
#! / usr / local / bin / expect -f
Oczywiście ścieżka musi dokładnie opisywać, gdzie się żyje. / usr / local / bin to tylko przykład.
Flaga -c poprzedza polecenie wykonywane przed jakimkolwiek skryptem. Polecenie należy zacytować, aby zapobiec rozbiciu powłoki. Ta opcja może być używana wiele razy. Wiele poleceń można wykonywać za pomocą pojedynczego c, oddzielając je średnikami. Polecenia są wykonywane w kolejności, w jakiej się pojawiają. Używając Expectk, ta opcja jest określona jako -polecenie.
Flaga -d włącza niektóre wyniki diagnostyczne, które głównie raportują wewnętrzną aktywność poleceń, takich jak oczekiwanie i interakcja. Ta flaga ma taki sam efekt jak "exp_internal 1" na początku skryptu Expect, a wersja "Expect" jest drukowana.
Flaga -D włącza interaktywny debugger. Powinna następować wartość całkowita. Debugger przejmie kontrolę przed następną procedurą Tcl, jeśli wartość jest różna od zera lub gdy naciśnięty zostanie ^ C lub zostanie przekroczony punkt przerwania lub inne odpowiednie polecenie debuggera pojawi się w skrypcie. Używając Expectk, ta opcja jest określona jako -Odpluskwić.
Flaga -f poprzedza plik, z którego można odczytać komendy. Flaga sama w sobie jest opcjonalna, ponieważ jest przydatna tylko podczas używania #! notacja, aby inne argumenty mogły zostać dostarczone w wierszu poleceń. Używając Expectk, ta opcja jest określona jako -file.
Domyślnie plik poleceń jest odczytywany do pamięci i wykonywany w całości. Czasem pożądane jest czytanie plików po linii. Aby wymusić obsługę dowolnych plików w ten sposób, użyj opcji -b. Używając Expectk, ta opcja jest określona jako -buffer.
Jeśli ciąg "-" jest podany jako nazwa pliku, zamiast niego zostanie odczytane standardowe wejście. Użyj "./-", aby odczytać z pliku o nazwie "-".
Flaga -i powoduje, że Expect interaktywnie monituje o polecenia zamiast odczytywać je z pliku. Zgłaszanie jest kończone za pomocą komendy exit lub EOF. Flaga -i jest przyjmowana, jeśli nie jest używany ani plik poleceń, ani -c. Podczas korzystania z Expectk ta opcja jest określana jako -interaktywna.
- może być użyty do ograniczenia końca opcji. Jest to użyteczne, jeśli chcesz przekazać argument opcji do skryptu bez jego interpretacji przez Expect. Można to z pożytkiem umieścić w #! linię, aby zapobiec jakiejkolwiek flagowej interpretacji według Expect. Na przykład poniższe pozostawia oryginalne argumenty, w tym nazwę skryptu w zmiennej argv .
#! / usr / local / bin / expect -
Zwróć uwagę, że podczas dodawania argumentów do # należy przestrzegać zwykłych konwencji getopt (3) i execve (2)! linia.
Plik $ exp_library / expect.rc jest pobierany automatycznie, jeśli jest obecny, chyba że użyto flagi -N. (Używając Expectk, opcja ta jest określona jako -NORC.) Zaraz po tym plik ~ / .expect.rc jest pobierany automatycznie, chyba że użyto flagi -n. Jeśli zdefiniowano zmienną środowiskową DOTDIR, jest ona traktowana jako katalog i od tego miejsca czytana jest .expect.rc. Używając Expectk, ta opcja jest określona jako -norc.To pozyskiwanie występuje tylko po wykonaniu dowolnych flag -c.
-v powoduje Spodziewaj się wydrukować swój numer wersji i wyjść. Odpowiednią flagą w Expectku, która używa długich nazw flag, jest -version.
Opcjonalne argumenty są konstruowane na liście i przechowywane w zmiennej o nazwie argv i. argc jest inicjalizowane do długości argv.
Argv0 jest zdefiniowane jako nazwa skryptu lub pliku binarnego, jeśli nie jest używany żaden skrypt. Na przykład poniżej wypisuje nazwę skryptu i pierwsze trzy argumenty:
send_user "$ argv0 lrange $ argv 0 2 n"
Polecenia
Expect używa Tool Command Language. Tcl zapewnia przepływ sterowania (if, for, break), ocenę wyrażeń i kilka innych funkcji, takich jak rekursja i definicja procedury. Polecenia użyte tutaj, ale nie zdefiniowane (set, if, exec) są komendami Tcl. Expect obsługuje dodatkowe polecenia. O ile nie podano inaczej, polecenia zwracają pusty ciąg.
Polecenia są wymienione alfabetycznie, aby można je było szybko zlokalizować. Jednak nowym użytkownikom łatwiej będzie zacząć od przeczytania opisów spawnu, wysłania, spodziewania się i interakcji w tej kolejności.
close -slave -onexec 0 | 1 -i spawn_id
zamyka połączenie z bieżącym procesem. Większość interaktywnych programów wykryje EOF na ich wejściu stdin i wyjdzie; a zatem blisko zwykle wystarcza również do zabicia procesu. Flaga -i deklaruje zamknięcie procesu odpowiadającego nazwie spawn_id.
Zarówno oczekiwanie, jak i interakcja wykryją, kiedy bieżący proces zakończy się i niejawnie zamknie, ale jeśli zabijesz proces, powiedzmy "wykonaj kill $ pid", musisz jawnie wywołać zamknięcie.
Flaga -onexec określa, czy identyfikator odradzania jest zamknięty w nowych procesach odradzania, czy proces jest nakładany. Aby pozostawić otwarty identyfikator odradzania, użyj wartości 0. Niezerowa wartość całkowita wymusza zamknięcie odradzania w nowych procesach.
Flaga -slave zamyka niewolnik powiązany z identyfikatorem odradzania. Gdy połączenie zostanie zamknięte, urządzenie podrzędne również zostanie automatycznie zamknięte, jeśli jest nadal otwarte.
Bez względu na to, czy połączenie jest zamykane niejawnie czy jawnie, należy wywołać funkcję wait, aby wyczyścić odpowiednie gniazdo procesowe jądra. Polecenie close nie wywołuje oczekiwania, ponieważ nie ma gwarancji, że zamknięcie połączenia procesowego spowoduje jego zakończenie.
debugowanie -now 0 | 1
kontroluje debugger Tcl, pozwalając ci przechodzić instrukcje i ustawiać punkty przerwania.
Bez argumentów zwracana jest wartość 1, jeśli debugger nie działa, w przeciwnym razie zwracane jest 0.
Przy 1 argumencie debugger jest uruchamiany. Z argumentem 0 debugger jest zatrzymany. Jeśli argument 1 jest poprzedzony flagą -now, debugger jest natychmiast uruchamiany. W przeciwnym razie debugger jest uruchamiany z następną instrukcją Tcl.
Polecenie debugowania nie zmienia żadnych pułapek. Porównaj to z początkiem Oczekuj z flagą -D.
Polecenie disconnect rozłącza rozwidlony proces z terminala. Działa dalej w tle. Proces otrzymuje swoją własną grupę procesową. Standardowe operacje we / wy są przekierowywane do / dev / null.
Poniższy fragment używa rozłączenia, aby kontynuować działanie skryptu w tle.
if {fork! = 0} exit disconnect. . .
Poniższy skrypt odczytuje hasło, a następnie uruchamia program co godzinę, która wymaga hasła przy każdym uruchomieniu. Skrypt dostarcza hasła, więc wystarczy je wpisać raz.
send_user "hasło? " expect_user -re "(. *) n" dla {} 1 {} {jeśli {fork! = 0} {spać 3600, kontynuować} odłączyć spawn priv_prog oczekiwać Hasło: wysłać "$ expect_out ( 1, ciąg) r ". . . wyjście }
Zaletą korzystania z rozłączenia przez asynchroniczną funkcję powłoki (&) jest to, że oczekiwanie może zapisać parametry terminala przed rozłączeniem, a następnie zastosować je do nowych pty. Z &, Expect nie ma szansy na odczyt parametrów terminala, ponieważ terminal jest już rozłączony do czasu, w którym Expect otrzymuje kontrolę.
exit -opts status
przyczyny Spodziewaj się wyjść lub przygotować się w inny sposób.
The -exxit flaga powoduje użycie następnego argumentu jako procedury obsługi wyjścia. Bez argumentu zwracana jest aktualna procedura obsługi wyjścia.
The -brak wyjścia Przyczyny flag Oczekiwać aby przygotować się do wyjścia, ale przestać faktycznie zwracać kontrolę do systemu operacyjnego. Definiowany przez użytkownika program obsługi wyjścia jest uruchamiany, podobnie jak własne procedury obsługi Expect. Nie należy wykonywać kolejnych poleceń Expect. Jest to przydatne, jeśli korzystasz z Expect z innymi rozszerzeniami Tcl. Obecny interpreter (i główne okno w środowisku Tk) pozostają tak, że inne rozszerzenia Tcl mogą zostać wyczyszczone. Jeśli oczekujesz wyjście jest wywoływany ponownie (jednak może się to zdarzyć), procedury obsługi nie są ponownie uruchamiane.
Po wyjściu wszystkie połączenia z odrodzonymi procesami są zamykane. Zamknięcie zostanie wykryte jako EOF przez odradzane procesy. wyjście nie podejmuje innych działań poza normalną procedurą _exit (2). W związku z tym procesy odradzane, które nie sprawdzają EOF, mogą nadal działać. (Różne warunki są ważne dla określenia, na przykład, co oznacza, że wysłany proces zostanie wysłany, ale są one zależne od systemu, zazwyczaj dokumentowane pod wyjściem (3).) Procesy rzutu, które będą kontynuowane, będą dziedziczone przez init.
status (lub 0, jeśli nie określono), jest zwracany jako status wyjścia Oczekiwać . wyjście jest niejawnie wykonywany, jeśli zostanie osiągnięty koniec skryptu.
exp_continue -continue_timer
Komenda exp_continue pozwala oczekiwać samemu, aby kontynuować wykonywanie, a nie powracanie, tak jak zwykle. Domyślnie exp_continue resetuje timer limitu czasu. The -continue_timer flaga zapobiega ponownemu uruchomieniu timera. (Widzieć oczekiwać po więcej informacji.)
exp_internal -f file value
powoduje dalsze polecenia wysyłania informacji diagnostycznych do wewnętrznej Oczekiwać stderr jeśli wartość jest niezerowe. To wyjście jest wyłączone, jeśli wartość jest 0. Informacje diagnostyczne obejmują każdy otrzymany znak i każdą próbę dopasowania bieżącego wyniku do wzorców.
Jeśli opcjonalne plik jest dostarczany, wszystkie normalne i debugowane dane wyjściowe są zapisywane do tego pliku (niezależnie od wartości wartość ). Każdy poprzedni plik wyjściowy diagnostyki jest zamknięty.
The -info flag powoduje, że exp_internal zwraca opis najnowszych podanych argumentów niepoprawnych.
exp_open argumenty -i spawn_id
zwraca identyfikator pliku Tcl, który odpowiada oryginalnemu identyfikatorowi odradzania. Identyfikator pliku może być wtedy użyty tak, jakby był otwarty przez Tcl otwarty dowództwo. (Identyfikator odradzania nie powinien być już używany czekać nie powinny być wykonywane.
The -pozostawić otwarte flag pozostawia identyfikator spawn open, aby uzyskać dostęp za pomocą poleceń Expect. ZA czekać musi być wykonany na identyfikatorze odradzania.
exp_pid -i spawn_id
zwraca identyfikator procesu odpowiadający aktualnie uruchomionemu procesowi. Jeśli -ja flaga jest używana, zwracany pid odpowiada temu z danego identyfikatora odradzania.
exp_send
to alias dla wysłać .
exp_send_error
to alias dla Wyślij błąd .
exp_send_log
to alias dla send_log .
exp_send_tty
to alias dla send_tty .
exp_send_user
to alias dla send_user .
exp_version -exit version
jest przydatny do zapewnienia zgodności skryptu z aktualną wersją Expect.
Bez żadnych argumentów aktualna wersja Oczekiwać jest zwracany. Ta wersja może zostać zakodowana w twoim skrypcie. Jeśli rzeczywiście wiesz, że nie korzystasz z funkcji najnowszych wersji, możesz określić wcześniejszą wersję.
Wersje składają się z trzech liczb oddzielonych kropkami. Pierwsza to główna liczba. Skrypty napisane dla wersji Oczekiwać z inną główną liczbą prawie na pewno nie zadziała. exp_version zwraca błąd, jeśli główne liczby nie pasują do siebie.
Drugi to liczba mniejsza. Skrypty napisane dla wersji z większą liczbą mniejszą niż bieżąca wersja mogą zależeć od jakiejś nowej funkcji i mogą nie działać. exp_version zwraca błąd, jeśli główne liczby pasują do siebie, ale mniejszy numer skryptu jest większy niż biegu Oczekiwać .
Trzeci to liczba, która nie odgrywa żadnej roli w porównaniu do wersji. Jednak jest on zwiększany, gdy Oczekiwać Dystrybucja oprogramowania zmienia się w dowolny sposób, na przykład poprzez dodatkową dokumentację lub optymalizację. Jest resetowany do 0 po każdej nowej wersji podrzędnej.
Dzięki -wyjście flaga, Oczekiwać drukuje błąd i kończy działanie, jeśli wersja jest nieaktualna.
oczekiwać -opts pat1 body1 … -opts patn bodyn
czeka, aż jeden z wzorców będzie pasował do wyniku procesu spawnowanego, upłynął określony czas lub zostanie wyświetlony koniec pliku. Jeśli ostateczny obiekt jest pusty, można go pominąć.
Wzory od najnowszych expect_before polecenia są niejawnie używane przed innymi wzorcami. Wzory od najnowszych expect_after polecenia są niejawnie używane po innych wzorcach.
Jeśli argumenty do całości oczekiwać instrukcja wymaga więcej niż jednego wiersza, wszystkie argumenty mogą być "usztywnione" w jeden, aby uniknąć zakończenia każdej linii za pomocą ukośnika odwrotnego. W tym jednym przypadku standardowe nawyki Tcl pojawią się pomimo nawiasów klamrowych.
Jeśli wzór jest słowem kluczowym eof , odpowiednia treść jest wykonywana po zakończeniu pliku. Jeśli wzór jest słowem kluczowym koniec czasu , odpowiednia treść jest wykonywana po przekroczeniu limitu czasu. Jeśli nie zostanie użyte słowo kluczowe timeout, niejawna akcja zerowa jest wykonywana po przekroczeniu limitu czasu. Domyślny limit czasu wynosi 10 sekund, ale można go ustawić, na przykład na 30, za pomocą polecenia "set timeout 30". Nieskończony czas oczekiwania może być wyznaczony przez wartość -1. Jeśli wzór jest słowem kluczowym domyślna , odpowiednia treść jest wykonywana po upływie limitu czasu lub końca pliku.
Jeśli wzorzec się zgadza, wówczas wykonywana jest odpowiednia bryła. oczekiwać zwraca wynik body (lub pusty ciąg znaków, jeśli nie został dopasowany żaden wzór). W przypadku, gdy wiele wzorców się zgadza, pierwszy pojawiający się służy do wyboru ciała.
Za każdym razem, gdy przychodzi nowe wyjście, jest ono porównywane do każdego wzorca w kolejności, w jakiej są wymienione. W związku z tym możesz przetestować brak dopasowania, tworząc ostatni wzór gwarantujący pojawienie się, taki jak monit. W sytuacjach, w których nie ma podpowiedzi, musisz użyć koniec czasu (tak jak ty, gdybyś wchodził w interakcję ręcznie).
Wzorce są określone na trzy sposoby. Domyślnie wzorce są określone tak jak w Tcl dopasowanie łańcuchowe dowództwo. (Takie wzorce są również podobne do wyrażeń regularnych C-shell, zwykle nazywane wzorcami "globowymi"). The -gl flaga może być używana do ochrony wzorów, które w przeciwnym razie mogłyby pasować oczekiwać flagi z tego powodu. Każdy wzór zaczynający się na "-" powinien być chroniony w ten sposób. (Wszystkie ciągi rozpoczynające się od "-" są zarezerwowane dla przyszłych opcji.)
Na przykład poniższy fragment szuka pomyślnego logowania. (Zauważ, że anulować jest uważana za procedurę zdefiniowaną gdzie indziej w skrypcie.)
oczekiwać {busy {puts busy busy n; exp_continue} nieudane przerwanie "nieprawidłowe hasło" przerwanie timeoutu przerwanie połączenia}
Cytaty są niezbędne w czwartym wzorze, ponieważ zawiera on spację, która w przeciwnym razie oddzieliłaby wzorzec od akcji.Wzorce o tej samej akcji (takie jak trzecia i czwarta) wymagają ponownej listy działań. Można tego uniknąć, używając wzorów regexp-style (patrz poniżej). Więcej informacji na temat tworzenia modeli w stylu globalnym można znaleźć w instrukcji Tcl.
Wzory w stylu Regexp są zgodne ze składnią zdefiniowaną przez Tcl regexp (skrót od wyrażenia "regular expression"). wzory regexp są wprowadzane z flagą -re . Poprzedni przykład można przepisać przy użyciu wyrażeń regularnych jako:
oczekiwać {busy {puts busy busy n; exp_continue} -re "failed | invalid password" Przerwij limit czasu przerwanie połączenia}
Oba typy wzorów są "niezaangażowane". Oznacza to, że wzorce nie muszą pasować do całego ciągu, ale mogą zaczynać i kończyć dopasowanie w dowolnym miejscu ciągu (o ile wszystko inne pasuje). Użyj znaku ^, aby dopasować początek łańcucha i $, aby dopasować koniec. Zauważ, że jeśli nie czekasz na koniec ciągu znaków, twoje odpowiedzi mogą łatwo znaleźć się w środku łańcucha, ponieważ są one echo od zarodkowanego procesu. Mimo że wciąż generuje poprawne wyniki, wyniki mogą wyglądać nienaturalnie. Dlatego zachęcamy do używania $, jeśli umiesz dokładnie opisać znaki na końcu łańcucha.
Zwróć uwagę, że w wielu edytorach znaki ^ i $ odpowiadają odpowiednio początkowi i końcowi linii. Ponieważ jednak oczekiwania nie są zorientowane na linię, te znaki odpowiadają początkowi i końcowi danych (w przeciwieństwie do linii) w chwili obecnej w oczekiwanym buforze dopasowującym. (Zobacz także notatkę poniżej "niestrawność systemu".)
The -dawny flaga powoduje, że wzór jest dopasowywany jako ciąg "dokładny". Nie jest dokonywana interpretacja *, ^, itp. (Chociaż nadal należy przestrzegać zwykłych konwencji Tcl). Dokładne wzory są zawsze niezauważalne.
The -nocase flaga powoduje, że wielkie litery danych wyjściowych są porównywane tak, jakby były małymi literami. Wzór nie ma wpływu.
Podczas odczytu danych, ponad 2000 bajtów może zmusić wcześniejsze bajty do "zapomnienia". Można to zmienić za pomocą funkcji match_max . (Zwróć uwagę, że zbyt duże wartości mogą spowolnić proces dopasowywania wzoru). Jeśli patlista jest full_buffer , odpowiednia treść jest wykonywana, jeśli match_max Bajty zostały odebrane i żadne inne wzory nie zostały dopasowane. Niezależnie od tego, czy full_buffer używane jest słowo kluczowe, zapomniane znaki są zapisywane w pliku expect_out (bufor).
Jeśli patlista jest słowem kluczowym zero , a wartości zerowe są dozwolone (przez remove_nulls polecenie), odpowiednia treść jest wykonywana, jeśli dopasowany jest pojedynczy ASCII 0. Nie można dopasować 0 bajtów za pomocą wzorców glob lub regexp.
Po dopasowaniu wzorca (lub eof lub full_buffer) wszelkie pasujące i poprzednio niepasujące dane wyjściowe są zapisywane w zmiennej expect_out (bufor) . W zmiennych jest zapisanych do 9 dopasowań podciągów regexp expect_out (1, string) przez expect_out (9, string) . Jeśli -indy flaga jest używana przed wzorcem, wskaźnikami początkowymi i końcowymi (w formie odpowiedniej dla zadziwić ) z 10 łańcuchów są przechowywane w zmiennych expect_out (X, start) i expect_out (X, koniec) gdzie X jest cyfrą, odpowiada pozycji podłańcuchowej w buforze. 0 odnosi się do ciągów pasujących do całego wzoru i jest generowanych dla wzorców globalnych, jak również wzorów regexp. Na przykład, jeśli proces wytworzył wynik "abcdefgh n", wynik:
oczekiwać "cd"
wygląda tak, jakby wykonano następujące polecenia:
set expect_out (0, string) cd set expect_out (buffer) abcd
i "efgh n" pozostaje w buforze wyjściowym. Jeśli proces wytworzył wynik "abbbcabkkkka n", wynik:
spodziewać -indices -re "b (b *). * (k +)"
wygląda tak, jakby wykonano następujące polecenia:
set expect_out (0, start) 1 zestaw expect_out (0, end) 10 zestaw expect_out (0, string) bbbcabkkkk zestaw expect_out (1, start) 2 zestaw expect_out (1, end) 3 zestaw expect_out (1, string) bb set expect_out (2, start) 10 zestaw expect_out (2, end) 10 zestaw expect_out (2, string) k zestaw expect_out (buffer) abbbcabkkkk
a "a n" pozostaje w buforze wyjściowym. Wzorzec "*" (i -re ". *") Spowoduje opróżnienie bufora wyjściowego bez czytania dalszych wyników procesu.
Zwykle dopasowane wyjście jest odrzucane z wewnętrznych buforów Expect. Można temu zapobiec, dodając wzorzec z -nieprzyczyn flaga. Ta flaga jest szczególnie użyteczna w eksperymentowaniu (i może być skrócona do "-nie" dla wygody podczas eksperymentowania).
Identyfikator odradzania skojarzony z pasującym wyjściem (lub eof lub full_buffer) jest przechowywany w expect_out (spawn_id) .
The -koniec czasu flag powoduje, że polecenie current expect używa następującej wartości jako timeout zamiast używać wartości zmiennej timeout.
Domyślnie wzorce są dopasowywane do wyjścia z bieżącego procesu, jednak -ja flag deklaruje, że dane wyjściowe z nazwanej listy spawn_id są porównywane z następującymi wzorami (do następnych) -ja ). Lista spawn_id powinna być oddzieloną białą spacją listą spawn_ids lub zmienną odnoszącą się do takiej listy spawn_ids.
Na przykład poniższy przykład czeka na "podłączony" z bieżącego procesu lub "zajęty", "nie powiodło się" lub "nieprawidłowe hasło" z pliku spawn_id nazwanego przez $ proc2.
oczekiwać {-i $ proc2 busy {puts busy n; exp_continue} -re "failed | invalid password" Przerwij limit czasu przerwanie połączenia}
Wartość zmiennej globalnej any_spawn_id może być użyty do dopasowania wzorców do dowolnych spawn_ids, które są nazywane wszystkimi innymi -ja flagi w bieżącym oczekiwać dowództwo. Ten spawn_id z a -ja flagę bez skojarzonego wzorca (to jest, po którym następuje natychmiast inny znak) -ja ) jest dostępny dla wszystkich innych wzorów w tym samym oczekiwać komenda powiązana z any_spawn_id.
The -ja flaga może również nazwać globalną zmienną, w którym to przypadku zmienna zostanie odczytana dla listy odradzających się identyfikatorów. Zmienna jest ponownie czytana po każdej zmianie. Zapewnia to sposób zmiany źródła I / O podczas wykonywania polecenia. Dostarczone w ten sposób jarzębaty nazywane są "pośrednimi" odradzkami.
Działania takie jak złamać i dalej powodują struktury kontrolne (tj. dla , proc ) zachowywać się w zwykły sposób. Komenda exp_continue pozwala oczekiwać samemu, aby kontynuować wykonywanie, a nie powracanie, tak jak zwykle.
Jest to przydatne do unikania jawnych pętli lub powtarzających się stwierdzeń dotyczących oczekiwań. Poniższy przykład jest częścią fragmentu do automatyzacji rlogin. The exp_continue unika się konieczności napisania sekundy oczekiwać instrukcja (w celu ponownego sprawdzenia zachęty), jeśli rlogin wyświetli monit o podanie hasła.
oczekiwać {Password: {stty -echo send_user "hasło (dla $ user) na $ host:" expect_user -re "(. *) n" send_user " n" wyślij "$ expect_out (1, string) r" stty echo exp_continue} niepoprawne {send_user "nieprawidłowe hasło lub konto n" wyjście} timeout {send_user "połączenie z $ host przekroczono limit czasu n" exit} eof {send_user "połączenie z hostem nie powiodło się: $ expect_out (buffer)" exit} - ponownie $ zachęcam}
Na przykład poniższy fragment może pomóc użytkownikowi w prowadzeniu interakcji, która jest już całkowicie zautomatyzowana. W takim przypadku terminal jest przełączany w tryb surowy. Jeśli użytkownik naciśnie "+", zmienna zostanie zwiększona. W przypadku naciśnięcia "p" do procesu wysyłanych jest kilka zwrotów, być może w jakiś sposób go szturchają, a "i" pozwala użytkownikowi na interakcję z procesem, skutecznie wykrywając kontrolę ze skryptu. W każdym przypadku exp_continue zezwala na bieżący oczekiwać aby kontynuować dopasowywanie wzorca po wykonaniu bieżącej akcji.
stty raw -echo expect_after {-i $ user_spawn_id "p" {wyślij " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" exit}
Domyślnie, exp_continue resetuje timer limitu czasu. Timer nie zostanie ponownie uruchomiony, jeśli exp_continue nazywa się z -continue_timer flaga.
expect_after expect_args
działa identycznie jak expect_before z wyjątkiem tego, że jeśli wzorce z obu oczekiwać i expect_after można dopasować, oczekiwać wzór jest używany. Zobacz expect_before polecenie, aby uzyskać więcej informacji.
expect_background expect_args
przyjmuje takie same argumenty jakoczekiwać , jednak wraca natychmiast. Wzorce są testowane po pojawieniu się nowego wejścia. Wzórkoniec czasu idomyślna nie mają znaczeniaexpect_background i są po cichu odrzucane. W przeciwnym razieexpect_background polecenie używaexpect_before iexpect_after wzory takie jakoczekiwać robi.
Gdyexpect_background działania są oceniane, przetwarzanie w tle dla tego samego identyfikatora odrodzenia jest blokowane. Przetwarzanie w tle jest odblokowane po zakończeniu działania. Podczas gdy przetwarzanie w tle jest zablokowane, możliwe jest wykonanie (pierwszego planu)oczekiwać na tym samym identyfikatorze odradzania.
Nie można wykonaćoczekiwać podczas gdyexpect_background jest odblokowany.expect_background dla danego identyfikatora odradzania jest usuwany poprzez deklarację nowego pola oczekiwania z tym samym identyfikatorem odradzania. Deklaracjaexpect_background bez wzoru usuwa dany identyfikator odradzania z możliwości dopasowywania wzorów w tle.
expect_before expect_args
przyjmuje takie same argumenty jakoczekiwać , jednak wraca natychmiast. Pary wzorcowych akcji od najnowszychexpect_before z tym samym identyfikatorem odrodzenia są domyślnie dodawane do poniższychoczekiwać polecenia. Jeśli wzór jest zgodny, traktowany jest tak, jakby został określony w plikuoczekiwać samo polecenie, a powiązany obiekt jest wykonywany w kontekścieoczekiwać dowództwo. Jeśli wzorce z obuexpect_before ioczekiwać można dopasować,expect_before wzór jest używany.
Jeśli nie zostanie podany żaden wzorzec, identyfikator odradzania nie zostanie sprawdzony pod kątem jakichkolwiek wzorów.
O ile nie zostanie zmienione przez a-ja flaga,expect_before wzorce są zgodne z identyfikatorem odrodzenia określonym w czasie, w którymexpect_before polecenie zostało wykonane (nie wtedy, gdy jego wzór jest dopasowany).
Flaga -info powodujeexpect_before aby zwrócić bieżące specyfikacje, które wzorce będą pasować. Domyślnie raportuje na bieżącym identyfikatorze odradzania. Opcjonalna specyfikacja identyfikatora odradzania może być podana dla informacji o tym identyfikatorze odradzania. Na przykład
expect_before -info -i $ proc
Można podać co najwyżej jedną specyfikację identyfikatora odradzania. Flaga -transportuje pomijanie bezpośrednich odrodzeń, które pochodzą wyłącznie ze specyfikacji pośrednich.
Zamiast specyfikacji identyfikatora odradzania, flaga "-all" spowoduje, że "-info" będzie raportować wszystkie identyfikatory odradzania.
Dane wyjściowe flagi -info mogą być ponownie wykorzystane jako argument do expect_before.
expect_tty expect_args
jest jakoczekiwać ale odczytuje znaki z / dev / tty (tj. naciśnięcia klawiszy od użytkownika). Domyślnie odczytywanie odbywa się w trybie gotowym. Dlatego wiersze muszą kończyć się zwrotem w kolejnościoczekiwać zobaczyć ich. To może być zmienione przezstty (patrzstty polecenie poniżej).
expect_user expect_args
jest jakoczekiwać ale odczytuje znaki ze standardowego wejścia (tj. naciśnięcia klawiszy od użytkownika). Domyślnie odczytywanie odbywa się w trybie gotowym. Dlatego wiersze muszą kończyć się zwrotem w kolejnościoczekiwać zobaczyć ich.To może być zmienione przezstty (patrzstty polecenie poniżej).
widelec
tworzy nowy proces. Nowy proces jest dokładną kopią prąduOczekiwać proces. O sukcesie,widelec zwraca 0 do nowego (potomnego) procesu i zwraca identyfikator procesu procesu podrzędnego do procesu nadrzędnego. W przypadku awarii (niezmiennie z powodu braku zasobów, np. Miejsca wymiany, pamięci),widelec zwraca -1 do procesu nadrzędnego i nie jest tworzony proces potomny.
Rozwidlone procesy kończą się poprzezwyjście polecenie, podobnie jak oryginalny proces. Rozwidlone procesy mogą zapisywać do plików dziennika. Jeśli nie wyłączysz debugowania lub logowania do większości procesów, wynik może być mylący.
Niektóre implementacje pty mogą być mylone przez wielu czytelników i pisarzy, nawet chwilowo. Dlatego najbezpieczniej jestwidelec przed rozpoczęciem procesów odradzania.
interakcja string1 body1 … stringn bodyn
daje kontrolę nad bieżącym procesem dla użytkownika, tak że naciśnięcia klawiszy są wysyłane do bieżącego procesu, a standardowe wyjście i stderr bieżącego procesu są zwracane.
Pary łańcuchów i znaków mogą być określone jako argumenty, w którym to przypadku treść jest wykonywana po wprowadzeniu odpowiedniego ciągu znaków. (Domyślnie ciąg nie jest wysyłany do bieżącego procesu.)interpretator polecenie, jeśli brakuje ostatecznej treści.
Jeśli argumenty do całościoddziaływać instrukcja wymaga więcej niż jednego wiersza, wszystkie argumenty mogą być "usztywnione" w jeden, aby uniknąć zakończenia każdej linii za pomocą ukośnika odwrotnego. W tym jednym przypadku standardowe nawyki Tcl pojawią się pomimo nawiasów klamrowych.
Na przykład następujące polecenia uruchamiają interakcję z następującymi zdefiniowanymi parami łańcuchów-znaków: po naciśnięciu ^ Z,Oczekiwać jest zawieszona. (The-nastawić flaga przywraca tryby terminala.) Po naciśnięciu ^ A użytkownik widzi "wpisałeś kontrolkę A" i proces jest wysyłany ^ A. Po naciśnięciu przycisku $ użytkownik widzi datę. Po naciśnięciu ^ C,Oczekiwać wyjścia. Jeśli wprowadzono "foo", użytkownik widzi "pasek". Po naciśnięciu ~~,Oczekiwać Interpreter działa interaktywnie.
set CTRLZ 032 interact {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "wpisałeś formant-A n"; wyślij " 001"} $ {send_user "Datą jest format zegara sekundy zegara.}} 003 exit foo {send_user" bar "} ~~}
W parach łańcuch-ciało łańcuchy są dopasowywane w kolejności, w jakiej są wymienione jako argumenty. Ciągi, które częściowo pasują, nie są wysyłane do bieżącego procesu w oczekiwaniu na nadejście pozostałych. Jeśli znaki zostaną wprowadzone w taki sposób, że nie będzie już możliwe dopasowanie, tylko część ciągu zostanie wysłana do procesu, który nie może rozpocząć kolejnego dopasowania. Zatem ciągi będące podciągami częściowych dopasowań mogą pasować później, jeśli oryginalne łańcuchy, które próbowały się dopasować, ostatecznie zawodzą.
Domyślnie dopasowanie do łańcucha jest dokładne bez żadnych symboli wieloznacznych. (W przeciwieństwie dooczekiwać Polecenie domyślnie korzysta z wzorców w stylu globalnym.)-dawny flaga może być używana do ochrony wzorców, które w przeciwnym razie mogłyby pasowaćoddziaływać flagi z tego powodu. Każdy wzór zaczynający się na "-" powinien być chroniony w ten sposób. (Wszystkie ciągi rozpoczynające się od "-" są zarezerwowane dla przyszłych opcji.)
The-re flaga wymusza interpretację ciągu znaków jako wzorca w stylu regexp. W takim przypadku pasujące ciągi są przechowywane w zmiennej interact_out podobnie do sposobuoczekiwać przechowuje swoje dane wyjściowe w zmiennejexpect_out . The-indy flaga jest podobnie obsługiwana.
Wzóreof wprowadza akcję, która jest wykonywana po zakończeniu pliku. Oddzielnyeof wzór może również podążać za-wydajność flag, w którym to przypadku jest ono dopasowane, jeśli eof zostanie wykryty podczas zapisywania wyników. Domyślnyeof akcja to "powrót", więcoddziaływać po prostu zwraca po każdym EOF.
Wzórkoniec czasu wprowadza limit czasu (w sekundach) i akcję wykonywaną po tym, jak przez dany czas nie odczytano żadnych znaków. Thekoniec czasu wzór dotyczy ostatnio określonego procesu. Nie ma domyślnego limitu czasu. Specjalna zmienna "timeout" (używana przezoczekiwać command) nie ma wpływu na ten limit czasu.
Na przykład następująca instrukcja może być użyta do autologoutowania użytkowników, którzy nie wpisywali niczego przez godzinę, ale nadal otrzymują częste komunikaty systemowe:
interact -input $ user_spawn_id timeout 3600 return -output $ spawn_id
Jeśli wzór jest słowem kluczowymzero , a wartości zerowe są dozwolone (przezremove_nulls polecenie), odpowiednia treść jest wykonywana, jeśli dopasowany jest pojedynczy ASCII 0. Nie można dopasować 0 bajtów za pomocą wzorców glob lub regexp.
Prefacing wzorzec z flagą-piszę powoduje zmienną interact_out (spawn_id) aby ustawić go na spawn_id, który pasował do wzorca (lub eof).
Działania takie jakzłamać idalej powodują struktury kontrolne (tj.dla , proc ) zachowywać się w zwykły sposób. jednakpowrót powoduje, że interakcja powraca do swojego rozmówcy, podczas gdyinter_return przyczynyoddziaływać spowodować powrót w swoim rozmówcy. Na przykład, jeśli zadzwonił "proc foo"oddziaływać który następnie wykonał akcjęinter_return , proc foo wróci. (Oznacza to, że jeślioddziaływać połączeniainterpretator interaktywnie pisaćpowrót spowoduje, że interakcja będzie kontynuowana, podczas gdyinter_return spowoduje, że interakcja powróci do swojego rozmówcy.)
Podczasoddziaływać Tryb surowy jest używany, aby wszystkie znaki mogły zostać przekazane do bieżącego procesu.Jeśli bieżący proces nie przechwytuje sygnałów sterowania zadaniami, zatrzyma się, jeśli zostanie wysłany sygnał zatrzymania (domyślnie ^ Z). Aby go zrestartować, wyślij sygnał kontynuacji (np. Przez "kill -CONT"). Jeśli naprawdę chcesz wysłać SIGSTOP do takiego procesu (przez ^ Z), pomyśl najpierw o zrobieniu csh, a następnie uruchomieniu programu. Z drugiej strony, jeśli chcesz wysłać SIGSTOP doOczekiwać sam, najpierw tłumacza połączenia (być może za pomocą znaku escape), a następnie naciśnij ^ Z.
Pary łańcuchów-brył mogą być używane jako skrót do unikania konieczności wchodzenia do interpretera i wykonywania poleceń w sposób interaktywny. Poprzedni tryb terminalu jest używany, gdy wykonywana jest bryła pary strun-ciało.
W przypadku prędkości działania są domyślnie wykonywane w trybie raw. The-nastawić flaga resetuje terminal do trybu, który miał wcześniejoddziaływać został wykonany (niezmiennie, tryb gotowany). Zauważ, że znaki wprowadzone podczas przełączania trybu mogą zostać utracone (niefortunna funkcja sterownika terminala w niektórych systemach). Jedyny powód do użycia-nastawić jest, jeśli twoja akcja zależy od działania w trybie gotowym.
The-Echo flaga wysyła znaki pasujące do następującego wzorca z powrotem do procesu, który je wygenerował, gdy czytany jest każdy znak. Może to być przydatne, gdy użytkownik musi zobaczyć informacje zwrotne z częściowo wpisanych wzorów.
Jeśli wzorzec jest powtarzany, ale ostatecznie nie pasuje, znaki są wysyłane do zarodkowanego procesu. Jeśli odrodzony proces wyświetli je, użytkownik zobaczy dwa znaki.-Echo Prawdopodobnie jest to właściwe tylko w sytuacjach, gdy użytkownik nie jest w stanie zakończyć wzorca. Na przykład poniższy fragment pochodzi z rftp, skryptu rekurencyjno-ftp, w którym użytkownik jest proszony o wpisanie ~ g, ~ p lub ~ l, aby uzyskać, wstawić lub wyświetlić katalog bieżący rekursywnie. Są one tak odległe od zwykłych poleceń ftp, że mało prawdopodobne jest, aby użytkownik wpisał ~, a następnie cokolwiek innego, z wyjątkiem omyłek, w takim przypadku prawdopodobnie i tak zignoruje wynik.
interakcja {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}
The-nobuffer flaga wysyła znaki pasujące do następującego wzorca do procesu wyjściowego podczas odczytywania znaków.
Jest to przydatne, gdy chcesz, aby program odtworzył echo wzoru. Na przykład do monitorowania, gdzie dana osoba się wybiera (modem w stylu Hayesa), można zastosować następujące elementy. Za każdym razem, gdy widać "atd", skrypt rejestruje resztę linii.
proc lognumber {} {interakcja -nobuffer -re "(. *) r" return umieszcza $ log "format zegara clock seconds: wybrany $ interact_out (1, string)"} interact -nobuffer "atd" lognumber
Podczasoddziaływać , poprzednie użycielog_user jest ignorowany. W szczególności,oddziaływać wymusi rejestrację danych wyjściowych (wysłanych na standardowe wyjście), ponieważ zakłada się, że użytkownik nie chce wchodzić w ślepą interakcję.
The-o flaga powoduje zastosowanie każdej następnej pary klawiszy i ciałek na wyjściu bieżącego procesu. Może to być przydatne na przykład w przypadku hostów, które wysyłają niechciane znaki podczas sesji telnetu.
Domyślnie,oddziaływać oczekuje, że użytkownik napisze stdin i odczytuje stdout zOczekiwać sam proces. The-u flag (dla "użytkownika") czynioddziaływać szukaj użytkownika jako procesu określonego przez jego argument (który musi być identyfikatorem zarodkowym).
Pozwala to na połączenie dwóch niepowiązanych procesów bez użycia jawnej pętli. Aby pomóc w debugowaniu, należy spodziewać się, że diagnostyka zawsze przejdzie na stderr (lub standardowe wyjście dla niektórych informacji logowania i debugowania). Z tego samego powoduinterpretator Polecenie zostanie odczytane interaktywnie ze standardowego wejścia.
Na przykład poniższy fragment tworzy proces logowania. Następnie wybiera użytkownika (nie pokazano), a na końcu łączy oba. Oczywiście każdy proces może zostać zastąpiony loginem. Powłoka, na przykład, pozwoliłaby użytkownikowi pracować bez dostarczania konta i hasła.
spawn login set login $ spawn_id spawn tip modem # wybierz z powrotem do użytkownika # connect user to login interact -u $ login
Aby wysłać dane wyjściowe do wielu procesów, należy wyświetlić listę wszystkich identyfikatorów odradzania, poprzedzoną znakiem a-wydajność flaga. Dane wejściowe dla grupy wyjściowych identyfikatorów odrodzeń mogą być określone przez listę identyfikatorów odradzania poprzedzoną znakiem a-wkład flaga. (Obie-wkład i-wydajność może przyjmować listy w tej samej formie co-ja flaga woczekiwać polecenie, z tym że any_spawn_id nie ma znaczenia woddziaływać .) Wszystkie poniższe flagi i ciągi znaków (lub wzorce) mają zastosowanie do tego wejścia, dopóki nie pojawi się inna flaga -wejściowa. Jeśli nie-wkład pojawia się,-wydajność oznacza "-input $ user_spawn_id -output". (Podobnie, z wzorami, które nie mają-wkład .) Gdyby jeden-wkład jest określony, zastępuje $ user_spawn_id. Jeśli sekundę-wkład jest określony, zastępuje $ spawn_id. Dodatkowy-wkład mogą zostać określone flagi.
Dwa domyślne procesy wejściowe domyślnie mają swoje wyjścia określone jako $ spawn_id i $ user_spawn_id (odwrotnie). Jeśli-wkład flaga pojawia się bez numeru-wydajność flagę, znaki z tego procesu są odrzucane.
The-ja flaga wprowadza zamiennik bieżącego spawn_id, gdy nie ma innego-wkład lub-wydajność używane są flagi. Flaga -i oznacza opcję -o.
Istnieje możliwość zmiany procesów, z którymi odbywa się interakcja przy użyciu pośrednich identyfikatorów odrodzeń. (Pośrednie identyfikatory odrodzeń są opisane w sekcji dotyczącej polecenia oczekiwać). Pośrednie identyfikatory odrodzeń można określić za pomocą flag -i, -u, -input lub -output.
interpreter argumenty
powoduje, że użytkownik jest interaktywnie monitowanyOczekiwać i polecenia Tcl. Wynik każdego polecenia jest drukowany.
Działania takie jakzłamać idalej powodują struktury kontrolne (tj.dla , proc ) zachowywać się w zwykły sposób. jednakpowrót powoduje, że tłumacz powraca do swojego rozmówcy, podczas gdyinter_return przyczynyinterpretator spowodować powrót w swoim rozmówcy. Na przykład, jeśli zadzwonił "proc foo"interpretator który następnie wykonał akcjęinter_return , proc foo wróci. Każde inne polecenie powodujeinterpretator aby kontynuować monit o nowe polecenia.
Domyślnie monit zawiera dwie liczby całkowite. Pierwsza liczba całkowita opisuje głębokość stosu ocen (tj. Ile razy wywołano Tcl_Eval). Drugą liczbą całkowitą jest identyfikator historii Tcl. Monit można ustawić, definiując procedurę o nazwie "prompt1", której wartość powrotu staje się następnym monitem. Jeśli instrukcja ma otwarte cudzysłowy, wyrazy, nawiasy klamrowe lub nawiasy klamrowe, pomoc dodatkowa (domyślnie "+>") jest wydawana po znaku nowej linii. Pomocniczy wiersz zachęty można ustawić, definiując procedurę zwaną "prompt2".
Podczasinterpretator używany jest tryb gotowany, nawet jeśli jego rozmówca korzystał z trybu surowego.
Jeśli stdin jest zamknięty,interpretator zwróci, chyba że-eof flaga jest używana, w takim przypadku wywoływany jest kolejny argument.
log_file argumenty -a plik
Jeśli podana jest nazwa pliku,plik dziennika zapisze w pliku transkację sesji (począwszy od tego punktu).plik dziennika przerwie nagrywanie, jeśli nie zostanie podany żaden argument. Dowolny poprzedni plik dziennika jest zamknięty.
Zamiast nazwy pliku można podać identyfikator pliku Tcl za pomocą-otwarty lub-pozostawić otwarte flagi. Jest to podobne doikra dowództwo. (Widziećikra po więcej informacji.)
The-za flag wymusza zapisywanie danych wyjściowych, które zostały wyłączone przezlog_user dowództwo.
Domyślnieplik dziennika dowództwo dołącza do starych plików, a nie do ich skracania, dla wygody możliwości wielokrotnego wyłączania i wielokrotnego wylogowywania w jednej sesji. Aby skrócić pliki, użyj-nieapp flaga.
The-info flaga powoduje, że plik_logowy zwraca opis najnowszych podanych argumentów niepoprawnych.
log_user -info | 0 | 1
Domyślnie, dialog wysyłania / przewidywania jest rejestrowany na standardowe wyjście (i plik logu, jeśli jest otwarty). Logowanie do stdout jest wyłączone przez polecenie "log_user 0" i ponownie włączone przez "log_user 1". Logowanie do pliku dziennika pozostaje niezmienione.
The-info flaga powoduje, że użytkownik log_user zwraca opis najnowszych podanych argumentów niepoprawnych.
match_max -d -i spawn_id rozmiar
określa rozmiar bufora (w bajtach) używanego wewnętrznie przezoczekiwać . Z nie rozmiar Argument, zwracany jest bieżący rozmiar.
Dzięki-re flag, ustawiony jest domyślny rozmiar. (Początkowe ustawienie domyślne to 2000.)-ja flag, rozmiar jest ustawiony dla nazwanego identyfikatora odradzania, w przeciwnym razie jest ustawiony dla bieżącego procesu.
overlay - # spawn_id - # spawn_id … program argumenty
wykonuje "program args "w miejsce bieżącegoOczekiwać program, który kończy się. Wyjaśniony argument łącznika wymusza łącznik przed nazwą polecenia, tak jakby był powłoką logowania. Wszystkie spawn_ids są zamknięte, z wyjątkiem tych nazwanych jako argumenty. Są one mapowane na nazwane identyfikatory plików.
Spawn_ids są mapowane na identyfikatory plików, aby nowy program dziedziczył. Na przykład, następująca linia uruchamia szachy i pozwala na kontrolowanie jej przez bieżący proces - powiedzmy, szachowy mistrz.
overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id szachy
Jest to bardziej efektywne niż "interakcja -u", jednak rezygnuje z możliwości programowania interakcji od czasuOczekiwać proces nie jest już kontrolowany.
Zwróć uwagę, że nie ma terminala sterującego. Tak więc, jeśli rozłączysz lub zmienisz standardowe wejście, programy wykonujące kontrolę zadań (powłoki, logowanie itp.) Nie będą działać poprawnie.
parzystość -d -i spawn_id wartość
określa, czy parzystość powinna być zachowana lub usunięta z wyników procesów spawnowanych. Jeśli wartość wynosi zero, parzystość jest usuwana, w przeciwnym razie nie jest pozbawiona. Z nie wartość Argument, zwracana jest bieżąca wartość.
Dzięki-re flag, ustawiana jest domyślna wartość parzystości. (Początkowe ustawienie domyślne to 1, tzn. Parzystość nie jest usuwana.) Z-ja flag, wartość parzystości jest ustawiona dla nazwanego identyfikatora odradzania, w przeciwnym razie jest ustawiona dla bieżącego procesu.
remove_nulls -d -i spawn_id wartość
określa, czy wartości zerowe są zachowywane lub usuwane z wyników procesów spawnowanych przed dopasowaniem wzorca lub przechowywaniem w zmiennej expect_out lub interact_out . Jeśli wartość ma wartość 1, wartości zerowe są usuwane. Jeśli wartość ma wartość 0, wartości null nie są usuwane. Z nie wartość Argument, zwracana jest bieżąca wartość.
Dzięki-re flag, ustawiana jest wartość domyślna. (Początkowe ustawienie domyślne to 1, tzn. Usunięto wartości zerowe.)-ja flag, wartość jest ustawiona dla nazwanego identyfikatora odradzania, w przeciwnym razie jest ustawiona dla bieżącego procesu.
Niezależnie od tego, czy usunięto wartości zerowe,Oczekiwać zapisze puste bajty w logu i stdout.
wyślij ciąg znaków -flags
Wysyła strunowy do obecnego procesu. Na przykład polecenie
wyślij "cześć świat r"
przesyła znaki, jeśli chcesz przejść do bieżącego procesu. (Tcl zawiera polecenie podobne do printf (wywołaneformat ), które mogą tworzyć dowolnie złożone łańcuchy.)
Znaki są wysyłane natychmiast, chociaż programy z wejściem buforowym liniowym nie odczytują znaków, dopóki nie zostanie wysłany znak powrotu. Znak zwracany jest oznaczony " r".
The-- flaga zmusza następny argument do interpretowania jako łańcuch, a nie flagę.Dowolny ciąg może być poprzedzony przez "-", niezależnie od tego, czy faktycznie wygląda jak flaga. Zapewnia to niezawodny mechanizm określania ciągów zmiennych bez ich potknięcia przez przypadkowo wyglądające flagi. (Wszystkie ciągi rozpoczynające się od "-" są zarezerwowane dla przyszłych opcji.)
The-ja flaga deklaruje, że ciąg jest wysyłany do nazwanego spawn_id. Jeśli jest to spawn_id user_spawn_id , a terminal jest w trybie raw, nowe linie w ciągu są tłumaczone na sekwencje return-newline, aby wyglądały tak, jakby terminal był w trybie gotowym. The-surowy flaga wyłącza to tłumaczenie.
The-zero flaga wysyła puste znaki (0 bajtów). Domyślnie wysyłana jest jedna wartość null. Liczba całkowita może podążać za-zero aby wskazać liczbę pustych adresów do wysłania.
The-złamać flaga generuje warunek przerwania. Ma to sens tylko wtedy, gdy identyfikator odradzania odnosi się do urządzenia tty otwartego poprzez "spawn -open". Jeśli stworzyłeś proces taki jak napiwek, powinieneś użyć konwencji końcówki do generowania przerwy.
The-s flag force wysyła dane "wolno", unikając w ten sposób typowej sytuacji, w której komputer outtypuje bufor wejściowy, który został zaprojektowany dla człowieka, który nigdy nie przekroczy tego samego bufora. To wyjście jest kontrolowane przez wartość zmiennej "send_slow", która pobiera listę dwóch elementów. Pierwszym elementem jest liczba całkowita opisująca liczbę bajtów wysyłanych atomowo. Drugi element to liczba rzeczywista, która opisuje liczbę sekund, przez którą wysyłane sygnały atomowe muszą być rozdzielone. Na przykład "set send_slow {10 .001}" zmusiłoby "send -s" do wysłania łańcuchów z 1 milisekundą pomiędzy każdymi 10 znakami wysłanymi.
The-h flagowe siły wysyłają dane (nieco) jak człowiek faktycznie piszący. Ludzkie opóźnienia pojawiają się między postaciami. (Algorytm oparty jest na rozkładzie Weibulla, z modyfikacjami dopasowanymi do tej konkretnej aplikacji.) Wyjście to jest kontrolowane przez wartość zmiennej "send_human", która przyjmuje listę pięciu elementów. Pierwsze dwa elementy to średni międzywarstwowy czas postaci w sekundach. Pierwszy jest używany domyślnie. Drugi jest używany na końcówkach słów, aby symulować subtelne pauzy, które czasami występują przy takich przejściach. Trzeci parametr jest miarą zmienności, gdzie .1 jest dość zmienny, 1 jest rozsądnie zmienny, a 10 jest dość niezmienny. Ekstremalne są od 0 do nieskończoności. Ostatnie dwa parametry to odpowiednio minimalny i maksymalny czas międzyarbiterski. Minimalne i maksymalne są używane jako ostatnie, a "końcowe". Ostateczna średnia może się znacznie różnić od podanej średniej, jeśli minimalna i maksymalna wartość klipu wystarczą.
Przykład: poniższe polecenie emuluje szybką i spójną maszynistkę:
set send_human {.1 .3 1 .05 2} send -h "Jestem głodny. Zróbmy lunch."
podczas gdy po kacu mogą być bardziej odpowiednie:
set send_human {.4 .4 .2 .5 100} send -h "Goodd party lash night!"
Zauważ, że błędy nie są symulowane, chociaż możesz sam skonfigurować sytuacje korekcji błędów, osadzając błędy i poprawki w argumencie wysyłania.
Flagi do wysyłania pustych znaków, do wysyłania breaków, do wymuszania powolnego wyjścia i do ludzkiego stylu, wykluczają się wzajemnie. Używane będzie tylko jedno określone jako ostatnie. Ponadto nie strunowy Argument można określić przy pomocy flag dla wysyłania pustych znaków lub przerw.
Dobrze jest poprzedzić pierwszywysłać do procesu przezoczekiwać. oczekiwać będzie czekać na rozpoczęcie procesu, podczas gdywysłać nie może. W szczególności, jeśli pierwszywysłać kończy się, zanim proces się uruchomi, istnieje ryzyko, że Twoje dane zostaną zignorowane. W sytuacjach, w których programy interaktywne nie oferują początkowego pytania, można poprzedzićwysłać opóźnieniem, jak w:
# Aby uniknąć udzielania hakerom wskazówek, jak się włamać, # ten system nie pyta o hasło zewnętrzne. # Poczekaj 5 sekund, aż exec dokończy odradzanie telnet very.secure.gov spać 5 wyślij hasło r
exp_send to alias dla wysłać. Jeśli używasz Expectk lub innego wariantu Expect w środowisku Tk,wysłać jest zdefiniowany przez TK dla zupełnie innego celu.exp_send zapewnia zgodność między środowiskami. Podobne aliasy są dostępne dla innych poleceń wysyłania innych Expecta.
send_error -flags ciąg
jest jakwysłać , z tym wyjątkiem, że dane wyjściowe są wysyłane do stderr zamiast do bieżącego procesu.
send_log - ciąg
jest jakwysłać , z tym wyjątkiem, że ciąg jest wysyłany tylko do pliku dziennika (patrzplik dziennika .) Argumenty są ignorowane, jeśli żaden plik dziennika nie jest otwarty.
send_tty -flags ciąg
jest jakwysłać , z wyjątkiem tego, że dane wyjściowe są wysyłane do / dev / tty, a nie do bieżącego procesu.
send_user -flags ciąg
jest jakwysłać , z tym wyjątkiem, że dane wyjściowe są wysyłane do standardowego wyjścia, a nie do bieżącego procesu.
spać sekundy
powoduje, że skrypt przesypia na określoną liczbę sekund. Sekundy mogą być liczbą dziesiętną. Przerwania (i zdarzenia TK, jeśli używasz Expectk) są przetwarzane podczas oczekiwania na sen.
spawn args program argumenty
tworzy nowy proces uruchomiony "program args ".Stdin, stdout i stderr są połączone z Expect, dzięki czemu mogą być odczytywane i zapisywane przez inneOczekiwać polecenia. Połączenie jest zepsute przezblisko lub jeśli sam proces zamyka dowolny z identyfikatorów plików.
Kiedy proces jest uruchamiany przezikra , zmienna spawn_id jest ustawiony na deskryptor odnoszący się do tego procesu. Proces opisany przez spawn_id jest uważany za "obecny proces" . spawn_id mogą być czytane lub pisane, w efekcie zapewniając kontrolę pracy.
user_spawn_id jest zmienną globalną zawierającą deskryptor odnoszący się do użytkownika. Na przykład, kiedy spawn_id jest ustawiona na tę wartość,oczekiwać zachowuje się jakexpect_user .
.JA error_spawn_id jest globalną zmienną zawierającą deskryptor, który odnosi się do standardowego błędu. Na przykład, kiedy spawn_id jest ustawiona na tę wartość,wysłać zachowuje się jakWyślij błąd .
tty_spawn_id jest globalną zmienną zawierającą deskryptor, który odnosi się do / dev / tty. Jeśli / dev / tty nie istnieje (np. W skryptach cron, at lub batch), to tty_spawn_id nie jest zdefiniowany. Może to być testowane jako:
jeśli {info vars tty_spawn_id} {# / dev / tty istnieje} else {# / dev / tty nie istnieje # prawdopodobnie w cronie, wsadzie lub w skrypcie}
ikra zwraca identyfikator procesu UNIX. Jeśli nie zostanie utworzony żaden proces, zwracane jest 0. Zmienna spawn_out (slave, name) jest ustawiona na nazwę urządzenia pty slave.
Domyślnie,ikra echa nazwy polecenia i argumentów. The-noecho flaga zatrzymuje sięikra od tego.
The-konsola flaga powoduje przekierowanie wyjścia konsoli do zesynchronizowanego procesu. To nie jest obsługiwane na wszystkich systemach.
Wewnętrznie,ikra używa pty, zainicjalizowane w taki sam sposób jak tty użytkownika. To jest dalej inicjalizowane, aby wszystkie ustawienia były "rozsądne" (zgod