Bekle, bir komut dosyasına göre diğer etkileşimli programlarla konuşan bir programdır. Komutu takiben, Expect bir programdan neler beklenebileceğini ve doğru cevabın ne olması gerektiğini bilir. Yorumlanan dil, diyaloğu yönlendirmek için dallanma ve yüksek seviyeli kontrol yapıları sağlar. Buna ek olarak, kullanıcı istediği zaman kontrol edebilir ve doğrudan etkileşime girebilir.
Expectk, Expect ve Tk'nin bir karışımıdır. Expect ve Tk'in dileği gibi davranıyor. Bekleme ayrıca doğrudan Tcl olmaksızın C veya C ++ da kullanılabilir.
"Expect" adı, uucp, kermit ve diğer modem kontrol programları tarafından popülerleştirilen gönderme / bekleme dizileri fikrinden gelmektedir. Ancak, uucp'den farklı olarak, Expect genelleştirilir, böylece herhangi bir program ve görev göz önünde bulundurularak kullanıcı düzeyinde bir komut olarak çalıştırılabilir. Bekleme aynı anda çeşitli programlarla konuşabilir.
Ne Yapabilir?
Örneğin, bekleyiş komutunun yapabileceği bazı şeyler şunlardır:
- Bilgisayarınızın sizi tekrar aramasına neden olursunuz, böylece çağrı için ödeme yapmadan giriş yapabilirsiniz.
- Bir oyun başlatın ve en uygun konfigürasyon görünmüyorsa, tekrar tekrar ve tekrar başlatın) ve sonra kontrolü elinize verin.
- Fsck'i çalıştırın ve sorularına yanıt olarak, önceden belirlenen kriterlere göre “evet” veya “hayır” cevabını verin veya size geri kontrol verin.
- Başka bir ağa bağlanın ve postanızı otomatik olarak yerel sisteminize gönderilmiş gibi görünecek şekilde otomatik olarak alın.
- Ortam değişkenlerini, geçerli dizini veya rlogin, telnet, ipucu, su veya chgrp arasındaki her türlü bilgiyi taşıyın
Kabuğun bu görevleri gerçekleştirememesinin çeşitli nedenleri vardır. Tüm Beklenen ile mümkündür.
Genel olarak, Beklenti, program ve kullanıcı arasında etkileşim gerektiren herhangi bir programı çalıştırmak için yararlıdır. Gerekli olan tek şey, etkileşimin programlı olarak karakterize edilebilmesidir. Bekletme, kontrol edilen programı durdurmadan kullanıcıya geri kontrolü de verebilir. Benzer şekilde, kullanıcı denetimi istediği zaman komut dosyasına geri döndürebilir.
kullanım
Yürütülecek komutların bir listesi için cmdfile okur. Bekleyen, #! 'I destekleyen sistemlere dolaylı olarak çağrılabilir. betiği yürütülebilir olarak işaretleyerek ve komut satırında ilk satırı yaparak notasyon:
#! / usr / local / bin / expect -fElbette, yolun Beklentilerin nerede yaşadığını doğru bir şekilde tanımlaması gerekir. / usr / local / bin sadece bir örnektir.
-c bayrağı, komut dosyasında herhangi bir önce yürütülecek bir komut oluşturur. Kabuk tarafından kırılmasının engellenmesi için komut verilmelidir. Bu seçenek birden çok kez kullanılabilir. Birden çok komut, noktalı virgülle ayırarak bir -c ile yürütülebilir. Komutlar göründükleri sırayla yürütülür. Expectk kullanırken, bu seçenek -command olarak belirtilir.
-d bayrağı, öncelikle bekle ve etkileşim gibi komutların içsel etkinliğini bildiren bazı tanılama çıktısı sağlar. Bu bayrak, bir Expect betiğinin başlangıcında "exp_internal 1" ile aynı etkiye sahiptir, ayrıca Expect'in sürümü yazdırılır.
-D bayrağı, etkileşimli bir hata ayıklayıcıyı etkinleştirir. Tam sayı değeri takip etmelidir. Hata ayıklayıcı, değer sıfır değilse veya bir ^ C basılırsa veya bir kesme noktası vurulursa, ya da komut dosyasında başka bir uygun hata ayıklama komutu görüntülenirse, sonraki Tcl yordamından önce denetimi ele geçirecektir. Expectk kullanırken, bu seçenek - Debug olarak belirtilir.
-f bayrağı, komutların okunacağı bir dosya oluşturur. Bayrağın kendisi isteğe bağlıdır, çünkü sadece #! notasyon, böylece komut satırında diğer argümanlar sağlanabilir. Expectk kullanırken, bu seçenek -file olarak belirtilir.
Varsayılan olarak, komut dosyası belleğe okunur ve bütünüyle yürütülür. Dosyaların her defasında bir satır okunması bazen istenir. Rasgele dosyaların bu şekilde ele alınmasını zorlamak için -b bayrağını kullanın. Expectk kullanıldığında, bu seçenek -buffer olarak belirtilir.
"-" dizesi bir dosya adı olarak verilirse, bunun yerine standart giriş okunur. Aslında "-" adlı bir dosyadan okumak için "./-" kullanın.
-i bayrağı, bir dosyadan okumak yerine komutları etkileşimli olarak sormayı bekliyor. İstemi çıkış komutuyla veya EOF ile sonlandırılır. -i bayrağı ne komut dosyası ne de -c kullanılıyorsa kabul edilir. Expectk kullanıldığında, bu seçenek -interactive olarak belirtilir.
- Seçeneklerin sonunu sınırlamak için kullanılabilir. Bu, Expect tarafından yorumlanmadan komut dosyanıza seçenek benzeri bir argüman iletmek istiyorsanız kullanışlıdır. Bu yararlı bir şekilde # içine yerleştirilebilir! Expect tarafından herhangi bir flaglike yorumlamayı önlemek için hat. Örneğin, aşağıdaki argv değişkeninde betik adı da dahil olmak üzere orijinal argümanları bırakacaktır.
#! / usr / local / bin / expect -#! 'Ye argümanlar eklerken normal getopt (3) ve execve (2) kurallarının göz önünde bulundurulması gerektiğini unutmayın. hat.
-N bayrağı kullanılmadığı takdirde $ exp_library / expect.rc dosyası otomatik olarak sunulur. (Expectk kullanırken, bu seçenek -NORC olarak belirtilir.) Hemen ardından, -n bayrağı kullanılmadığı takdirde ~ / .expect.rc dosyası otomatik olarak alınır. DOTDIR ortam değişkeni tanımlanmışsa, bir dizin olarak ele alınır ve .expect.rc oradan okunur. Expectk kullanıldığında, bu seçenek -norc olarak belirtilir. Bu kaynak, yalnızca herhangi bir -c bayrağı çalıştırıldıktan sonra gerçekleşir.
-v neden sürüm numarasını yazdırmak ve çıkmak için bekliyoruz. Uzun bayrak isimlerini kullanan Expectk'deki ilgili bayrak, -version.
İsteğe bağlı hatalar bir listeye inşa edilir ve argv ve. argc, argv uzunluğuna başlatıldı.
Hiçbir betik kullanılmadığında, Argv0 komut dosyasının veya ikili dosyasının adı olarak tanımlanır. Örneğin, aşağıdaki komut dosyasının adını ve ilk üç bağımsız değişkeni yazdırır:
send_user "$ argv0 [lrange $ argv 0 2] \ n"Komutları
Aracı Komut Dili kullanır bekliyoruz. Tcl, kontrol akışını (eğer kırılma için ise), ifade değerlendirmesini ve tekrarlama ve prosedür tanımı gibi diğer birçok özelliği sağlar. Burada kullanılan ancak tanımlı olmayan komutlar (set, if, exec) Tcl komutlarıdır. Bekleme ek komutları destekler. Aksi belirtilmedikçe, komutlar boş dizgiyi döndürür.
Komutlar alfabetik olarak listelenir, böylece hızlı bir şekilde yerleştirilebilirler. Bununla birlikte, yeni kullanıcılar bu sırayla yumurtlamanın açıklamalarını okuyarak, göndererek, beklediklerinde ve etkileşimde bulunarak daha kolay bir başlangıç bulabilirler.
kapat [-slave] [-onexec 0 | 1] [-i spawn_id]mevcut işlemle bağlantıyı kapatır. Çoğu etkileşimli program, EFT'lerini stdinlerinde tespit edecek ve çıkacaktır; Bu nedenle, genellikle, süreci de öldürmek için yeterlidir. -i bayrağı, adlandırılan spawn_id'e karşılık gelen işlemi kapatma işlemini bildirir.
Hem beklenen hem de etkileşim, mevcut işlemin ne zaman çıkacağını ve dolaylı olarak kapanışını algılayacaktır, ancak işlemi "$ pid'i öldür" komutunu kullanarak öldürürseniz, açık bir şekilde yaklaşmanız gerekir .
-onexec bayrağı, yumurtlama kimliğinin yeni herhangi bir yumurtlama işleminde kapalı olup olmadığını veya işlemin üst üste yerleştirildiğini belirler. Bir yumurtlama kimliğini açık bırakmak için, 0 değerini kullanın. Sıfır olmayan bir tam sayı değeri, yeni bir süreçte yumurtlamayı kapatır.
-Slave bayrağı, spawn id ile ilişkili köleyi kapatır. Bağlantı kapatıldığında, hala açıksa köle otomatik olarak kapanır.
Bağlantının dolaylı veya açık bir şekilde kapatılıp kapatılmadığına bakılmaksızın, ilgili çekirdek işlem aralığını temizlemek için beklemeniz gerekir. Kapama işleminin kapatılmasının çıkışa neden olacağının garantisi olmadığından, close komutu beklemez.
hata ayıklama [[-now] 0 | 1]ifadeler arasında geçiş yapmanıza ve kesme noktalarını ayarlamanıza olanak tanıyan bir Tcl hata ayıklayıcısını denetler.
Hiçbir argüman olmadan, hata ayıklayıcı çalışmıyorsa 1 döndürür, aksi takdirde 0 döndürülür.
1 argüman ile hata ayıklayıcı başlatıldı. 0 argümanı ile hata ayıklayıcı durdurulur. -now bayrağı ile 1 argümandan önce gelirse, hata ayıklayıcı hemen başlatılır. Aksi takdirde, hata ayıklayıcı sonraki Tcl deyimiyle başlatılır.
Hata ayıklama komutu, hiçbir tuzağı değiştirmez. Bunu -D bayrağı ile Beklemeye başlamak için karşılaştırın.
Bağlantı kesme komutu terminalden çatallı bir işlemi keser. Arka planda çalışmaya devam ediyor. Süreci kendi süreç grubu verilir. Standart G / Ç, / dev / null'a yönlendirildi.
Aşağıdaki parça, komut dosyasını arka planda çalışmaya devam etmek için bağlantıyı kullanır.
eğer {[fork]! = 0} çıkış bağlantısını keserseniz. . .Aşağıdaki komut dosyası bir parola okur ve her çalıştırıldığında her saat bir parola isteyen bir program çalıştırır. Komut dosyası parola sağlar, böylece yalnızca bir kez yazmanız gerekir.
send_user "parola? \" expect_user -re "(. *) \ n" for {} 1 {} {if {[fork]! = 0} {sleep 3600; devam et} spawn priv_prog bağlantısının kesilmesi Parola: "$ expect_out (gönder) 1, dize). . . çıkış }Kabuk asenkronize işlem özelliği (&) üzerinden bağlantıyı kesmenin bir avantajı, Expect'in bağlantı kesilmeden önce terminal parametrelerini kaydedebilmesi ve daha sonra bunları yeni ppt'lere uygulayabilmesidir. &, Expect'in terminalin parametrelerini okuma şansı yoktur, çünkü Terminal zaten kontrolün alındığı an itibariyle terminalin bağlantısı kesilmiş demektir.
çıkış [-opts] [durum]Neden çıkmayı bekliyoruz ya da bunu yapmaya hazır olun.
-onexit bayrağı, sonraki argümanın bir çıkış işleyicisi olarak kullanılmasına neden olur. Bir argüman olmadan, mevcut çıkış işleyicisi döndürülür.
-İskoçya bayrağı, çıkışa hazırlanmayı bekliyor ancak kontrolün aslında işletim sistemine geri dönmesini engelliyor . Kullanıcı tanımlı çıkış işleyicisi, Expect'in kendi iç işleyicileri kadar çalıştırılır. Başka Bekleme komutları yürütülmemelidir. Bu, diğer Tcl uzantıları ile Expect çalıştırıyorsanız kullanışlıdır. Mevcut yorumlayıcı (ve Tk ortamındaysa ana pencere) kalır, böylece diğer Tcl uzantıları temizlenebilir. Expect'in çıkışı tekrar çağrılırsa (ancak bu gerçekleşebilir), işleyiciler tekrar çalışmaz.
Çıktıktan sonra, ortaya çıkan süreçlere tüm bağlantılar kapalıdır. Kapatma, ortaya çıkan süreçlerle bir EOF olarak algılanacaktır. exit , normal _exit (2) prosedürünün yaptıklarının ötesinde başka hiçbir işlem yapmaz. Böylece, EOF'yi kontrol etmeyen ortaya çıkan süreçler çalışmaya devam edebilir. (Örneğin, ortaya çıkan bir sürecin hangi sinyallerin gönderileceğini belirten bir dizi koşul önemlidir, ancak bunlar genellikle sisteme bağımlıdır, genellikle çıkışta belgelenir (3).) Çalışmaya devam eden yumurtlama süreçleri init tarafından miras alınacaktır.
Durum (veya belirtilmemişse 0) Bekleme durumunun çıkış durumu olarak döndürülür. komut dosyasının sonuna ulaşıldığında çıkış örtülü olarak yürütülür.
exp_continue [-continue_timer]
Exp_continue komutu, normalde olduğu gibi geri dönmek yerine yürütmeye devam etmeyi bekler . Varsayılan olarak exp_continue , zaman aşımı zamanlayıcısını sıfırlar. -continue_timer bayrağı, zamanlayıcının yeniden başlatılmasını engeller. (Daha fazla bilgi için bekleyiniz.)
exp_internal [-f dosya] değeri
Değer sıfır değilse, diğer komutların stderr içinde beklemesini sağlayacak tanı bilgilerini göndermesine neden olur. Bu çıktı, değer 0 olduğunda devre dışı bırakılır. Tanılama bilgileri, alınan her karakteri ve geçerli çıktının kalıplarla eşleşmesi için yapılan her girişimi içerir.
İsteğe bağlı dosya sağlanırsa, tüm normal ve hata ayıklama çıktıları bu dosyaya yazılır (değerin değerine bakılmaksızın). Herhangi bir önceki diyagnostik çıktı dosyası kapalı.
-info bayrağı, exp_internal'ın verilen en son bilgi içermeyen argümanların bir açıklamasını döndürmesine neden olur.
exp_open [args] [-i spawn_id]
orijinal yumurtlama kimliğine karşılık gelen bir Tcl dosya tanımlayıcısı döndürür. Dosya tanımlayıcısı daha sonra Tcl'nin açık komutuyla açılmış gibi kullanılabilir. (Spawn kimliği artık kullanılmamalıdır. Bir bekleme yapılmamalıdır.
-leaveopen bayrağı, Exped komutlarıyla erişim için spawn id açık bırakır. Spawn id üzerinde bir bekleyiş yapılmalıdır.
exp_pid [-i spawn_id]
Şu anda ortaya çıkan işleme karşılık gelen işlem kimliğini döndürür. -i bayrağı kullanılırsa, döndürülen pid verilen spawn kimliğine karşılık gelir.
exp_send
göndermek için bir takma addır .
exp_send_error
send_error için bir takma addır .
exp_send_log
send_log için bir takma addır .
exp_send_tty
send_tty için bir takma addır .
exp_send_user
send_user için bir takma addır .
exp_version [[-exit] sürümü]
komut dosyasının geçerli Expect sürümüyle uyumlu olmasını sağlamak için kullanışlıdır.
Hiçbir argüman olmadan, Expect'in geçerli sürümü döndürülür. Bu sürüm daha sonra komut dosyanızda kodlanmış olabilir. Son sürümlerin özelliklerini kullanmadığınızı biliyorsanız, daha eski bir sürümü belirtebilirsiniz.
Sürümler noktalarla ayrılmış üç sayıdan oluşur. İlk önemli sayıdır. Expect'in farklı büyük sayılarla yazılması için yazılmış betikler neredeyse kesinlikle işe yaramayacaktır. Büyük sayılar eşleşmezse exp_version bir hata döndürür.
İkincisi, küçük sayıdır. Mevcut sürümden daha küçük bir sayıya sahip bir versiyon için yazılmış komut dosyaları bazı yeni özelliklere bağlı olabilir ve çalışmayabilir. büyük sayılar eşleşirse, exp_version bir hata döndürür, ancak betik minör sayısı çalışan Expect'inkinden daha büyüktür.
Üçüncüsü, sürüm karşılaştırmasında rol oynamayan bir sayıdır. Bununla birlikte, Expect yazılım dağıtımının herhangi bir şekilde, ek dokümantasyon veya optimizasyon gibi değiştiğinde artırılır. Her yeni küçük sürümde 0'a sıfırlanır.
-exit flag ile Expect bir hata yazdırır ve sürüm güncel değilse çıkar.
[[-opts] pat1 body1] bekliyoruz ... [-opts] patn [bodyn]
kalıplardan birinin yumurtlanan bir işlemin çıktısı ile eşleşmesi, belirli bir süre geçmesi veya dosya sonu görülmesi beklenir. Son vücut boşsa, ihmal edilebilir.
En son expect_before komutundaki kalıplar, başka herhangi bir modelden önce örtülü olarak kullanılır. En yeni expect_after komutundan gelen desenler, diğer kalıplardan sonra örtük olarak kullanılır.
Tüm bekletme ifadesinin argümanlarının birden fazla satır gerektirmesi durumunda, tüm argümanlar, her satırı bir ters eğik çizgi ile sonlandırmaktan kaçınmak için bire "desteklenebilir". Bu durumda, parantezlere rağmen olağan Tcl ikameleri gerçekleşecektir.
Bir kalıp eof anahtar kelimesiyse, ilgili kütük dosya sonunda yapılır. Bir kalıp, zaman aşımı anahtar kelimesiyse, ilgili birim zaman aşımı sırasında yürütülür. Zaman aşımı anahtar kelimesi kullanılmazsa, zaman aşımı sırasında örtülü bir boş eylem gerçekleştirilir. Varsayılan zaman aşımı süresi 10 saniyedir, ancak "30 ayarlanmış süre" komutu ile örneğin 30'a ayarlanabilir. Sonsuz bir zaman aşımı -1 değeriyle belirlenebilir. Bir kalıp varsayılan anahtar kelimeyse , ilgili gövde, zaman aşımı veya dosya sonu üzerinde yürütülür.
Bir desen eşleşirse, ilgili gövde yürütülür. Bekleme , gövdenin sonucunu döndürür (veya herhangi bir desen eşleşmezse boş dizge). Birden fazla modelin eşleşmesi durumunda, ilk önce bir beden seçmek için kullanılır.
Her yeni çıktı geldiğinde, her bir modele listelendikleri sırayla karşılaştırılır. Böylece, bir eşleşme yokluğu gibi son bir kalıbın görünmesini garanti altına alarak bir eşleşmenin olmadığını test edebilirsiniz. Herhangi bir istemin olmadığı durumlarda, zaman aşımını kullanmalısınız (tıpkı el ile etkileşimde olsaydınız yaptığınız gibi).
Kalıplar üç şekilde belirtilmiştir. Varsayılan olarak, desenler Tcl'nin dizgi eşleme komutuyla belirtilir. (Bu tür desenler, genellikle "glob" kalıpları diye değinilen C-kabuk düzenli ifadelerine de benzerdir). -gl bayrağı, bayrakların beklenmedik şekilde eşleşecek kalıpları korumak için kullanılabilir. "-" ile başlayan herhangi bir desen bu şekilde korunmalıdır. ("-" ile başlayan tüm dizeler gelecekteki seçenekler için ayrılmıştır.)
Örneğin, aşağıdaki parça başarılı bir giriş için arar. ( İptal işleminin , komut dosyasında başka bir yerde tanımlanmış bir prosedür olduğu varsayılmaktadır.)
bekliyoruz {busy {meşgul \ n; exp_continue} "geçersiz şifre" iptal edildi abort zaman aşımı iptal edildi}Dördüncü düzende tırnaklar gereklidir, çünkü bu, deseni eylemden başka şekilde ayıracak bir boşluk içerir. Aynı eylemi olan (3. ve 4. gibi) desenler, eylemleri tekrar listelemeyi gerektirir. Bu regexp tarzı desenleri kullanarak önlenebilir (aşağıya bakınız). Glob tarzı desenler oluşturma hakkında daha fazla bilgi Tcl kılavuzunda bulunabilir.
Regexp tarzı desenler, Tcl'nin regexp ("normal ifade" için kısa) komutunun tanımladığı sözdizimini izler. regexp desenleri bayrak -re ile tanıtıldı. Önceki örnek, bir regexp kullanarak şu şekilde yeniden yazılabilir:
bekliyoruz {busy {meşgul \ n; exp_continue} -re "başarısız | geçersiz şifre" iptal zaman aşımı iptal edildi}Her iki desen türü de "uncanchored". Bu, kalıpların tüm dizeyle eşleşmesi gerekmediği anlamına gelir, ancak eşleşmeyi dizenin herhangi bir yerinde (her şey eşleştiği sürece) başlatabilir ve sonlandırabilir. Bir dizenin başlangıcına uyacak şekilde ^ ve ucunu eşleştirmek için $ kullanın. Bir dizginin sonuna kadar beklemezseniz, yanıtlarınızın, dizginin ortasındaki, kendiliğinden oluşturulmuş işlemden yankılandıkça kolayca sonlanabileceğini unutmayın. Hala doğru sonuçlar üretirken, çıktı doğal görünmeyebilir. Böylece, bir dizenin sonunda karakterleri tam olarak tanımlayabiliyorsanız, $ 'ın kullanılması teşvik edilir.
Birçok editörde, ^ ve $ 'nin sırasıyla satırların başlangıcı ve bitişi ile eşleştiğini unutmayın. Ancak, bekletme çizgisi yönelimi olmadığından, bu karakterler beklemede olan eşleme arabelleğinde şu anda verilerin (satırların aksine) başlangıcı ve bitişi ile eşleşir. (Ayrıca, "sistem hazımsızlığı" konusundaki aşağıdaki nota bakın.)
-ex bayrağı, desenin bir "tam" dizgi olarak eşleşmesine neden olur. *, ^, Vb. Hiçbir yorum yapılmaz (her ne kadar olağan Tcl kuralları hala gözlemlenmelidir). Kesin kalıplar her zaman tekboynuzdur.
-Nocase bayrağı, çıktının büyük harf karakterlerini küçük harfli karakterler gibi karşılaştırır. Desen etkilenmez.
Çıktı okurken, 2000 bayttan fazlası , baytların "unutulması" için zorlayabilir. Bu match_max işleviyle değiştirilebilir . (Aşırı büyük değerlerin desen eşleştiricisini yavaşlatabildiğini unutmayın.) Patlist full_buffer ise, match_max baytları alınmışsa ve başka hiçbir desen eşleşmediyse, ilgili gövde yürütülür. Full_buffer anahtar sözcüğünün kullanılıp kullanılmayacağı, unutulmuş karakterler bekleyen_out (buffer) olarak yazılır.
Eğer patlist null anahtar kelimesiyse ve boş değerlere izin verilirse ( remove_nulls komutuyla), tek bir ASCII 0 eşleştiğinde ilgili gövde yürütülür. 0 bayt'ı glob veya regexp kalıpları ile eşleştirmek mümkün değildir.
Bir deseni (veya eof veya full_buffer) eşleştirdikten sonra, eşleşen ve önceden eşleşmeyen herhangi bir çıktı, wait_out (buffer) değişkenine kaydedilir. Wait_out (9, string) üzerinden wait_out ( 1, string) değişkenlerine 9 adet regexp substring eşleşmesi kaydedilir. -indices bayrağı bir desenden önce kullanılırsa, 10 dizenin başlangıç ve bitiş indisleri ( garip için uygun bir formda), değişken_de (X, başlangıç) ve bekliyor_out (X, end) değişkenlerinde saklanır. rakam, tampondaki alt dizgi konumuna karşılık gelir. Şekil 0, tüm modeli eşleştiren ve yeniden şekillendirme kalıplarının yanı sıra küre desenleri için üretilen dizeleri belirtmektedir. Örneğin, bir işlem "abcdefgh \ n" çıktısı aldıysa, sonucu:
"cd" bekliyoruzAşağıdaki ifadeler idam edilmiş gibi:
wait_out (0, string) set cd set wait_out (buffer) abcdve çıktı tamponunda "efgh \ n" kalıyor. Bir işlem çıktı "abbbcabkkkka \ n" ürettiyse, sonucu:
bekler -indices -re "b (b *). * (k +)"Aşağıdaki ifadeler idam edilmiş gibi:
set wait_out (0, başlat) 1 set expect_out (0, son) 10 set wait_out (0, string) bbbcabkkkk set expect_out (1, başlangıç) 2 set expect_out (1, son) 3 set expect_out (1, string) bb set wait_out (2, başlangıç) 10 set expect_out (2, son) 10 set wait_out (2, string) k set wait_out (tampon) abbbcabkkkkve çıktı arabelleğinde "a \ n" kalır. "*" (Ve -re ". *") Desenleri, çıktı arabelleğini işlemden daha fazla çıktı okumadan akıtır.
Normal olarak, eşleşen çıktı Expect'in dahili tamponlarından atılır. Bu, -notransfer bayrağıyla bir şablonun ön eklenmesiyle önlenebilir. Bu bayrak özellikle denemede kullanışlıdır (deney yaparken kolaylık sağlamak için "-not" a kısaltılmış olabilir).
Eşleşen çıktı (veya eof veya full_buffer) ile ilişkilendirilmiş spawn id, wait_out (spawn_id) içinde depolanır.
-timeout bayrağı, geçerli bekleme komutunun, zaman aşımı değişkeninin değerini kullanmak yerine aşağıdaki değeri bir zaman aşımı olarak kullanmasına neden olur.
Varsayılan olarak, desenler mevcut işlemin çıktısına karşı eşleşir, ancak -i bayrağı, adlandırılan spawn_id listesindeki çıktının aşağıdaki herhangi bir desene göre eşleştirileceğini bildirir (bir sonraki -i'ye kadar). Spawn_id listesi, ya spawn_id'lerin boşlukla ayrılmış bir listesi veya spawn_ids'in bu tür listesine başvuran bir değişken olmalıdır.
Örneğin, aşağıdaki örnek, geçerli işlemden "bağlı" veya $ proc2 adlı spawn_id tarafından "meşgul", "başarısız" veya "geçersiz parola" için bekler.
{-i $ proc2 meşgul {wait meşgul \ n; exp_continue} -re "başarısız | geçersiz şifre" iptal zaman aşımı iptal edildi}Any_spawn_id global değişkeninin değeri, mevcut bekletme komutunda tüm diğer -i bayraklarıyla adlandırılan herhangi bir spawn_ids'e desenleri eşleştirmek için kullanılabilir. Herhangi bir ilişkili kalıp içermeyen bir -i işaretinden (yani hemen başka bir -i tarafından takip edilen) gelen spawn_id , any_spawn_id ile ilişkili aynı bekletme komutundaki diğer modellere kullanılabilir .
-i bayrağı, global bir değişkeni de isimlendirebilir, bu durumda değişken, bir yumurtlayan ids listesi için okunur. Değiştiğinde değişken tekrar okunur. Bu, komut yürütülürken I / O kaynağını değiştirmenin bir yolunu sağlar. Bu şekilde sağlanan yumurtlamak ids "dolaylı" yumurtlayan kimlikleri denir.
Kırılma ve devam etme gibi eylemler, kontrol yapılarının (yani, proc için ) olağan şekilde davranmasına neden olur. Exp_continue komutu, normalde olduğu gibi geri dönmek yerine yürütmeye devam etmeyi bekler .
Bu, açık döngülerden veya tekrarlanan beklenti ifadelerinden kaçınmak için kullanışlıdır. Aşağıdaki örnek, rlogini otomatikleştirmek için bir parçanın parçasıdır. Exp_continue , rlogin bir parola sorarsa ikinci bir bekletme ifadesi yazmak zorunda kalmaz (istemi yeniden aramak için).
$ ana bilgisayarında {Şifre: {stty -echo send_user "şifresini ($ user için) bekliyoruz:" expect_user -re "(. *) \ n" send_user "\ n" gönder "$ expect_out (1, string) \ r" stty echo exp_continue} yanlış {send_user} geçersiz parola veya hesap \ n "exit} zaman aşımı {send_user" bağlantısı için ana bilgisayar zaman aşımına uğradı \ n "exit} eof {send_user \" ana bilgisayar bağlantısı başarısız oldu: $ expect_out (buffer) "exit} - yeniden sorÖrneğin, aşağıdaki parça, bir kullanıcının zaten tamamen otomatikleştirilmiş bir etkileşime kılavuzluk etmesine yardımcı olabilir. Bu durumda, terminal ham moda geçirilir. Kullanıcı "+" a basarsa, bir değişken artar. Eğer "p" basılırsa, işleme bir miktar iadeler gönderilir, belki de bir şekilde poke edilir ve "i" kullanıcının işlemle etkileşime girmesine izin verir, komut dosyasının denetimini etkin bir şekilde ele geçirir. Her durumda, exp_continue , geçerli eylemi yürüttükten sonra akımın desen eşleştirmeye devam etmesini bekler .
stty raw -echo expect_after {-i $ user_spawn_id "p" {gönder "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {etkileşim; exp_continue} "çık" çıkış}Varsayılan olarak, exp_continue zaman aşımı zamanlayıcısını sıfırlar. Exp_continue -continue_timer bayrağı ile çağrılırsa, zamanlayıcı yeniden başlatılmaz.
expect_after [expect_args]
hem beklemeden hem de beklemeden gelen kalıpların eşleşmesi durumunda, beklenen kalıbın kullanılması dışında, beklemede aynı şekilde çalışır. Daha fazla bilgi için expect_before komutuna bakın.
expect_background [expect_args]
aynı argümanları beklediği gibi alır, ancak hemen geri döner. Yeni girdi geldiğinde desenler test edilir. Kalıp zaman aşımı ve varsayılan , wait_background için anlamsızdır ve sessizce atılır. Aksi takdirde, expect_background komutu beklemede olduğu gibi expect_before ve expect_after desenlerini kullanır.
Expect_background eylemleri değerlendirilirken, aynı spawn kimliği için arka plan işleme engellenir. Eylem tamamlandığında arka plan işleme engeli kaldırıldı. Arka plan işleme engellendiğinde, aynı spawn kimliğinde bir (önalan) beklemek mümkündür.
Bir wait_background engelini kaldırılırken bir bekletme yürütmek mümkün değildir. Belirli bir spawn kimliği için expect_background, aynı spawn kimliğine sahip yeni bir expect_background bildirerek silinir. Hiçbir desen içermeyen expect_background bildirme, belirtilen spawn kimliğini arka planda desenleri eşleştirme becerisinden kaldırır.
expect_before [expect_args]
aynı argümanları beklediği gibi alır, ancak hemen geri döner. Aynı spawn kimliğine sahip en son expect_before desen aksiyonu çiftleri, aşağıdaki herhangi bir bekletme komutuna örtülü olarak eklenir. Bir desen eşleşirse, bekletme komutunun kendisinde belirtilmiş gibi ele alınır ve ilişkili gövde, bekletme komutunun bağlamında yürütülür. Hem beklemelerin hem de beklemenin eşleşmeleri eşleşebiliyorsa, beklemede olan desen kullanılır.
Hiçbir desen belirtilmemişse, yumurtlama kimliği herhangi bir desen için kontrol edilmez.
Bir -i bayrağı tarafından geçersiz kılınmadığı sürece, begin_before komutları, wait_before komutunun yürütüldüğü anda tanımlanan spawn kimliğine karşılık gelir (desen eşleştiğinde değil).
-info bayrağı, hangi desenlerin eşleşeceğine dair mevcut özellikleri döndürmeyi beklemektedir . Varsayılan olarak, mevcut yumurtlama kimliğiyle ilgili rapor verir. Bu yumurtlama kimliğiyle ilgili bilgi için isteğe bağlı bir spawn kimlik belirtimi verilebilir. Örneğin
expect_before -info -i $ procEn çok bir spawn kimlik belirtimi verilebilir. Bayrak-buluş, sadece dolaylı özelliklerden gelen direkt yumurtlayan hayvanları bastırır.
Bir spawn kimlik belirtimi yerine, "-all" bayrağı, tüm yumurtlama kimlikleri hakkında rapor vermek için "-info" neden olur.
-info bayrağının çıktısı beklemenin tersine argüman olarak yeniden kullanılabilir.
expect_tty [expect_args]
beklemek gibidir ama / dev / tty karakterlerini okur (örn. kullanıcıdan tuş vuruşları). Varsayılan olarak, okuma pişmiş modda gerçekleştirilir. Böylece, satırları görmeyi beklemek için bir dönüş ile bitmelidir. Bu, stty ile değiştirilebilir (aşağıdaki stty komutuna bakın).
expect_user [expect_args]
beklemek gibidir ama stdin'den gelen karakterleri okur (örn. kullanıcıdan tuş vuruşları). Varsayılan olarak, okuma pişmiş modda gerçekleştirilir. Böylece, satırları görmeyi beklemek için bir dönüş ile bitmelidir. Bu, stty ile değiştirilebilir (aşağıdaki stty komutuna bakın).
çatal
yeni bir süreç oluşturur. Yeni süreç mevcut Beklenti sürecinin tam bir kopyasıdır. Başarı durumunda, fork 0'a yeni (çocuk) sürecine geri döner ve alt sürecin süreç kimliğini ana işleme döndürür. Başarısızlık durumunda (sürekli olarak kaynak eksikliğinden dolayı, örneğin, takas alanı, bellek), fork , ana işlem için -1 değerini döndürür ve hiçbir alt işlem oluşturulmaz.
Forked süreçler, tıpkı orijinal süreç gibi, çıkış komutuyla çıkar . Forked işlemlerin günlük dosyalarına yazılmasına izin verilir. İşlemlerin çoğunda hata ayıklamayı veya günlüğe kaydetmeyi devre dışı bırakmazsanız, sonuç kafa karıştırıcı olabilir.
Bazı pty uygulamaları, anlık olarak bile, birçok okuyucu ve yazar tarafından karıştırılabilir. Böylece yumurtlama işlemlerinden önce çatallamak en güvenli yoldur.
etkileşim [string1 body1] ... [stringn [bodyn]]
mevcut işlemin kullanıcıya kontrolünü sağlar, böylece tuş vuruşları mevcut sürece gönderilir ve mevcut işlemin stdout ve stderr'i geri gönderilir.
Dize gövdeli çiftler argüman olarak belirtilebilir, bu durumda ilgili dize girildiğinde gövde yürütülür. (Varsayılan olarak, dize geçerli işleme gönderilmez.) Son gövde eksikse, yorumlayıcı komutu kabul edilir.
Tüm etkileşim ifadesinin argümanlarının birden fazla satır gerektirmesi durumunda, tüm argümanlar, her satırı bir ters eğik çizgi ile sonlandırmaktan kaçınmak için bire "desteklenebilir". Bu durumda, parantezlere rağmen olağan Tcl ikameleri gerçekleşecektir.
Örneğin, aşağıdaki komut çalıştırılan aşağıdaki dize gövdesi çiftleriyle etkileşime girer: ^ Z basıldığında, Bekleme askıya alınır. ( -reset bayrağı terminal modlarını geri yükler.) ^ A düğmesine basıldığında, kullanıcı "siz bir kontrol A yazdınız" ve işlem bir ^ A gönderir. $ Tuşuna basıldığında, kullanıcı tarihi görür. ^ C basıldığında, Çıkışlar bekler. Eğer "foo" girilirse, kullanıcı "bar" görür. ~ Tuşuna basıldığında, Expect yorumlayıcısı etkileşimli olarak çalışır.
CTRLZ \ 032 set {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "yazdığınız bir kontrol-A \ n"; gönder "\ 001"} $ {send_user "Tarih [saat formatı [saat saniye]]."} \ 003 çıkış foo {send_user "bar"} ~~}Dize gövdesi çiftlerinde dizeler, argümanlar olarak listelendikleri sıraya göre eşleştirilir. Kısmen eşleşen dizeler, geri kalanın geleceği beklentisiyle mevcut sürece gönderilmez. Karakterler daha sonra bir eşleşme olmayacak şekilde girilirse, dizenin yalnızca bir kısmı, başka bir eşleşmeye başlama olasılığı olmayan sürece gönderilecektir. Bu nedenle, eşleşmeye çalışan orijinal dizeler sonuçta başarısız olursa, kısmi eşlemelerin alt dizeleri olan dizeler daha sonra eşleşebilir.
Varsayılan olarak, dize eşleşmesi, vahşi kart içermez. (Tersine, beklenen komut varsayılan olarak glob tarzı kalıpları kullanır.) -ex bayrağı, etkileşimli bayrakların bu şekilde eşleşmesiyle eşleşen kalıpları korumak için kullanılabilir. "-" ile başlayan herhangi bir desen bu şekilde korunmalıdır. ("-" ile başlayan tüm dizeler gelecekteki seçenekler için ayrılmıştır.)
-re bayrağı, regexp tarzı bir desen olarak yorumlanacak dizeyi zorlar. Bu durumda, eşleşen alt dizgiler , output_değeri değişkenindeki çıktıları depolamanın beklendiği şekle benzer şekilde, etkileşimli değişkende saklanır . -indices bayrağı benzer şekilde desteklenir.
Desen, dosya sonu üzerinde yürütülen bir eylemi tanıtmaktadır. Ayrı bir eof- pattern de çıkış işaretini takip edebilir, bu durumda çıktı yazılırken eof tespit edilirse eşleştirilir. Varsayılan eof eylemi "geri dönüş" dür , böylece etkileşim herhangi bir EOF'a geri döner.
Desen zaman aşımı , bir zaman aşımı (saniye cinsinden) ve belirli bir süre boyunca hiçbir karakter okunmadığında çalıştırılan eylemi sunar. Zaman aşımı modeli, en son belirtilen işlem için geçerlidir. Varsayılan zaman aşımı yok. "Zaman aşımı" özel değişkeninin ( bekleme komutunun kullandığı) bu zaman aşımı üzerinde hiçbir etkisi yoktur.
Örneğin, aşağıdaki ifade, bir saat boyunca hiçbir şey yazmamış, ancak yine de sık sık sistem mesajlarını alan kullanıcıları otomatik olarak filme almak için kullanılabilir:
etkileşim-giriş $ user_spawn_id zaman aşımı 3600 return -output \ $ spawn_idDesen null anahtar kelimesiyse ve boş değerlere izin verilirse ( remove_nulls komutuyla), tek bir ASCII 0 eşleştiğinde ilgili gövde yürütülür. 0 bayt'ı glob veya regexp kalıpları ile eşleştirmek mümkün değildir.
Bayrağa sahip bir desenin öncelenmesi , değişken etkileşimin (spawn_id) , deseni (veya eof) eşleştiren spawn_id değerine ayarlanmasını sağlar.
Kırılma ve devam etme gibi eylemler, kontrol yapılarının (yani, proc için ) olağan şekilde davranmasına neden olur. Ancak, dönüş nedenleri arayana geri dönerken, inter_return etkileşimin arayana geri dönüşüne neden olmasına neden olur. Örneğin, "proc foo", daha sonra inter_return eylemini yürüten etkileşim olarak adlandırılırsa, proc foo geri dönecektir. (Bu, etkileşimli olarak çeviricinin etkileşimli olarak çağrılması durumunda dönüşün etkileşimin devam etmesine neden olacaksa, inter_return etkileşimin arayana geri dönmesine neden olacaktır.)
Etkileşim sırasında ham mod kullanılır, böylece tüm karakterler mevcut işleme geçirilebilir. Mevcut işlem iş kontrol sinyallerini yakalamazsa, bir durma sinyali gönderilirse duracaktır (varsayılan olarak ^ Z). Yeniden başlatmak için bir devam sinyali gönderin ("-CONT" gibi). SIGSTOP'u gerçekten böyle bir işleme göndermek istiyorsanız (^ Z), önce csh'yi seçip programınızı çalıştırmayı düşünün. Diğer taraftan, bir SIGSTOP'un kendisini Beklemek için göndermek istiyorsanız, önce tercümanı arayın (belki bir çıkış karakteri kullanarak) ve sonra ^ Z'ye basın.
String-body çiftleri, tercümana girmekten ve komutları etkileşimli olarak yürütmekten kaçınmak için kısa yoldan kullanılabilir. Bir string-body çiftinin gövdesi yürütülürken önceki terminal modu kullanılır.
Hız için, eylemler varsayılan olarak ham modda yürütülür. -reset bayrağı, terminali etkileşimin gerçekleştirilmesinden önceki moduna (değişmez, pişirilmiş mod) sıfırlar. Mod değiştirilirken girilen karakterlerin kaybolabileceğini unutmayın (bazı sistemlerde terminal sürücüsünün talihsiz bir özelliği). -reset'i kullanmanın tek nedeni, eyleminizin pişmiş modda çalışmaya bağlı olup olmamasıdır.
-echo bayrağı, aşağıdaki karakterle eşleşen karakterleri, her karakter okunduğunda onları oluşturan işleme geri gönderir. Bu, kullanıcının kısmen yazılan kalıplardan gelen geri bildirimleri görmesi gerektiğinde yararlı olabilir.
Bir desen yankılanıyor ancak sonuçta eşleşmiyorsa, karakterler yumurtlama işlemine gönderilir. Eğer ortaya çıkan süreç onları tekrarlarsa, kullanıcı karakterleri iki kez görecektir. -echo muhtemelen sadece kullanıcının kalıbı tamamlama olasılığının olmadığı durumlarda uygundur. Örneğin, aşağıdaki alıntılar rftp, recursive-ftp betiğinden, kullanıcının geçerli dizini tekrar tekrar almak, koymak veya listelemek için ~ g, ~ p veya ~ l girmesi istenir. Bunlar, normal ftp komutlarından çok uzakta, kullanıcının yazdığı gibi başka bir şeyden sonra yazamayacağı ihtimaline karşın, muhtemelen, sonuçta yine de sonucu görmezden gelirler.
etkileşim {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}-nobuffer bayrağı, aşağıdaki gibi eşleşen karakterleri, karakterleri okurken çıkış işlemine gönderir.
Bu, bir programın desene geri dönmesini sağlamak istediğinizde yararlıdır. Örneğin, bir kullanıcının aradığını izlemek için aşağıdakiler kullanılabilir (Hayes tarzı bir modem). Her defasında "atd" görülür, betik çizginin kalanını günlüğe kaydeder.
proc lognumber {} {interact -nobuffer -re "(. *) \ r" return $ log koyar "[saat biçimi [saat saniye]]: aranan $ interact_out (1, string)"} etkileşim -nobuffer "atd" lognumberEtkileşim sırasında, önceki log_user kullanımı dikkate alınmaz. Özellikle, etkileşim , kullanıcının körü körüne etkileşimde bulunmak istemediği varsayıldığı için, çıkışının kaydedilmesini (standart çıktıya gönderilir) zorlayacaktır.
-o bayrağı, geçerli işlemin çıktısına uygulanacak aşağıdaki anahtar-gövde çiftlerine neden olur. Bu, örneğin telnet oturumu sırasında istenmeyen karakterler gönderen ana bilgisayarlarla çalışırken yararlı olabilir.
Varsayılan olarak, etkileşim , kullanıcının stdin'i yazmasını ve Bekleme sürecinin kendisini okuma stdoutunu beklemesini bekler. -u bayrağı ("kullanıcı" için), kullanıcı için argümanı tarafından isimlendirilen bir süreç olarak (bu, bir yumuşatma kimliği olmalıdır) etkileşimi arar.
Bu, birbiriyle ilişkili olmayan iki işlemin açık bir döngü kullanılmadan birleştirilmesine izin verir. Hata ayıklamaya yardımcı olmak için, Bekleme teşhisi her zaman stderr'e (veya belirli bir günlüğe kaydetme ve hata ayıklama bilgisi için stdout) gider. Aynı sebepten dolayı tercüman komutu, stdin'den etkileşimli olarak okuyacaktır.
Örneğin, aşağıdaki parça bir giriş süreci oluşturur. Ardından kullanıcıyı (gösterilmiyor) çevirir ve sonunda ikisini birleştirir. Tabii ki, herhangi bir işlem giriş için ikame edilebilir. Örneğin bir kabuk, kullanıcının bir hesap ve şifre sağlamadan çalışmasına izin verir.
spawn giriş seti giriş $ spawn_id spawn ipucu modem # kullanıcıya geri çevirme # giriş yapmak için kullanıcı bağlanmak etkileşim -u $ girişÇıktıyı birden çok işleme göndermek için, her çıkış noktası listesini bir çıkış bayrağıyla önbelleğe alın . Bir grup çıkış yumurtlayan ids için girdi, bir giriş bayrağı tarafından oluşturulan bir spawn id listesi tarafından belirlenebilir. (Her ikisi de giriş ve çıkış, all_spawn_id'nin etkileşimde anlamsız olması dışında, bekleme komutundaki -i bayrağıyla aynı biçimde listeleri alabilir.) Aşağıdaki tüm bayraklar ve dizeler (veya desenler), bu girdiye başka bir noktaya kadar uygulanır. giriş bayrağı görünür. Herhangi bir iş çıkışı görünmezse, çıkış "-input $ user_spawn_id -output" anlamına gelir. (Benzer şekilde, -input içermeyen desenlerde.) Bir-giriş belirtilirse, $ user_spawn_id değerini geçersiz kılar. İkinci bir giriş belirtilirse, $ spawn_id değerini geçersiz kılar. Ek giriş bayrakları belirtilebilir.
İki ima edilen giriş işlemi, çıkışlarının $ spawn_id ve $ user_spawn_id (tersine) olarak belirtilmesini varsayılan olarak kabul eder. Çıkış bayrağı olmayan bir giriş bayrağı görünürse, bu süreçteki karakterler atılır.
-i bayrağı, başka bir giriş veya çıkış işareti kullanılmadığında mevcut spawn_id için bir değiştirme sunar. A -i bayrağı bir -o bayrağı anlamına gelir.
Dolaylı yumurtlayan kimlikleri kullanarak etkileşim halindeki süreçleri değiştirmek mümkündür. (Dolaylı yumurtlama iddiası, bekletme komutunun bölümünde açıklanmıştır.) Dolaylı yumurtlayanlar, -i, -u, -input veya -putput bayrakları ile belirtilebilir.
tercüman [arşivler]
Kullanıcının Expect ve Tcl komutları için etkileşimli olarak sorulmasına neden olur. Her komutun sonucu yazdırılır.
Kırılma ve devam etme gibi eylemler, kontrol yapılarının (yani, proc için ) olağan şekilde davranmasına neden olur. Ancak geri dönüş , tercümanın arayana geri dönmesine neden olurken, inter_return tercümanın arayana geri dönmesine neden olur. Örneğin, "proc foo" ifadesi , sonra inter_return eylemini yürüten yorumlayıcı olarak adlandırılırsa, proc foo geri dönecektir. Başka bir komut, yorumcunun yeni komutlar istemeye devam etmesine neden olur.
Varsayılan olarak, istem iki tam sayı içerir. İlk tam sayı, değerlendirme yığınının derinliğini (yani, Tcl_Eval'in kaç kez çağrıldığını) açıklar. İkinci tam sayı, Tcl geçmiş tanımlayıcısıdır. Bilgi istemi, geri dönüş değeri bir sonraki komut istemi olan "komut istemi1" adı verilen bir prosedür tanımlanarak belirlenebilir. Bir ifadede açık tırnak, parantez, parantez veya parantez varsa, satırsonu üzerine ikincil bir istek (varsayılan olarak "+>") verilir. İkincil bilgi istemi "prompt2" adı verilen bir prosedür tanımlanarak ayarlanabilir.
Tercüman sırasında, arayan modu ham modu kullanıyor olsa bile pişirilmiş mod kullanılır.
Stdin kapatılırsa, -onra bayrağı kullanılmadıkça yorumlayıcı dönecektir, bu durumda sonraki argüman çalıştırılacaktır.
log_file [args] [[-a] dosya]
Bir dosya adı sağlanırsa, log_file dosyadaki oturumun bir dökümünü (o noktadan başlayarak) kaydeder. Hiçbir argüman verilmediyse log_file kayıt işlemini durduracaktır. Herhangi bir önceki günlük dosyası kapalı.
Bir dosya adı yerine, -open veya -leaveopen bayrakları kullanılarak bir Tcl dosya tanıtıcısı sağlanabilir. Bu, spawn komutuna benzer. (Daha fazla bilgi için spawn'a bakınız.)
-a bayrağı, log_user komutu tarafından bastırılmış olan oturumun çıkmasını zorlar .
Varsayılan olarak, log_file komutu, bir oturumda oturum açmayı ve birden çok kez açabilmeyi kolaylaştırmak için onları kesmekten ziyade eski dosyalara ekler . Dosyaları kırpmak için -noappend bayrağını kullanın.
-info bayrağı, verilen en son bilgi olmayan argümanların bir tanımını döndürmek için log_file neden olur.
log_user -info | 0 | 1
Varsayılan olarak, gönder / bekle iletişim kutusu stdout'a (ve açıksa bir günlük dosyasına) kaydedilir. Stdout'a giriş, "log_user 0" komutu ile devre dışı bırakılır ve "log_user 1" ile yeniden etkinleştirilir. Günlük dosyasına kaydetme değişmez.
-info bayrağı, log_user'nin verilen en son bilgi içermeyen argümanların bir açıklamasını döndürmesine neden olur.
match_max [-d] [-i spawn_id] [boyut]
beklemede dahili olarak kullanılan arabelleğin (bayt cinsinden) boyutunu tanımlar. Boyut argümanı olmadan, mevcut boyut döndürülür.
-d bayrağı ile varsayılan boyut ayarlanır. (Başlangıç değeri 2000'dir.) -i bayrağı ile, adlandırılmış yumurtlama kimliği için boyut ayarlanır, aksi halde geçerli işlem için ayarlanır.
yer paylaşımı [- # spawn_id] [- # spawn_id] [...] program [args]
Mevcut programın yerine "program args" yürütür, bu da sona erer. Bir çıplak tire argümanı, komut isminin önüne bir giriş kabuğuna benziyor. Tüm spawn_ids, argümanlar olarak adlandırılanlar haricinde kapalıdır. Bunlar adlandırılmış dosya tanıtıcıları üzerinde eşlenir.
Spawn_ids, yeni programın devralınacağı dosya tanımlayıcılarıyla eşleştirilir. Örneğin, aşağıdaki satır satranç çalıştırır ve mevcut işlem tarafından kontrol edilmesini sağlar - örneğin, bir satranç ustası.
kaplama -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id satrançBu, "etkileşim" den daha etkilidir, ancak Bekleme işlemi artık kontrolde olmadığı için programlanmış etkileşim yapma yeteneğini feda eder.
Kontrol terminali verilmediğini unutmayın. Böylelikle, eğer standart girişi çıkarır veya değiştirirseniz, iş kontrolü (kabuklar, giriş, vb) yapan programlar düzgün çalışmayacaktır.
parite [-d] [-i spawn_id] [değer]
Parite, yumurtlanan süreçlerin çıktısından korunmalı mı yoksa soyulmalı mı gerektiğini tanımlar. Değer sıfır ise, parite soyulur, aksi halde soyulmaz. Hiçbir değer argümanı ile mevcut değer döndürülür.
-d bayrağıyla, varsayılan eşlik değeri ayarlanır. (Başlangıç varsayılanı 1'dir, yani eşlik parlatılmamıştır.) -i bayrağıyla, parlama değeri adlandırılmış spawn kimliği için ayarlanır, aksi halde geçerli işlem için ayarlanır.
remove_nulls [-d] [-i spawn_id] [değer]
pattern eşleştirilmeden veya expect_out veya interact_out değişkeninde saklanmadan önce boş değerlerin çıkarılan veya çıkarılan işlemlerin çıktısından kaldırılıp kaldırılmadığını tanımlar. Değer 1 ise, boş değerler kaldırılır. Değer 0 ise, boş değerler kaldırılmaz. Hiçbir değer argümanı ile mevcut değer döndürülür.
-d bayrağıyla, varsayılan değer ayarlanır. (İlk varsayılan 1'dir, yani, sıfırlar kaldırılır.) -i bayrağı ile, belirtilen spawn kimliği için değer ayarlanır, aksi halde geçerli işlem için ayarlanır.
Boş değerlerin kaldırılıp kaldırılmayacağı, Bekleme , günlüğe ve stdout'a boş bayt kaydeder.
[-flags] dizesini gönder
Geçerli işleme dize gönderir. Örneğin, komut
Helloworld karakterlerini o anki sürece gönderir. (Tcl, rasgele karmaşık dizeler oluşturabilen printf benzeri bir komutu ( format olarak adlandırılır) içerir.)
Karakterler, satır tamponlu girdili programlar bir dönüş karakteri gönderilinceye kadar karakterleri okumamasına rağmen hemen gönderilir. Bir dönüş karakteri "\ r" olarak gösterilir.
Bayrak, bir sonraki argümanı bayrak yerine dize olarak yorumlanacak şekilde zorlar. Herhangi bir dize, aslında bir bayrağı gibi görüp görmediği gibi, "-" ile öncelenebilir. Bu, yanlışlıkla dizgeye benzemeyen değişkenler tarafından tetiklenmeden değişken dizileri belirtmek için güvenilir bir mekanizma sağlar. ("-" ile başlayan tüm dizeler gelecekteki seçenekler için ayrılmıştır.)
-i bayrağı dizenin adlandırılmış spawn_id öğesine gönderileceğini bildirir. Spawn_id, user_spawn_id ise ve terminal ham moddaysa, dizgedeki satırsonları, terminalin pişmiş modda olduğu gibi görünecek şekilde geri-yeni satır dizilerine çevrilir. -raw bayrağı bu çeviriyi devre dışı bırakır.
-null bayrağı boş karakterler (0 bayt) gönderir. Varsayılan olarak bir null gönderilir. Tam sayı, kaç tane boş gönderileceğini göstermek için -null'u takip edebilir.
Kırılma bayrağı bir kırılma durumu oluşturur. Bu sadece, spawn kimliği "spawn -open" ile açılan bir tty cihazına başvurursa anlamlıdır. Bahşiş gibi bir işlem oluşturduysanız, bir mola oluşturmak için ipucunun sözleşmesini kullanmalısınız.
-s bayrağı çıkışa "yavaş yavaş" gönderilir, böylece bir bilgisayarın aynı arabelleği aşmayacak bir insan için tasarlanan bir giriş arabelleğinden çıktığı yaygın durumdan kaçınır. Bu çıktı, iki öğe listesi alan "send_slow" değişkeninin değeriyle kontrol edilir. İlk öğe, atomik olarak göndermek için bayt sayısını açıklayan bir tamsayıdır. İkinci eleman, atomik gönderilerin ayrıştırılması gereken saniye sayısını açıklayan gerçek bir sayıdır. Örneğin, "send_slow {10 .001}" ifadesi "gönder -s" öğesini, gönderilen her 10 karakter arasında 1 milisaniye olan dizeleri göndermeye zorlar.
-h bayrağı, çıktısını aslında (aslında) bir insan gibi yazarak gönderir. İnsan benzeri gecikmeler karakterler arasında görünür. (Algoritma, bu özel uygulamaya uyacak modifikasyonlarla birlikte bir Weibull dağılımına dayanır.) Bu çıktı, beş element listesi alan "send_human" değişkeninin değeriyle kontrol edilir. İlk iki öğe, saniyede karakterlerin ortalama interarrival süresidir. İlk varsayılan olarak kullanılır. İkincisi, bu tür geçişlerde zaman zaman meydana gelen ince durakları simüle etmek için kelime sonlarında kullanılır. Üçüncü parametre, .1'in oldukça değişken olduğu, 1'in makul derecede değişken olduğu ve 10'un değişmez olduğu bir değişkenlik ölçüsüdür. Aşırılıklar 0'dan sonsuza kadardır. Son iki parametre sırasıyla minimum ve maksimum interarrival süredir. Minimum ve maksimum son olarak kullanılır ve son kez "klip". Nihai ortalama, minimum ve maksimum klip yeterli değerler olduğunda, verilen ortalamadan oldukça farklı olabilir.
Örnek olarak, aşağıdaki komut hızlı ve tutarlı bir yazım uzmanı öykünür:
set_human {.1 .3 1 .05 2} 'yi set -h "Ben açım. Öğle yemeği yapalım."Aşağıdakiler bir kalıntıdan sonra daha uygun olabilir:
set_human {.4 .4 .2 .5 100} 'i gönder - h "Goodd party lash night!"Hata düzeltme durumlarını, bir gönderme argümanında hatalar ve düzeltmeler yerleştirerek kendiniz ayarlayabilmenize rağmen, hataların taklit edilmediğini unutmayın.
Null karakterleri göndermek, mola göndermek, yavaş çıkışı zorlamak ve insan tarzı çıktı için bayraklar birbirini dışlamaktadır. Sadece en son belirtileni kullanılacaktır. Ayrıca, boş karakterler veya kesmeler göndermek için bayraklarla dize argümanı belirtilemez.
Bir bekleyişe ilk gönderimden önce beklemek iyi bir fikirdir. Bekleme işlemi gerçekleşirken , işlemin başlamasını bekleyecektir. Özellikle, işlem başlatılmadan önce ilk gönderim tamamlandığında, verilerinizin dikkate alınma riskini üstlenirsiniz. Etkileşimli programların başlangıç isteminde bulunmadığı durumlarda, aşağıdaki gibi bir gecikme ile gönderilmeden önce gelebilirsiniz:
# Korsanların nasıl kırılacağına dair ipuçları vermekten kaçınmak için # bu sistem harici bir şifre istemez. # Yürütme işlemi için spa 5 saniye beklemek telnet very.secure.gov uyku 5 şifre göndermekexp_send , gönderilecek bir takma addır . Expektk veya Tk ortamında Expect başka bir varyantı kullanıyorsanız, gönderme tamamen farklı bir amaç için Tk tarafından tanımlanır. exp_send , ortamlar arasındaki uyumluluk için sağlanır. Diğer diğer Gönder komutları için benzer takma adlar sağlanır.
send_error [-flags] dizesi
gönderim gibidir , ancak çıktı mevcut işlemden ziyade stderr'e gönderilir.
send_log [-] dizgi
dize sadece günlük dosyasına gönderilirse (örneğin, log_file dosyasına bakın.), herhangi bir günlük dosyası açık değilse argümanlar dikkate alınmaz.
send_tty [-flags] dizesi
gönderim gibidir , ancak çıktı mevcut işlemden ziyade / dev / tty'ye gönderilir.
send_user [-flags] dizesi
gönderim gibidir , ancak çıktı mevcut süreçten ziyade stdout'a gönderilir.
uyku saniye
komut dosyası verilen saniye sayısı için uyku neden olur. Saniye bir ondalık sayı olabilir. Expectk kullanırken Interrupt (ve Expektk kullanıyorsanız Tk olayları) işlenir.
spawn [args] programı [args]
"program args" çalışan yeni bir süreç oluşturur. Stdin, stdout ve stderr, Expect ile bağlantılıdır, böylece diğer Expect komutları tarafından okunup yazılabilirler. Bağlantı, kapatılarak veya işlemin kendisi dosya tanımlayıcılarının herhangi birini kapatırsa kesilir.
Bir işlem spawn ile başlatıldığında, spawn_id değişkeni bu sürece atıfta bulunan bir tanımlayıcıya ayarlanır. Spawn_id tarafından açıklanan süreç "mevcut süreç " olarak kabul edilir. spawn_id , iş kontrolü sağlamada okunabilir veya yazılabilir.
user_spawn_id , kullanıcıya atıfta bulunan bir tanımlayıcı içeren global bir değişkendir. Örneğin, spawn_id bu değere ayarlandığında, wait_user gibi davranmayı bekleyebilirsiniz .
.I error_spawn_id , standart hatayı ifade eden bir tanımlayıcı içeren global bir değişkendir. Örneğin, spawn_id bu değere ayarlandığında, send_error gibi davranır.
tty_spawn_id , / dev / tty'ye atıfta bulunan bir tanımlayıcı içeren global bir değişkendir. / Dev / tty yoksa (örneğin bir cron, at veya toplu betikte), tty_spawn_id tanımlı değil. Bu aşağıdaki gibi test edilebilir:
{[info var tty_spawn_id]} {# / dev / tty var}} {# / dev / tty mevcut değil # büyük olasılıkla cron, batch veya script}spawn UNIX işlem kimliğini döndürür. Hiçbir işlem üretilmezse , 0 döndürülür. Spawn_out (slave, name) değişkeni pty slave cihazının ismine ayarlanmıştır.
Varsayılan olarak, spawn komut adını ve argümanları yankılamaktadır. -noecho bayrağı bunu doğurur .
Konsoldaki bayrak, konsol çıktısının ortaya çıkan işleme yeniden yönlendirilmesini sağlar. Bu, tüm sistemlerde desteklenmez.
Dahili olarak, spawn , kullanıcının tty'si ile aynı şekilde başlatılan bir pty kullanır. Bu, tüm ayarların "aklı" olduğu (stty (1) 'e göre) daha da başlatılır. Stty_init değişkeni tanımlanmışsa, stty argümanları tarzında başka konfigürasyon olarak yorumlanır. Örneğin, "stty_init raw" ifadesi, daha fazla ortaya çıkan işlemcinin terminallerinin ham modda başlatılmasına neden olur. -nottycopy kullanıcının tty dayalı başlatmayı atlar. -nottyinit "aklı başında" ilklendirmeyi atlar.
Normalde, doğurmak için çok az zaman alır. Eğer belirgin bir zaman alan yumurtlama olduğunu fark ederseniz, muhtemelen sıkışmış olan ptys ile karşılaşıyordur. Hatalı süreçlerle karışıklıklardan kaçınmak için ptys üzerinde birkaç test çalıştırılır. (Bunlar, sıkıştırılmış pty başına 10 saniye sürmektedir.) Bekleme, -d seçeneğiyle, Beklemede tek durumlarla çok sayıda ptys karşılaşırsa gösterilir. Bu ptys'in bağlı olduğu işlemleri öldüremezseniz, tek başvurunuz yeniden başlatmak olabilir.
Eğer program (2) başarısız olduğu için program başarılı bir şekilde üretilemezse (örneğin, program mevcut değilse), bir sonraki etkileşime göre bir hata mesajı gönderilir veya programın çalıştırdığı ve hata mesajını çıktı olarak üretmiş gibi bir hata mesajı gönderilir. Bu davranış, yumurtlamanın uygulanmasının doğal bir sonucudur. Dahili olarak, yumurtlama işleminden sonra, yumurtlama işleminin , spawn_id aracılığıyla iletişimin dışında orijinal Bekleme işlemiyle iletişim kurmanın bir yolu yoktur.
-open bayrağı bir sonraki argümanın bir Tcl dosya tanıtıcısı olarak yorumlanmasına neden olur (yani, açık olarak döndürülür). Sonra, yumurtlama kimliği, bir yumurtlama işlemi gibi kullanılır . (Dosya tanımlayıcısı artık kullanılmamalıdır.) Bu, ham cihazları, dosyaları ve pipeline'ları bir pty kullanmadan, doğal süreçler olarak işlemenize izin verir. İlişkilendirilmiş bir işlem olmadığını göstermek için 0 döndürülür. Oluşturulan işlemle bağlantı kapatıldığında, Tcl dosya tanıtıcısı da öyle. -leaveopen bayrağı -openine benzer olup, -leaveopen , spawn kimliği kapatıldıktan sonra bile dosya tanımlayıcısının açık bırakılmasına neden olur.
-pty bayrağı açılacak bir pty neden olur, ancak hiçbir işlem ortaya çıkar. İlişkilendirilmiş bir işlem olmadığını göstermek için 0 döndürülür. Spawn_id her zamanki gibi ayarlanır.
Spawn_out (slave, fd) değişkeni, pty slave'e karşılık gelen bir dosya tanıtıcısına ayarlanır. "Close -slave" kullanılarak kapatılabilir.
-ignor bayrağı, ortaya çıkan işlemde göz ardı edilecek bir sinyale işaret eder. Aksi halde, sinyaller varsayılan davranışı alır. Her sinyalin ayrı bir bayrak gerektirmesi dışında, sinyaller tuzak komutunda olduğu gibi adlandırılır.
strace seviyesi
İfşa edilmeden önce aşağıdaki ifadelerin basılmasına neden olur. (Tcl'nin trace komutu değişkenlerini izler.) Seviyesi , çağrı yığınının ne kadar süre sonra izleyeceğini gösterir. Örneğin, aşağıdaki komut, ilk 4 çağrı düzeyini izlerken Bekle'yi çalıştırır, ancak bunun altında değildir.
-info bayrağı, verilen en son bilgi içermeyen argümanların bir tanımını döndürmek için strace neden olur.
stty args
Harici stty komutuna benzer şekilde terminal modlarını değiştirir.
Varsayılan olarak, kontrol terminaline erişilir. Diğer terminallere "Komutun sonucu olarak durumu geri döndürme isteği" eklenerek erişilebilir. Herhangi bir durum istendiğinde ve kontrol terminaline erişilirse, ham ve eko özniteliklerinin önceki durumu daha sonra olabilecek bir biçimde iade edilir. komut tarafından kullanılır.
Örneğin, ham veya eklenmiş argümanlar terminali ham moda geçirir . Tartışılan veya pişirilen argümanlar terminali pişmiş moda sokar. Argümanlar yankılanır ve -ekrarı sırasıyla eko ve noecho moduna sokar.
Aşağıdaki örnek, yankılamayı geçici olarak nasıl devre dışı bırakacağınızı gösterir. Bu, parolaları içine gömmemek için otomatik olarak kullanılan komut dosyalarında kullanılabilir. (Aşağıdaki EXPECT HINTS altında daha fazla tartışmaya bakın.)
stty -echo send_user "Şifre:" bekliyor_user -re "(. *) \ n" set password $ bekliyor_out (1, string) stty echo sistem args
tıpkı bir terminalden komut olarak yazıldığı gibi, giriş olarak sh (1) 'e args verir. Kabuk bitene kadar bekleyiniz . Sh'den geri dönüş durumu, exec'nın dönüş durumunu ele aldığı şekilde işlenir.
Stdin ve stdout'u betiğe yönlendiren exec seçeneğinin tersine, sistem hiçbir yönlendirme gerçekleştirmez (dizenin kendisi tarafından belirtilenin dışında). Bu nedenle, doğrudan / dev / tty ile konuşması gereken programları kullanmak mümkündür. Aynı nedenden ötürü, sistem sonuçları kayıtlara kaydedilmez.
zaman damgası [args]
bir zaman damgası döndürür. Hiçbir argüman olmadan, çağın başlamasından bu yana geçen saniye sayısı.
Biçim bayrağı, iade edilen bir dizgiyi, ancak strftime için POSIX kurallarına göre yapılan değiştirmelerle sunar. Örneğin,% a, kısaltılmış bir hafta içi adıyla (örn. Sat) değiştirilir. Diğerleri:
% kısaltılmış bir hafta içi adı%% tam hafta içi adı% b kısaltılmış ay adı% B tam ay adı% c tarih-saatte olduğu gibi: Çar Eki 6 11:45:56 1993% d gün (% 01-31 H saat) (00-23)% I saat (01-12)% j gün (001-366)% m ay (01-12)% M dakika (00-59)% p ya da pm% S saniye (00-61) % u gün (1-7, Pazartesi haftanın ilk günü)% U haftası (00-53, ilk Pazar haftanın ilk günüdür)% V haftası (01-53, ISO 8601 stili)% w gün (0- 6)% W hafta (00-53, ilk Pazartesi haftanın ilk günüdür)% x tarih-saat değeri: Çar 6 Eki 1993% X zamanı: 23:59:59% y yıl (00-99) % Y yılındaki:% 1993 Z zaman dilimi (veya belirlenemeyen hiçbir şey yok) %% bir yüzde işaretiDiğer% özellikler tanımsızdır. Diğer karakterler el değmeden geçirilecektir. Sadece C yerel ayarları desteklenir.
-Sorunlar bayrağının biçimlendirilecek bir kaynak olarak kullanılmasından bu yana birkaç saniye sonra ortaya çıkar. Aksi halde, geçerli zaman kullanılır.
-gmt bayrağı, GMT saat dilimini kullanmak için zaman damgası çıkışını zorlar. Bayraksız yerel saat dilimi kullanılır.
tuzak [[komut] sinyalleri]
Verilen komutların , verilen sinyallerden herhangi birinin gelmesi üzerine yürütülmesine neden olur. Komut, global kapsamda yürütülür. Komut yoksa, sinyal eylemi döndürülür. Komut SIG_IGN dizesi ise, sinyaller göz ardı edilir. Komut SIG_DFL dizesi ise, sinyaller sistem varsayılanına neden olur. Sinyaller ya tek bir sinyal ya da bir sinyal listesidir. Sinyaller, sinyal başına (3) sayısal veya sembolik olarak belirtilebilir. "SIG" öneki ihmal edilebilir.
Hiçbir argüman olmadan (veya argüman -sayı), trap şu anda çalıştırılan tuzak komutunun sinyal numarasını döndürür.
-kod bayrağı, komutun başlangıçta çalıştırılmaya başladığı zaman Tcl'nin ne zaman geri döneceğini öğrenmek için komutun dönüş kodunu kullanır.
-interp bayrağı, komutun, tuzağın bildirilmesinden ziyade, komutun çalışmaya başladığı anda etkin olarak değerlendirilmesini sağlar.
-name bayrağı, trap komutunun yürütülmekte olan tuzak komutunun sinyal adını döndürmesine neden olur.
-max bayrağı, tuzak komutunun ayarlanabilecek en büyük sinyal numarasını döndürmesine neden olur.
Örneğin, "trap {send_user" Ouch! "} SIGINT" komutu "Ouch!" Yazdıracaktır. Kullanıcı her zaman ^ C'ye basar.
Varsayılan olarak, SIGINT (genellikle ^ C'ye basılarak üretilebilir) ve SIGTERM nedeninin çıkmasını bekler. Bu, Bekleme başladığında varsayılan olarak oluşturulan aşağıdaki tuzağa bağlıdır.
kapama çıkışı {SIGINT SIGTERM}Hata ayıklayıcısını başlatmak için -D işaretini kullanırsanız, etkileşimli hata ayıklayıcısını başlatmak için SIGINT yeniden tanımlanır. Bunun nedeni aşağıdaki tuzaktır:
tuzak {exp_debug 1} SIGINTHata ayıklayıcı tuzağı EXPECT_DEBUG_INIT ortam değişkeni yeni bir tuzak komutuna ayarlanarak değiştirilebilir.
Elbette, her ikisini de sadece komut dosyasına komut komutları ekleyerek geçersiz kılabilirsiniz. Özellikle, kendi "trap exit SIGINT" iniz varsa, bu hata ayıklayıcı tuzağını geçersiz kılar. Bu, kullanıcıların hata ayıklayıcıya gitmesini önlemek istiyorsanız kullanışlıdır.
SIGINT üzerinde kendi tuzağınızı tanımlamak, ancak çalışırken hata ayıklayıcıyı yakalamak istiyorsanız, aşağıdakileri kullanın:
eğer {! [exp_debug]} {trap mistuff SIGINT}Alternatif olarak, başka bir sinyali kullanarak hata ayıklayıcıyı yakalayabilirsiniz.
trap , SIGALRM için eylemi geçersiz kılmanıza izin vermez, çünkü bu dahili olarak Beklenecek şekilde kullanılır. Bağlantı kesme komutu SIGALRM'i SIG_IGN olarak ayarlar (yoksay). Bunu, sonraki spawn komutları sırasında devre dışı bıraktığınız sürece yeniden etkinleştirebilirsiniz.
Daha fazla bilgi için sinyala (3) bakınız.
bekle [args]
yumurtlanan bir süreç (ya da hiçbiri adlandırılmamışsa geçerli işlem ) sona erene kadar ertelenir.
bekle normalde dört tam sayı listesi döndürür. İlk tam sayı, beklenen sürecin pididir. İkinci tam sayı, karşılık gelen yumurtlama kimliğidir. Bir işletim sistemi hatası oluştuğunda üçüncü tamsayı -1, aksi takdirde 0'dır. Üçüncü tam sayı 0 ise, dördüncü tam sayı, oluşturulan işlem tarafından döndürülen durumdur. Üçüncü tam sayı -1 ise, dördüncü tam sayı işletim sistemi tarafından ayarlanan errno değeridir. Genel değişken errorCode da ayarlanır.
Ek öğeler bekleme değerinin sonunda beklemeden görünebilir. İsteğe bağlı bir beşinci öğe, bir bilgi sınıfını tanımlar. Şu anda, bu eleman için mümkün olan tek değer CHILDKILLED'dir; bu durumda sonraki iki değer C stili sinyal adı ve kısa bir metinsel açıklamadır.
-i bayrağı, adı belirtilen spawn_id ( işlem kimliği DEĞİL) ile ilgili olarak beklemesini bildirir. Bir SIGCHLD işleyicisinin içinde, spawn id -1 kullanarak herhangi bir yumurtlama sürecini beklemek mümkündür.
-Karşı bayrağı, beklemenin başarılı bir bekleyiş göstergesiyle hemen geri dönmesine neden olur. Süreç (daha sonra) çıktığı zaman, açık bir beklemeye gerek kalmadan otomatik olarak kaybolacaktır.
Bekleme komutu ayrıca "-i -1" argümanlarını kullanarak çatallı bir işlem için beklemede kullanılabilir. Yumurtlanan süreçlerle kullanımından farklı olarak, bu komut her zaman çalıştırılabilir. Hangi işlemin yapıldığı konusunda kontrol yoktur. Ancak, işlem değeri için dönüş değeri kontrol edilebilir.
KÜTÜPHANELER
Expect betikleri için iki yerleşik kütüphaneyi otomatik olarak bilir. Bunlar exp_library ve exp_exec_library değişkenlerinde isimlendirilen dizinler tarafından tanımlanır. Her ikisi de diğer komut dosyaları tarafından kullanılabilecek yardımcı dosyalar içerecek şekilde tasarlanmıştır.
exp_library, mimariden bağımsız dosyaları içerir. exp_exec_library, mimariye bağlı dosyaları içerir. Sisteminize bağlı olarak, her iki dizin de tamamen boş olabilir. $ Exp_exec_library / cat-buffers dosyasının varlığı, varsayılan olarak / bin / cat tamponlarınızın bulunup bulunmadığını açıklar.
OLDUKÇA-BASKI
Güzel yazdırma Expect betikleri için bir vgrind tanımı mevcuttur. Expect dağıtımıyla sağlanan vgrind tanımının doğru şekilde yüklendiğini varsayarak bunu aşağıdaki gibi kullanabilirsiniz:
vgrind - gizli dosyaÖRNEKLER
Birçok insan , her şeyin bir araya getirileceği, insanın sayfalarının anlattığı gibi görünmez. Expect dağıtımının örnek dizinindeki örnekleri okumanızı ve denemenizi öneririz. Bazıları gerçek programlar. Diğerleri sadece belirli tekniklerin açıklamasını yapıyorlar ve elbette bir çift sadece hızlı birer korsanlık. INSTALL dosyasının bu programlara hızlı bir genel bakış vardır.
Beklenti kağıtları (bkz. SEE ALSO) da yararlıdır. Bazı makaleler Expect'in önceki sürümlerine karşılık gelen sözdizimini kullanırken, eşlik eden gerekçeler hala geçerli ve bu adam sayfasından çok daha fazla ayrıntıya giriyor.
YETERSİZLİKLER
Uzantılar Expect'in komut adları ile çarpışabilir. Örneğin, gönderme Tk tarafından tamamen farklı bir amaç için tanımlanır. Bu nedenle, Expect komutlarının çoğu "exp_XXXX" olarak da mevcuttur. "Exp", "inter", "spawn" ve "timeout" ile başlayan komutlar ve değişkenler takma adlara sahip değildir. Ortamlar arasında bu uyumluluğa ihtiyacınız varsa, genişletilmiş komut adlarını kullanın.
Beklemek , kapsamlı bir liberal bakış açısı alır. Özellikle, Expect programına özgü komutlar tarafından okunan değişkenler, ilk önce yerel kapsamdan ve bulunmazsa, küresel kapsamda aranacaktır. Örneğin, bu, beklediğiniz kullanımları yazdığınız her işlemde "global zaman aşımı" yerleştirme ihtiyacını ortadan kaldırır. Öte yandan, yazılan değişkenler her zaman yerel kapsamdadır ("global" bir komut verilmedikçe). Bunun neden olduğu en yaygın problem, bir prosedürde yumurtlamanın gerçekleştirilmesidir. Prosedürün dışında, spawn_id artık mevcut değil, bu yüzden, bu işlemin kapsamı, kapsam belirleme nedeniyle artık erişilebilir değil. Böyle bir prosedüre "global spawn_id" ekleyin.
Çoklu paylaşım yeteneğini etkinleştiremezseniz (yani, sisteminiz ne (BSD *. *), Yoklamada (SVR> 2) ne de eşdeğer bir değeri desteklemezse, Expect yalnızca bir seferde tek bir işlemi kontrol edebilir. Bu durumda, spawn_id değerini ayarlamaya çalışmayın , ne de ortaya çıkan bir süreç çalışırken exec yoluyla işlemleri yürütmelisiniz. Ayrıca, aynı anda birden fazla işlemden (kullanıcı olarak bir tane dahil) bekleyemezsiniz .
Terminal parametreleri komut dosyaları üzerinde büyük bir etkiye sahip olabilir. Örneğin, yankılanma aramak için bir senaryo yazılırsa, yankı koparsa yanıltıcı olur. Bu sebeple, Beklenmedik güçler varsayımsal olarak terminal parametrelerini zorlar. Ne yazık ki, bu durum diğer programlar için rahatsız edici şeyler yapabilir. Örnek olarak, emacs kabuğu "olağan" eşleştirmeleri değiştirmek ister: satırsonları satırbaşı-dönüş satırsonları yerine satırsonlarına eşleştirilir ve yankılama devre dışı bırakılır. Bu, giriş satırını düzenlemek için emacs kullanmasına izin verir. Ne yazık ki, Expect bunu tahmin edemez.
Expect'in, varsayılan terminal parametreleri ayarını geçersiz kılmalarını talep edebilirsiniz, ancak bu tür ortamlar için komut yazarken çok dikkatli olmalısınız. Emac durumunda, yankı yapma ve bitiş çizgileri eşleştirmeleri gibi şeylere bağlı kalmayın.
Tek bir listeye ( beklenen varyasyonlar ve etkileşim ) ait argümanları kabul eden komutlar, listenin aslında bir argüman mı yoksa bir çok mu olduğuna karar vermek için bir sezgisel kullanır. Sezgisel liste, yalnızca liste aslında aralarında boşluk olmayan karakterler bulunan birden çok gömülü \ n içeren tek bir argümanı temsil ettiğinde başarısız olabilir. Bu yeterli derecede olanaksız gibi görünüyor, ancak argüman "-nobrace" tek bir argümanı tek bir argüman olarak ele almak için zorlamak için kullanılabilir. Bu, makine tarafından üretilen Expect koduyla kullanılabilir. Benzer şekilde, -brace, tek bir argümanı birden fazla desen / eylem olarak ele almak için zorlar.
BÖCEK
Program "seks" (ya "Akıllı EXEC" veya "Gönder-Şüpheli") için isim vermek gerçekten cazip oldu, ama iyi anlamda (ya da belki de sadece Puritanizm) galip geldi.
Bazı sistemlerde, bir kabuk oluşturulduğunda, tty'ye erişememekten şikayet eder, ancak yine de çalışır. Bu, sisteminizin Expect'in bilmediği tty'yi kazanma mekanizmasına sahip olduğu anlamına gelir. Lütfen ne olduğunu öğren ve bu bilgiyi bana geri gönder.
Ultrix 4.1 (en azından buradaki en yeni sürümler), 1000000'ün üzerindeki zaman aşımlarının 0'a eşdeğer olduğunu düşünmektedir.
Dijital UNIX 4.0A (ve muhtemelen diğer versiyonlar), bir SIGCHLD işleyicisini tanımladığınızda ptys'i ayırmayı reddeder. Daha fazla bilgi için onay sayfasına bakınız.
IRIX 6.0, pty izinlerini doğru şekilde işlemez; bu nedenle, Bekleme, daha önce başka biri tarafından kullanılan bir pty ayırmaya çalışırsa başarısız olur. IRIX 6.1'e yükseltin.
TERM ayarlanmadıysa Telnet (yalnızca SunOS 4.1.2 altında doğrulanır) askıda kalır. Bu, TERM tanımlamayan, cgi komutları altında ve cgi komut dosyalarında bir sorundur. Böylece, açıkça belirtmeniz gerekir - hangi türden genellikle ilgisizdir. Sadece bir şeye ayarlanmış olmalı! Aşağıdakiler büyük olasılıkla çoğu vaka için yeterlidir.
env (TERM) vt100 değerini ayarlaİpucu (sadece BSDI BSD / OS 3.1 i386 altında doğrulanır) SHELL ve HOME ayarlanmamışsa kilitlenir. Bu ortam değişkenlerini tanımlamayan cgi , cgi betikleri altında bir sorundur. Böylece, onları açıkça belirtmelisiniz - hangi türden genellikle ilgisizdir. Sadece bir şeye ayarlanmış olmalı! Aşağıdakiler büyük olasılıkla çoğu vaka için yeterlidir.
set env (SHELL) / bin / sh kümesi env (HOME) / usr / yerel / binPtys'in bazı uygulamaları, işlemin dosya tanımlayıcısını kapatmasından sonra, çekirdeğin 10 ila 15 saniye sonra (gerçek sayı uygulamaya bağlı) herhangi bir okunmamış çıkışı atması için tasarlanır. Böylece programları gibi bekle
yumurtlama tarihi uykusu 20 beklemekbaşaramayacak. Bundan kaçınmak için, etkileşimli olmayan programları spawn yerine exec ile çağırın. Bu tür durumlar düşünülebilirken, pratikte, gerçekten etkileşimli bir programın nihai çıktısının bu davranış nedeniyle kaybedileceği bir durumla karşılaşmadım.
Öte yandan, Cray UNICOS ptys, dosya tanımlayıcısını kapattıktan hemen sonra okunmamış çıktıları atıyor. Bunu Cray'e bildirdim ve bir çözüm üzerinde çalışıyorlar.
Bazen, bir ara yüzün UART ayarlarını değiştirdiğinde veya başlatma / durdurma bitlerini arayarak baud hızlarını eşleştirmesi gibi, bir komut istemi ve yanıt arasında bir gecikme gerekir. Genellikle, tüm bu ihtiyaç bir iki ya da iki kez uyumaktır. Daha sağlam bir teknik, donanım giriş almaya hazır olana kadar tekrar denemektir. Aşağıdaki örnek, her iki stratejiyi de kullanır:
"hız 9600 \ r" gönder; uyku 1 bekliyoruz {timeout {send "\ r"; exp_continue} $ istemi}trap -code, Tcl'nin etkinlik döngüsünde yer alan ve uyku gibi herhangi bir komutla çalışmaz. Sorun, olay döngüsünde Tcl'nin, async olay işleyicilerinden gelen dönüş kodlarını kaldırmasıdır. Bir geçici çözüm, tuzak kodunda bir bayrak belirlemektir. Ardından, komutun hemen ardından bayrağı kontrol edin (örn., Uyku).
Expect_background komutu, bağımsız değişkenleri göz ardı eder ve genel olarak zaman aşımı kavramı içermez.
& # 34; EXPECT HINTS & # 34;
Sezgisel olmayan sezgiler olabilir birkaç şey vardır. Bu bölüm, bazı şeyleri bir kaç öneriyle ele almaya çalışmaktadır.
Ortak bir bekleyiş sorunu, kabuk komutlarının nasıl tanımlanacağıdır. Bunlar farklı insanlar ve farklı kabuklar tarafından farklı şekilde özelleştirildiklerinden, istemsiz olarak rlogin otomatikleştirilmesi zor olabilir. Makul bir sözleşme, kullanıcıların EXPECT_PROMPT ortam değişkenindeki istemlerini (özellikle de sonunu) açıklayan düzenli bir ifadeyi saklamasını sağlamaktır. Aşağıdaki gibi kod kullanılabilir. EXPECT_PROMPT mevcut değilse, kodun hala doğru şekilde çalışması için iyi bir şansı vardır.
komut istemi "(% | # | \\ $) $"; # varsayılan komut istemi {set prompt $ env (EXPECT_PROMPT)} bekleniyorGörmeyi umduğunuz her şeyi içeren beklenti kalıpları yazmanızı tavsiye ederim. Bu, tüm şeyi görmeden önce bir soruya cevap verme olasılığını ortadan kaldırır. Ek olarak, soruları tamamen görmeden önce cevaplayabilseniz de, erken cevap verirseniz, cevabınız sorunun ortasında yinelenebilir. Diğer bir deyişle, ortaya çıkan diyalog doğru olacaktır ama şifreli görünecektir.
Çoğu bilgi, sonunda bir boşluk karakteri içerir. Örneğin, ftp'den gelen komut 'f', 't', 'p', '>' ve 'dir. Bu istemi eşleştirmek için, bu karakterlerin her birini hesaba katmanız gerekir. Boşluğu dahil etmemek yaygın bir hatadır. Boşluğu açıkça koyun.
Eğer X * formunun bir desenini kullanırsanız, * X'in sonundan alınan tüm çıktıya en son alınan şeyle eşleşecektir. Bu sezgisel gibi geliyor ama biraz kafa karıştırıcı olabilir çünkü "alınan son şey" ifadesi, bilgisayarın hızına ve hem çekirdek hem de aygıt sürücüsü tarafından G / Ç işlemine bağlı olarak değişebilir.
Özellikle, insanlar gerçekte çoğu program bir seferde bir satır çıkış ürettiğinde, devasa parçalara (atomik olarak) ulaşan program çıktılarını görmeye eğilimlidir. Durumun böyle olduğu varsayıldığında, önceki paragrafın paternindeki *, daha fazla olduğu görünse bile sadece mevcut satırın sonuyla eşleşebilir, çünkü maç sırasında alınan tüm çıktılar çıktı.
Beklentiniz , kalıbınız özel olarak hesaba katılmadıkça daha fazla çıktı elde etmenin bir yolu yoktur.
Hatta çizgi yönelimli arabelleklere bağlı olmayan. Programların sadece yaptıkları arabellek türüyle ilgili nadiren vaat etmeleri değil, sistem hazımsızlığı da çıktı çizgilerini kesebilir ve böylece çizgiler rastgele yerlerde kırılır. Böylece, desen yazarken bir komut isteminin son birkaç karakterini ifade ederseniz, bunu yapmak akıllıca olacaktır.
Bir programın son çıktısında bir desen bekliyorsanız ve program bunun yerine başka bir şey yayıyorsa, bunu zaman aşımı anahtar kelimesiyle algılayamayacaksınız. Bunun nedeni beklemenin zaman aşımı olmayacağıdır - bunun yerine bir gösterge olacaktır. Bunun yerine kullanın. Daha da iyisi, ikisini de kullanın. Böylelikle bu çizgi etrafta dolanırsa, hattın kendisini düzenlemek zorunda kalmazsınız.
Yeni hatlar genellikle terminal sürücüsü tarafından çıktığında satır başı, satır besleme dizilerine dönüştürülür. Bu nedenle, iki satırla, yani printf ("foo \ nbar") ile açıkça eşleşen bir desen istiyorsanız, "foo \ r \ nbar" desenini kullanmalısınız.
Kullanıcıdan read_user üzerinden okurken benzer bir çeviri gerçekleşir. Bu durumda, dönüş tuşuna bastığınızda, bir satırsonuna çevrilecektir. Eğer Expect daha sonra terminalini ham moda (telnet gibi) ayarlayan bir programa aktarırsa, program gerçek bir geri dönüş beklediğinden bir problem olacaktır. (Bazı programlar aslında yeni satırları otomatik olarak dönüşlere çevireceklerinden dolayı affediyorlar, ama çoğu yok.) Ne yazık ki, bir programın terminalini ham moda soktuğunu öğrenmenin bir yolu yok.
Yeni satırları elle döndürmek yerine, çözüm, çeviriyi durduracak olan "stty raw" komutunu kullanmaktır. Bununla birlikte, bunun anlamı, pişmiş hat düzenleme özelliklerini artık alamayacağınızdır.
etkileşimi , terminalinizi ham moda ayarlar, dolayısı ile bu sorun ortaya çıkmaz.
Beklet komutlarında parolaları (veya diğer özel bilgileri) depolamak genellikle yararlıdır. Bu, bir bilgisayarda depolanan herhangi bir şey herkes tarafından erişilmek için duyarlı olduğundan, önerilmez. Böylece, etkileşimli olarak bir komut dosyasından parola sormak, onları tam olarak gömmekten daha akıllı bir fikirdir. Bununla birlikte, bazen bu tür gömme tek olanaktır.
Ne yazık ki, UNIX dosya sistemi, çalıştırılabilir ancak okunamaz olan komut dosyaları oluşturmanın doğrudan bir yoluna sahip değildir. Setgid kabuk betiklerini destekleyen sistemler aşağıdaki gibi dolaylı olarak simüle edebilir:
Bekleme komut dosyasını (gizli verileri içeren) her zamanki gibi oluşturun. İzinlerini 750 (-rwxr-x ---) yapın ve güvenilir bir gruba, yani okumasına izin verilen bir gruba sahip olun. Gerekirse, bu amaç için yeni bir grup oluşturun. Ardından, aynı grup tarafından sahip olunan 2751 (-rwxr-s - x) izinlerine sahip bir / bin / sh komut dosyası oluşturun.
Sonuç, herkes tarafından yürütülebilen (ve okunabilen) bir betiktir. Çağrıldığında, Expect betiğini çalıştırır.
& # 34; DAHA FAZLA & # 34;
Tcl (3), libexpect (3)
"Keşfetmeyi Keşfedin: Etkileşimli Programları Otomatikleştirmek için Tcl Tabanlı Bir Araç Seti" , Don Libes, s. 602, ISBN 1-56592-090-2, O'Reilly ve Associates, 1995.
"Beklentiler: Bu Etkileşimin Kontrol Edilemeyen Etkilerinin Kürlenmesi", Don Libes, 1990 Yaz Sonu USENIX Konferansı, Anaheim, Kaliforniya, 11-15 Haziran 1990.
.I Don Libes, 1990 USENIX Büyük Kurulum Sistemleri Yönetim Konferansı, Colorado Springs, Colorado, 17-19 Ekim 1990 Bildirileri, "Sistem Yönetim Görevlerini Otomatikleştirmek için Beklentiyi Kullanma".
John Ousterhout, "Tcl: Gömülebilir Bir Komut Dili", 1990 Kış Konferansı, USENIX Konferansı, Washington, DC, 22-26 Ocak, 1990. "Beklentiler: Etkileşimli Programları Kontrol Etme Komutları", Don Libes, Bilgisayar Sistemleri Vol. 4, No. 2, Kaliforniya Üniversitesi Basın Dergileri, Kasım 1991 .. "Regression Testing and Conformance Testing Interaktif Programları", Don Libes, Summer 1992 USENIX Konferansı, ss. 135-144, San Antonio, TX, 12-15 Haziran 1992, "Kibitz - Birlikte Çoklu Etkileşimli Programları Bağlamak", Don Libes, Yazılım - Uygulama & Deneyim, John Wiley & Sons, West Sussex, İngiltere, Vol.
23, No. 5, Mayıs, 1993 .. "Tcl Uygulamaları için Bir Hata Ayıklayıcısı", Don Libes, 1993 Tcl / Tk Çalıştayı Bildirileri, Berkeley, CA, 10-11 Haziran 1993.
YAZAR
Don Libes, Ulusal Standartlar ve Teknoloji Enstitüsü
TEŞEKKÜR
Tcl için John Ousterhout ve ilham için Scott Paisley'e teşekkürler. Expect'in otomatik yapılandırma kodu için Rob Savoye'ye teşekkürler.
TARİH dosyası beklemenin evrimini belgelemektedir. Bu, ilginç bir okuma yapar ve bu yazılıma daha fazla bilgi verebilir. Bana hata düzeltmeleri yollayan ve başka yardımlarda bulunan insanlara teşekkür ederim.
Expect'in tasarlanması ve uygulanması kısmen ABD hükümeti tarafından ödenmiştir ve bu nedenle kamuya açık bir alandadır. Ancak yazar ve NIST, bu program ve belgelerin veya bölümlerinin kullanılması durumunda krediyi ister.