İsim
expect - etkileşimli programlarla programlanmış diyalog, Sürüm 5
Özet
expect [ -dDinN ] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
Giriş
Expect, bir betiğe göre diğer etkileşimli programlarla "konuşan" bir programdır. Betiği takip eden Expect, bir programdan nelerin beklenebileceğini ve doğru yanıtın ne olması gerektiğini bilir. Yorumlanan bir dil, diyaloğu yönlendirmek için dallanma ve üst düzey kontrol yapıları sağlar. Ek olarak, kullanıcı istendiğinde kontrolü ele alıp doğrudan etkileşime girebilir ve ardından kontrolü betiğe geri devredebilir.
Expectk, Expect ve Tk'nin bir karışımıdır. Tıpkı Expect ve Tk'nin wish aracı gibi davranır. Expect, doğrudan C veya C++ içinde de (yani Tcl olmadan) kullanılabilir. libexpect(3) sayfasına bakın.
"Expect" ismi; uucp, kermit ve diğer modem kontrol programları tarafından popüler hale getirilen send/expect (gönder/bekle) dizileri fikrinden gelir. Ancak uucp'den farklı olarak Expect, herhangi bir program ve görev göz önünde bulundurularak kullanıcı düzeyinde bir komut olarak çalıştırılabilecek şekilde genelleştirilmiştir. Expect aslında aynı anda birkaç programla birden konuşabilir.
Örneğin, Expect'in yapabileceği bazı şeyler şunlardır:
• Arama ücretini ödemeden oturum açabilmeniz için bilgisayarınızın sizi geri aramasını sağlamak.
• Bir oyunu (örneğin rogue) başlatmak ve en uygun yapılandırma görünmezse, görünene kadar tekrar tekrar yeniden başlatmak, ardından kontrolü size devretmek.
• fsck programını çalıştırmak ve sorularına önceden belirlenmiş kriterlere göre "yes" (evet), "no" (hayır) yanıtı vermek veya kontrolü size geri vermek.
• Başka bir ağa veya BBS'ye (örneğin MCI Mail, CompuServe) bağlanmak ve e-postalarınızı sanki yerel sisteminize gönderilmiş gibi otomatik olarak almak.
• Çevre değişkenlerini, mevcut dizini veya herhangi bir bilgiyi rlogin, telnet, tip, su, chgrp vb. üzerinden taşımak.
Kabuğun (shell) bu görevleri yerine getirememesinin çeşitli nedenleri vardır. (Deneyin, göreceksiniz.) Bunların hepsi Expect ile mümkündür.
Genel olarak Expect, program ile kullanıcı arasında etkileşim gerektiren herhangi bir programı çalıştırmak için kullanışlıdır. Tek gereken, etkileşimin programatik olarak karakterize edilebilmesidir. Expect, istenirse kontrol altındaki programı durdurmadan kontrolü kullanıcıya geri verebilir. Benzer şekilde, kullanıcı da istediği zaman kontrolü betiğe geri devredebilir.
Kullanım
Expect, yürütülecek komutların bir listesi için cmdfile dosyasını okur. Expect, betiği yürütülebilir olarak işaretleyerek ve betiğinizin ilk satırını şu şekilde ayarlayarak #! notasyonunu destekleyen sistemlerde örtük olarak da çağrılabilir:
#!/usr/local/bin/expect -f
Elbette, yol Expect'in nerede bulunduğunu doğru bir şekilde açıklamalıdır. /usr/local/bin yalnızca bir örnektir.
-c bayrağı, betikteki herhangi bir komuttan önce yürütülecek bir komutun önüne gelir. Komut, kabuk tarafından parçalanmasını önlemek için tırnak içine alınmalıdır. Bu seçenek birden fazla kez kullanılabilir. Birden fazla komut, noktalı virgülle ayrılarak tek bir -c ile yürütülebilir. Komutlar göründükleri sırayla yürütülür. (Expectk kullanılırken bu seçenek -command olarak belirtilir.)
-d bayrağı, öncelikle expect ve interact gibi komutların dahili etkinliklerini raporlayan bazı tanılama çıktılarını etkinleştirir. Bu bayrak, bir Expect betiğinin başındaki "exp_internal 1" komutu ile aynı etkiye sahiptir ve ayrıca Expect sürümü yazdırılır. (strace komutu ifadeleri izlemek için kullanışlıdır ve trace komutu değişken atamalarını izlemek için kullanışlıdır.) (Expectk kullanılırken bu seçenek -diag olarak belirtilir.)
-D bayrağı etkileşimli bir hata ayıklayıcıyı (debugger) etkinleştirir. Bunu bir tamsayı değeri takip etmelidir. Hata ayıklayıcı, değer sıfırdan farklıysa veya bir ^C tuşuna basılırsa (veya bir kesme noktasına (breakpoint) ulaşılırsa veya betikte başka bir uygun hata ayıklayıcı komutu görünürse) bir sonraki Tcl yordamından (procedure) önce kontrolü ele alacaktır. Hata ayıklayıcı hakkında daha fazla bilgi için README dosyasına veya aşağıdaki AYRICA BAKINIZ bölümüne bakın. (Expectk kullanılırken bu seçenek -Debug olarak belirtilir.)
-f bayrağı, komutların okunacağı bir dosyanın önüne gelir. Bayrağın kendisi isteğe bağlıdır, çünkü yalnızca #! notasyonu kullanılırken (yukarıya bakın) komut satırında diğer argümanların sağlanabilmesi için kullanışlıdır. (Expectk kullanılırken bu seçenek -file olarak belirtilir.)
Varsayılan olarak, komut dosyası belleğe okunur ve tamamı yürütülür. Bazen dosyaları satır satır okumak istenebilir. Örneğin, stdin bu şekilde okunur. Rastgele dosyaları bu şekilde işlenmeye zorlamak için -b bayrağını kullanın. (Expectk kullanılırken bu seçenek -buffer olarak belirtilir.) Standart girdi/çıktı arabelleğe almasının (stdio-buffering) yine de gerçekleşebileceğini unutmayın, ancak bu bir FIFO'dan veya stdin'den okuma yaparken sorun oluşturmamalıdır.
Dosya adı olarak "-" dizisi verilirse, bunun yerine standart girdi okunur. Gerçekten "-" adındaki bir dosyadan okumak için "./-" kullanın.
-i bayrağı, Expect'in komutları bir dosyadan okumak yerine etkileşimli olarak istemesine neden olur. İstem istemi, exit komutuyla veya EOF (dosya sonu) durumunda sonlandırılır. Daha fazla bilgi için aşağıdaki interpreter bölümüne bakın. Ne bir komut dosyası ne de -c kullanılmadığında -i varsayılır. (Expectk kullanılırken bu seçenek -interactive olarak belirtilir.)
-- bayrağı seçeneklerin sonunu sınırlamak için kullanılabilir.: Bu, Expect tarafından yorumlanmasını istemediğiniz seçenek benzeri bir argümanı betiğinize iletmek istiyorsanız kullanışlıdır. Bu, Expect tarafından herhangi bir bayrak benzeri yorumlamayı önlemek için #! satırına yerleştirilebilir. Örneğin, aşağıdakiler orijinal argümanları (betik adı dahil) argv değişkeninde bırakacaktır:
#!/usr/local/bin/expect --
#! satırına argüman eklerken olağan getopt(3) ve execve(2) kurallarına uyulması gerektiğini unutmayın.
-N bayrağı kullanılmadığı sürece $exp_library/expect.rc dosyası varsa otomatik olarak yüklenir (source edilir). (Expectk kullanılırken bu seçenek -NORC olarak belirtilir.) Hemen ardından, -n bayrağı kullanılmadığı sürece ~/.expect.rc dosyası otomatik olarak yüklenir. If the environment variable DOTDIR is defined, it is treated as a directory and .expect.rc is read from there. (Expectk kullanılırken bu seçenek -norc olarak belirtilir.) Bu yükleme işlemi yalnızca herhangi bir -c bayrağı yürütüldükten sonra gerçekleşir.
-v bayrağı, Expect'in sürüm numarasını yazdırmasına ve çıkmasına neden olur.: (Expectk'teki uzun bayrak adlarını kullanan karşılık gelen bayrak -version şeklindedir.)
İsteğe bağlı argümanlar (args) bir liste halinde yapılandırılır ve argv adındaki değişkende saklanır. argc, argv'nin uzunluğuna göre başlatılır.
argv0, betiğin adı (veya betik kullanılmıyorsa ikili dosya adı) olarak tanımlanır. Örneğin, aşağıdakiler betiğin adını ve ilk üç argümanı yazdırır:
send_user "$argv0 [lrange $argv 0 2]\n"
Komutlar
Expect, Tcl (Tool Command Language) kullanır. Tcl; kontrol akışı (örneğin if, for, break), ifade değerlendirme ve özyineleme (recursion), yordam tanımlama vb. gibi diğer bazı özellikleri sağlar. Burada kullanılan ancak tanımlanmayan komutlar (örneğin set, if, exec) Tcl komutlarıdır (tcl(3) sayfasına bakın). Expect, aşağıda açıklanan ek komutları destekler. Aksi belirtilmedikçe komutlar boş dize döndürür.
Komutlar hızlıca bulunabilmeleri için alfabetik olarak listelenmiştir. Ancak yeni kullanıcılar sırasıyla spawn, send, expect ve interact açıklamalarını okuyarak başlamayı daha kolay bulabilirler.
Dile (hem Expect hem de Tcl) en iyi girişin "Exploring Expect" kitabında (aşağıdaki AYRICA BAKINIZ bölümüne bakın) sağlandığını unutmayın. Bu kılavuz sayfasına örnekler dahil edilmiştir, ancak bu kılavuz sayfası öncelikle bir referans materyali olarak tasarlandığından örnekler oldukça sınırlıdır.
Bu kılavuz sayfasının metninde, büyük harfle başlayan "Expect" kelimesinin Expect programını, küçük harfle başlayan "expect" kelimesinin ise Expect programı içindeki expect komutunu ifade ettiğini unutmayın.
close [-replica] [-onexec 0|1] [-i spawn_id] mevcut sürece olan bağlantıyı kapatır. Etkileşimli programların çoğu kendi stdin'lerinde EOF algılayacak ve çıkacaktır; bu nedenle close genellikle süreci sonlandırmak (kill etmek) için de yeterlidir. -i bayrağı, belirtilen spawn_id değerine karşılık gelen sürecin kapatılacağını bildirir.
Hem expect hem de interact mevcut sürecin ne zaman sonlandığını algılayacak ve örtük olarak bir close işlemi gerçekleştirecektir. Ancak süreci, örneğin "exec kill $pid" ile sonlandırırsanız, close komutunu açıkça çağırmanız gerekecektir.
-onexec bayrağı, yeni oluşturulan herhangi bir süreçte spawn id'sinin kapatılıp kapatılmayacağını veya sürecin üzerine yazılıp yazılmayacağını (overlay) belirler. Bir spawn id'sini açık bırakmak için 0 değerini kullanın. Sıfır olmayan bir tamsayı değeri, yeni süreçlerde spawn'ı kapatmaya zorlar (varsayılan davranış).
-replica bayrağı, spawn id ile ilişkili replikayı kapatır. ("spawn -pty" bölümüne bakın.) Bağlantı kapatıldığında, replika hala açık ise o da otomatik olarak kapatılır.
Bağlantının örtük veya açık olarak kapatılmasından bağımsız olarak, ilgili çekirdek süreç yuvasını (kernel process slot) temizlemek için wait komutunu çağırmalısınız. close komutu wait komutunu çağırmaz, çünkü bir süreç bağlantısını kapatmanın onun çıkmasına neden olacağının garantisi yoktur. Daha fazla bilgi için aşağıdaki wait bölümüne bakın.
debug [[-now] 0|1] ifadeler arasında adım adım ilerlemenize, kesme noktaları (breakpoint) ayarlamanıza vb. olanak tanıyan bir Tcl hata ayıklayıcısını kontrol eder.
Argüman verilmezse, hata ayıklayıcı çalışmıyorsa 1, çalışıyorsa 0 döndürülür.
1 argümanı ile hata ayıklayıcı başlatılır. 0 argümanı ile hata ayıklayıcı durdurulur. 1 argümanından önce -now bayrağı gelirse, hata ayıklayıcı hemen (yani debug komutunun tam ortasında) başlatılır. Aksi takdirde, hata ayıklayıcı bir sonraki Tcl ifadesiyle başlatılır.
debug komutu hiçbir yakalamayı (trap) değiştirmez. Bunu Expect'i -D bayrağı ile başlatmakla karşılaştırın (yukarıya bakın).
Hata ayıklayıcı hakkında daha fazla bilgi için README dosyasına veya aşağıdaki AYRICA BAKINIZ bölümüne bakın.
disconnect çatallanmış (fork edilmiş) bir sürecin uçbirimle olan bağlantısını keser. Süreç arka planda çalışmaya devam eder. Sürece kendi süreç grubu verilir (mümkünse). Standart G/Ç /dev/null adresine yönlendirilir.
Aşağıdaki parça, betiği arka planda çalıştırmaya devam etmek için disconnect komutunu kullanır.
if {[fork]!=0} exit disconnect . . .
Aşağıdaki betik bir parola okur ve ardından her çalıştırıldığında parola gerektiren bir programı saatte bir çalıştırır. Betik parolayı sağlar, abolition onu yalnızca bir kez yazmanız gerekir. (Parola yankılanmasının nasıl kapatılacağını gösteren stty komutuna bakın.)
send_user "password?\ " expect_user -re "(.*)\n" for {} 1 {} { if {[fork]!=0} {sleep 3600;continue} disconnect spawn priv_prog expect Password: send "$expect_out(1,string)\r" . . . exit }
Kayıt dışı arka plan süreci özelliği (&) yerine disconnect kullanmanın bir avantajı, Expect'in bağlantıyı kesmeden önce uçbirim parametrelerini kaydedebilmesi ve daha sonra bunları yeni pty'lere uygulayabilmesidir. & ile Expect, uçbirimin parametrelerini okuma şansına sahip olamaz çünkü Expect kontrolü alana kadar uçbirim bağlantısı zaten kesilmiştir.
exit [-opts] [status] Expect'in çıkmasına veya çıkış için hazırlanmasına neden olur.
-onexit bayrağı, bir sonraki argümanın bir çıkış işleyicisi (exit handler) olarak kullanılmasını sağlar. Argüman verilmezse, mevcut çıkış işleyicisi döndürülür.
-noexit bayrağı, Expect'in çıkışa hazırlanmasına neden olur ancak kontrolü işletim sistemine gerçekten geri vermeden durur. Kullanıcı tanımlı çıkış işleyicisi ve Expect'in kendi dahili işleyicileri çalıştırılır. Başka hiçbir Expect komutu yürütülmemelidir. Bu, Expect'i diğer Tcl uzantılarıyla birlikte çalıştırıyorsanız kullanışlıdır. Mevcut yorumlayıcı (ve Tk ortamındaysa ana pencere) diğer Tcl uzantılarının temizlik yapabilmesi için kalır. Eğer Expect'in exit komutu tekrar çağrılırsa (bu nasıl gerçekleşirse gerçekleşsin), işleyiciler tekrar çalıştırılmaz.
Çıkışta, oluşturulan süreçlere olan tüm bağlantılar kapatılır. Kapatma, oluşturulan süreçler tarafından bir EOF olarak algılanacaktır. exit, normal _exit(2) yordamının yaptığının ötesinde başka bir eylem gerçekleştirmez. Bu nedenle, EOF kontrolü yapmayan oluşturulan süreçler çalışmaya devam edebilir. (Örneğin, oluşturulan bir sürece hangi sinyallerin gönderileceğini belirlemek için çeşitli koşullar önemlidir, ancak bunlar sisteme bağlıdır ve genellikle exit(3) altında belgelenmiştir.) Çalışmaya devam eden oluşturulan süreçler init tarafından devralınacaktır.
status (veya belirtilmemişse 0), Expect'in çıkış durumu olarak döndürülür. Betiğin sonuna ulaşılırsa exit örtük olarak yürütülür.
exp_continue [-continue_timer] exp_continue komutu, expect'in normalde yapacağı gibi geri dönmek yerine kendisinin yürütülmeye devam etmesini sağlar. 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ı önler. (Daha fazla bilgi için expect komutuna bakın.)
exp_internal [-f file] value value sıfırdan farklıysa, sonraki komutların Expect'e ait dahili tanılama bilgilerini stderr'e göndermesini sağlar. Değer 0 ise bu çıktı devre dışı bırakılır. Tanılama bilgileri, alınan her karakteri ve mevcut çıktıyı desenlerle eşleştirmek için yapılan her girişimi içerir.
İsteğe bağlı dosya (file) sağlanırsa, tüm normal ve hata ayıklama çıktıları (value değerine bakılmaksızın) o dosyaya yazılır. Önceki tüm tanılama çıktı dosyaları kapatılır.
-info bayrağı, exp_internal komutunun verilen en son bilgi dışı argümanların bir açıklamasını döndürmesini sağlar.
exp_open [args] [-i spawn_id] orijinal spawn id değerine karşılık gelen bir Tcl dosya tanımlayıcısı döndürür. Dosya tanımlayıcısı daha sonra Tcl'nin open komutu tarafından açılmış gibi kullanılabilir. (Spawn id artık kullanılmamalıdır. Bir wait yürütülmemelidir.)
-leaveopen bayrağı, Expect komutları aracılığıyla erişim için spawn id değerini açık bırakır. Spawn id üzerinde bir wait yürütülmelidir.
exp_pid [-i spawn_id] şu anda oluşturulmuş sürece karşılık gelen süreç kimliğini (pid) döndürür. -i bayrağı kullanılırsa, döndürülen pid verilen spawn id değerine karşılık gelir.
exp_send send 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] version] betiğin Expect'in mevcut sürümüyle uyumlu olmasını sağlamak için kullanışlıdır.
Argüman verilmezse, Expect'in mevcut sürümü döndürülür. Bu sürüm daha sonra betiğinizde kodlanabilir. Son sürümlerin özelliklerini kullanmadığınızı kesin olarak biliyorsanız, daha eski bir sürüm belirtebilirsiniz.
Sürümler, noktalarla ayrılmış üç sayıdan oluşur. Birincisi ana (major) sürümdür. Farklı bir ana sürüme sahip Expect sürümleri için yazılmış betikler neredeyse kesinlikle çalışmayacaktır. Ana sürümler eşleşmezse exp_version bir hata döndürür.
İkincisi alt (minor) sürümdür. Mevcut sürümden daha büyük bir alt sürüme sahip bir sürüm için yazılmış betikler, bazı yeni özelliklere bağlı olabilir ve çalışmayabilir. Ana sürümler eşleşiyor ancak betik alt sürümü çalışan Expect'inkinden büyükse exp_version bir hata döndürür.
Üçüncüsü, sürüm karşılaştırmasında rol oynamayan bir sayıdır. Ancak Expect yazılım dağıtımı, ek belgeler veya optimizasyon gibi herhangi bir şekilde değiştirildiğinde bu sayı artırılır. Her yeni alt sürümde 0'a sıfırlanır.
-exit bayrağıyla, sürüm güncel değilse Expect bir hata yazdırır ve çıkar.
expect [[-opts] pat1 body1] ... [-opts] patn [bodyn] desenlerden biri oluşturulan bir sürecin çıktısıyla eşleşene, belirtilen bir süre geçene veya bir dosya sonu (EOF) görülene kadar bekler. Son gövde (body) boşsa atlanabilir.
En son expect_before komutundan gelen desenler, diğer tüm desenlerden önce örtük olarak kullanılır. En son expect_after komutundan gelen desenler, diğer tüm desenlerden sonra örtük olarak kullanılır.
Tüm expect ifadesinin argümanları birden fazla satır gerektiriyorsa, her satırı ters eğik çizgi ile sonlandırmaktan kaçınmak için tüm argümanlar süslü parantez içine alınabilir. Bu durumda, süslü parantezlere rağmen olağan Tcl değiştirmeleri gerçekleşecektir.
Bir desen eof anahtar kelimesi ise, ilgili gövde dosya sonunda yürütülür. Bir desen timeout anahtar kelimesi ise, ilgili gövde zaman aşımında yürütülür. Hiçbir timeout anahtar kelimesi kullanılmazsa, zaman aşımında örtük bir boş eylem yürütülür. Varsayılan zaman aşımı süresi 10 saniyedir ancak örneğin "set timeout 30" komutuyla 30'a ayarlanabilir. Sonsuz bir zaman aşımı -1 değeriyle belirtilebilir. Bir desen default anahtar kelimesi ise, ilgili gövde zaman aşımı veya dosya sonu durumunda yürütülür.
Bir desen eşleşirse, ilgili gövde yürütülür. expect, gövdenin sonucunu (veya hiçbir desen eşleşmediyse boş dizeyi) döndürür. Birden fazla desenin eşleşmesi durumunda, bir gövde seçmek için ilk görünen desen kullanılır.
Her yeni çıktı geldiğinde, listelendikleri sırayla her desenle karşılaştırılır. Bu nedenle, son deseni bir istem (prompt) gibi görünmesi garanti edilen bir şey yaparak bir eşleşmenin olmadığını test edebilirsiniz. Bir istemin olmadığı durumlarda, timeout kullanmalısınız (tıpkı manuel olarak etkileşimde bulunurken yapacağınız gibi).
Desenler üç şekilde belirtilir. Varsayılan olarak desenler, Tcl'nin string match komutunda olduğu gibi belirtilir. (Bu tür desenler, genellikle "glob" desenleri olarak adlandırılan C-shell düzenli ifadelerine de benzer). -gl bayrağı, aksi takdirde expect bayraklarıyla eşleşebilecek desenleri 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ş arar. (abort yordamının betiğin başka bir yerinde tanımlanmış bir yordam olduğu varsayılır.)
expect { busy {puts busy\n ; exp_continue} failed abort "invalid password" abort timeout abort connected }
Dördüncü desende tırnak işaretleri gereklidir çünkü boşluk içerir, aksi takdirde boşluk deseni eylemden ayırır. Aynı eyleme sahip desenler (3. ve 4. gibi) eylemlerin tekrar listelenmesini gerektirir. Bu durum düzenli ifade (regexp) tarzı desenler kullanılarak önlenebilir (aşağıya bakın). Glob tarzı desenlerin oluşturulması hakkında daha fazla bilgi Tcl kılavuzunda bulunabilir.
Düzenli ifade (regexp) tarzı desenler, Tcl'nin regexp (düzenli ifadenin kısaltması) komutu tarafından tanımlanan sözdizimini takip eder. regexp desenleri -re bayrağı ile tanıtılır. Önceki örnek bir regexp kullanılarak şu şekilde yeniden yazılabilir:
expect { busy {puts busy\n ; exp_continue} -re "failed|invalid password" abort timeout abort connected }
Her iki desen türü de "çıpasızdır" (unanchored). Bu means that patterns do not have to match the entire string, but can begin and end the match anywhere in the string (as long as everything else matches). Bir dizenin başlangıcını eşleştirmek için ^, sonunu eşleştirmek için $ kullanın. Bir dizenin sonunu beklemezseniz, yanıtlarınızın oluşturulan süreçten yankılandıkça kolayca dizenin ortasında kalabileceğini unutmayın. Bu yine de doğru sonuçlar üretse de çıktı doğal görünmeyebilir. Bu nedenle, bir dizenin sonundaki karakterleri tam olarak tanımlayabiliyorsanız $ kullanımı teşvik edilir.
Birçok düzenleyicide (editor) ^ ve $ karakterlerinin sırasıyla satırların başlangıcı ve sonu ile eşleştiğini unutmayın. Ancak, expect satır yönelimli olmadığından, bu karakterler şu anda expect eşleştirme arabelleğinde bulunan verilerin (satırların aksine) başlangıcı ve sonu ile eşleşir. (Ayrıca, aşağıdaki "sistem hazımsızlığı" hakkındaki nota bakın.)
-ex bayrağı, desenin "birebir" (exact) bir dize olarak eşleştirilmesine neden olur. *, ^ vb. karakterlerin hiçbir yorumu yapılmaz (her ne kadar olağan Tcl kurallarına uyulması gerekse de). Birebir desenler her zaman çıpasızdır.
-nocase bayrağı, çıktının büyük harfli karakterlerinin küçük harfli karakterler gibi karşılaştırılmasına neden olur. Desen bundan etkilenmez.
Çıktı okunurken, 2000 bayttan fazlası önceki baytların "unutulmasına" neden olabilir. Bu durum match_max işlevi ile değiştirilebilir. (Aşırı büyük değerlerin desen eşleştiriciyi yavaşlatabileceğini unutmayın.) patlist değeri full_buffer ise, match_max bayt alınmış ve başka hiçbir desen eşleşmemişse ilgili gövde yürütülür. full_buffer anahtar kelimesinin kullanılıp kullanılmadığına bakılmaksızın, unutulan karakterler expect_out(buffer) değişkenine yazılır.
patlist değeri null anahtar kelimesi ise ve boş karakterlere (nulls) izin veriliyorsa (remove_nulls komutu aracılığıyla), tek bir ASCII 0 eşleştiğinde ilgili gövde yürütülür. Glob veya regexp desenleri aracılığıyla 0 baytını eşleştirmek mümkün değildir.
Bir desen (veya eof ya da full_buffer) eşleştiğinde, eşleşen ve daha önce eşleşmeyen tüm çıktılar expect_out(buffer) değişkenine kaydedilir. 9 adede kadar regexp alt dize eşleşmesi, expect_out(1,string) ila expect_out(9,string) değişkenlerine kaydedilir. Bir desenden önce -indices bayrağı kullanılırsa, 10 dizenin başlangıç ve bitiş indeksleri (lrange için uygun bir biçimde) expect_out(X,start) ve expect_out(X,end) değişkenlerinde saklanır; burada X bir rakamdır ve arabellek içindeki alt dize konumuna karşılık gelir. 0, desenin tamamıyla eşleşen dizeleri ifade eder ve regexp desenlerinin yanı sıra glob desenleri için de üretilir. Örneğin, bir süreç "abcdefgh\n" çıktısını üretmişse, şunun sonucu:
expect "cd"
aşağıdaki ifadeler yürütülmüş gibidir:
set expect_out(0,string) cd set expect_out(buffer) abcd
ve "efgh\n" çıktı arabelleğinde kalır. Bir süreç "abbbcabkkkka\n" çıktısını üretmişse, şunun sonucu:
expect -indices -re "b(b*).*(k+)"
aşağıdaki ifadeler yürütülmüş gibidir:
set expect_out(0,start) 1 set expect_out(0,end) 10 set expect_out(0,string) bbbcabkkkk set expect_out(1,start) 2 set expect_out(1,end) 3 set expect_out(1,string) bb set expect_out(2,start) 10 set expect_out(2,end) 10 set expect_out(2,string) k set expect_out(buffer) abbbcabkkkk
ve "a\n" çıktı arabelleğinde kalır. "" deseni (ve -re ".") süreçten daha fazla çıktı okumadan çıktı arabelleğini boşaltacaktır.
Normalde, eşleşen çıktı Expect'in dahili arabelleklerinden atılır. Bu durum, bir desenden önce -notransfer bayrağı getirilerek önlenebilir. Bu bayrak özellikle denemeler yaparken kullanışlıdır (ve deneme yaparken kolaylık sağlamak için "-not" olarak kısaltılabilir).
Eşleşen çıktı (veya eof ya da full_buffer) ile ilişkili spawn id, expect_out(spawn_id) değişkeninde saklanır.
-timeout bayrağı, mevcut expect komutunun timeout değişkeninin değerini kullanmak yerine takip eden değeri bir zaman aşımı süresi olarak kullanmasına neden olur.
Varsayılan olarak desenler mevcut sürecin çıktısıyla eşleştirilir, ancak -i bayrağı, belirtilen spawn_id listesinden gelen çıktının sonraki desenlerle (bir sonraki -i bayrağına kadar) eşleştirileceğini bildirir. spawn_id listesi, boşlukla ayrılmış bir spawn_id listesi veya böyle bir spawn_id listesine atıfta bulunan bir değişken olmalıdır.
Örneğin, aşağıdaki örnek mevcut süreçten "connected", ya da $proc2 tarafından adlandırılan spawn_id'den "busy", "failed" veya "invalid password" bekler.
expect { -i $proc2 busy {puts busy\n ; exp_continue} -re "failed|invalid password" abort timeout abort connected }
Küresel değişken any_spawn_id'nin değeri, mevcut expect komutundaki diğer tüm -i bayraklarıyla adlandırılan herhangi bir spawn_id ile desenleri eşleştirmek için kullanılabilir. İlişkili bir deseni olmayan (yani hemen başka bir -i tarafından takip edilen) bir -i bayrağından gelen spawn_id, any_spawn_id ile ilişkili aynı expect komutundaki diğer tüm desenlerin kullanımına sunulur.
-i bayrağı ayrıca bir küresel değişkeni de adlandırabilir; bu durumda değişken, bir spawn id listesi için okunur. Değişken her değiştiğinde yeniden okunur. Bu, komut yürütülürken G/Ç kaynağını değiştirmenin bir yolunu sağlar. Bu şekilde sağlanan spawn id'lerine "dolaylı" (indirect) spawn id'leri denir.
break ve continue gibi eylemler, kontrol yapılarının (yani for, proc) alışılagelmiş şekilde davranmasına neden olur. exp_continue komutu, expect'in normalde yapacağı gibi geri dönmek yerine kendisinin yürütülmeye devam etmesini sağlar.
Bu, açık döngülerden veya tekrarlanan expect ifadelerinden kaçınmak için kullanışlıdır. Aşağıdaki örnek rlogin'i otomatikleştirmek için bir parçadır. exp_continue, rlogin bir parola istediğinde ikinci bir expect ifadesi (tekrar istemi aramak için) yazmak zorunda kalmayı önler.
expect {
Password: {
stty -echo
send_user "password (for $user) on $host: "
expect_user -re "(.*)\n"
send_user "\n"
send "$expect_out(1,string)\r"
stty echo
exp_continue
} incorrect {
send_user "invalid password or account\n"
exit
} timeout {
send_user "connection to $host timed out\n"
exit
} eof {
send_user
"connection to host failed: $expect_out(buffer)"
exit
} -re $prompt
}
Örneğin, aşağıdaki parça bir kullanıcının halihazırda tamamen otomatikleştirilmiş bir etkileşimi yönlendirmesine yardımcı olabilir. Bu durumda, uçbirim ham (raw) moda alınır. Kullanıcı "+" tuşuna basarsa, bir değişken artırılır. "p" tuşuna basılırsa, sürece belki de onu bir şekilde dürtmek için birkaç satır başı (return) gönderilir ve "i" kullanıcının süreçle etkileşime girmesini sağlayarak kontrolü betikten etkili bir şekilde çalar. Her durumda, exp_continue mevcut eylemi yürüttükten sonra mevcut expect komutunun desen eşleştirmeye devam etmesini sağlar.
stty raw -echo expect_after { -i $user_spawn_id "p" {send "\r\r\r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" exit }
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 expect hem de expect_after komutlarından gelen desenlerin eşleşebilmesi durumunda expect deseninin kullanılması hariç, expect_before ile tamamen aynı şekilde çalışır. Daha fazla bilgi için expect_before komutuna bakın.
expect_background [expect_args] expect ile aynı argümanları alır, ancak hemen geri döner. Yeni girdi geldiğinde desenler test edilir. timeout ve default desenleri expect_background için anlamsızdır ve sessizce atılır. Aksi takdirde, expect_background komutu tıpkı expect gibi expect_before ve expect_after desenlerini kullanır.
expect_background eylemleri değerlendirilirken, aynı spawn id için arka plan işleme engellenir. Eylem tamamlandığında arka plan işleme engeli kaldırılır. Arka plan işleme engellenmişken, aynı spawn id üzerinde bir (ön plan) expect yapmak mümkündür.
Bir expect_background engellenmemişken bir expect yürütmek mümkün değildir. Belirli bir spawn id için expect_background, aynı spawn id ile yeni bir expect_background bildirilerek silinir. Desensiz expect_background bildirmek, verilen spawn id'sinin arka planda desen eşleştirme yeteneğini kaldırır.
expect_before [expect_args] expect ile aynı argümanları alır, ancak hemen geri döner. Aynı spawn id ile en son expect_before komutundan gelen desen-eylem çiftleri, sonraki tüm expect komutlarına örtük olarak eklenir. Bir desen eşleşirse, expect komutunun kendisinde belirtilmiş gibi işlem görür ve ilişkili gövde expect komutunun bağlamında yürütülür. Hem expect_before hem de expect komutlarından gelen desenlerin eşleşebilmesi durumunda, expect_before deseni kullanılır.
Hiçbir desen belirtilmemişse, spawn id herhangi bir desen için kontrol edilmez.
Bir -i bayrağı tarafından geçersiz kılınmadıkça, expect_before desenleri, expect_before komutunun yürütüldüğü sırada (deseninin eşleştiği sırada değil) tanımlanan spawn id değerine karşı eşleşir.
-info bayrağı, expect_before komutunun hangi desenleri eşleştireceğine dair mevcut özellikleri döndürmesini sağlar. Varsayılan olarak, mevcut spawn id üzerinde rapor verir. O spawn id hakkındaki bilgiler için isteğe bağlı bir spawn id özelliği verilebilir. Örneğin
expect_before -info -i $proc
En fazla bir spawn id özelliği verilebilir. -indirect bayrağı, yalnızca dolaylı özelliklerden gelen doğrudan spawn id'lerini bastırır.
Bir spawn id özelliği yerine, "-all" bayrağı "-info"nun tüm spawn id'leri üzerinde rapor vermesini sağlayacaktır.
-info bayrağının çıktısı, expect_before için argüman olarak yeniden kullanılabilir.
expect_tty [expect_args] expect gibidir ancak karakterleri /dev/tty adresinden (yani kullanıcının tuş vuruşlarından) okur. Varsayılan olarak, okuma işlemi pişirilmiş (cooked) modda gerçekleştirilir. Bu nedenle, expect'in bunları görebilmesi için satırların bir satır başı (return) ile bitmesi gerekir. Bu durum stty aracılığıyla değiştirilebilir (aşağıdaki stty komutuna bakın).
expect_user [expect_args] expect gibidir ancak karakterleri stdin'den (yani kullanıcının tuş vuruşlarından) okur. Varsayılan olarak, okuma işlemi pişirilmiş (cooked) modda gerçekleştirilir. Bu nedenle, expect'in bunları görebilmesi için satırların bir satır başı (return) ile bitmesi gerekir. Bu durum stty aracılığıyla değiştirilebilir (aşağıdaki stty komutuna bakın).
fork yeni bir süreç oluşturur. Yeni süreç, mevcut Expect sürecinin birebir kopyasıdır. Başarı durumunda fork, yeni (çocuk/child) sürece 0 döndürür ve ebeveyn (parent) sürece çocuk sürecin süreç kimliğini (PID) döndürür. Başarısızlık durumunda (değişmez bir şekilde takas alanı (swap space), bellek gibi kaynakların yetersizliğinden kaynaklanır), fork ebeveyn sürece -1 döndürür ve hiçbir çocuk süreç oluşturulmaz.
Çatallanmış (fork edilmiş) süreçler, tıpkı orijinal süreç gibi exit komutuyla çıkar. Çatallanmış süreçlerin günlük dosyalarına yazmasına izin verilir. Süreçlerin ç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 da olsa birden fazla okuyucu ve yazıcı tarafından karıştırılabilir. Bu nedenle, süreçleri spawn etmeden önce fork yapmak en güvenlisidir.
interact [string1 body1] ... [stringn [bodyn]] mevcut sürecin kontrolünü kullanıcıya verir, böylece tuş vuruşları mevcut sürece gönderilir ve mevcut sürecin stdout ve stderr çıktıları geri döndürülür.
Argüman olarak karakter dizisi-gövde (string-body) çiftleri belirtilebilir; bu durumda ilgili karakter dizisi girildiğinde gövde yürütülür. (Varsayılan olarak, karakter dizisi mevcut sürece gönderilmez.) Son gövde eksikse, interpreter komutunun çalıştırılacağı varsayılır.
Tüm interact ifadesinin argümanları birden fazla satır gerektiriyorsa, her satırı ters eğik çizgi ile sonlandırmaktan kaçınmak için tüm argümanlar süslü parantez içine alınabilir. Bu durumda, süslü parantezlere rağmen olağan Tcl değiştirmeleri gerçekleşecektir.
Örneğin, aşağıdaki komut tanımlanan karakter dizisi-gövde çiftleriyle interact çalıştırır: ^Z tuşuna basıldığında Expect askıya alınır. (-reset bayrağı uçbirim modlarını geri yükler.) ^A tuşuna basıldığında, kullanıcı "you typed a control-A" (bir kontrol-A yazdınız) ifadesini görür ve sürece bir ^A gönderilir. $ tuşuna basıldığında, kullanıcı tarihi görür. ^C tuşuna basıldığında, Expect çıkar. "foo" girilirse, kullanıcı "bar" görür. ~~ tuşuna basıldığında, Expect yorumlayıcısı etkileşimli olarak çalışır.
set CTRLZ \032 interact { -reset $CTRLZ {exec kill -STOP [pid]} \001 {send_user "you typed a control-A\n"; send "\001" } $ {send_user "The date is [clock format [clock seconds]]."} \003 exit foo {send_user "bar"} ~~ }
Karakter dizisi-gövde çiftlerinde, karakter dizileri argüman olarak listelendikleri sırayla eşleştirilir. Kısmen eşleşen karakter dizileri, geri kalanının geleceği beklentisiyle mevcut sürece gönderilmez. Eğer daha sonra artık bir eşleşmenin mümkün olamayacağı karakterler girilirse, sürecin başka bir eşleşmeyi başlatması kesinlikle mümkün olmayan kısmı sürece gönderilir. Bu nedenle, kısmi eşleşmelerin alt dizileri olan karakter dizileri, eşleştirilmeye çalışılan orijinal diziler nihayetinde başarısız olursa daha sonra eşleşebilir.
Varsayılan olarak, karakter dizisi eşleştirmesi joker karakter olmadan birebirdir (exact). (Aksine, expect komutu varsayılan olarak glob tarzı desenler kullanır.) -ex bayrağı, aksi takdirde interact bayraklarıyla eşleşebilecek desenleri 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ğı, karakter dizisinin düzenli ifade (regexp) tarzı bir desen olarak yorumlanmasını zorunlu kılar. Bu durumda, eşleşen alt diziler, expect'in çıktısını expect_out değişkeninde saklamasına benzer şekilde interact_out değişkeninde saklanır. -indices bayrağı da benzer şekilde desteklenir.
eof deseni, dosya sonunda yürütülen bir eylemi tanıtır. -output bayrağını ayrı bir eof deseni de takip edebilir; bu durumda çıktı yazılırken bir eof algılanırsa eşleştirilir. Varsayılan eof eylemi "return" şeklindedir, böylece interact herhangi bir EOF durumunda basitçe geri döner.
timeout deseni, belirli bir süre boyunca hiçbir karakter okunmadığında yürütülen bir zaman aşımını (saniye cinsinden) ve eylemi tanıtır. timeout deseni en son belirtilen sürece uygulanır. Varsayılan bir zaman aşımı yoktur. (expect komutu tarafından kullanılan) özel "timeout" değişkeninin bu zaman aşımı üzerinde hiçbir etkisi yoktur.
Örneğin, aşağıdaki ifade bir saattir hiçbir şey yazmayan ancak yine de sık sık sistem mesajları alan kullanıcıları otomatik olarak oturumdan çıkarmak için kullanılabilir:
interact -input $user_spawn_id timeout 3600 return -output
$spawn_id
Desen null anahtar kelimesi ise ve boş karakterlere izin veriliyorsa (remove_nulls komutu aracılığıyla), tek bir ASCII 0 eşleştiğinde ilgili gövde yürütülür. Glob veya regexp desenleri aracılığıyla 0 baytını eşleştirmek mümkün değildir.
Bir desenin önüne -iwrite bayrağının getirilmesi, interact_out(spawn_id) değişkeninin desenle (veya eof) eşleşen spawn_id değerine ayarlanmasına neden olur.
break ve continue gibi eylemler, kontrol yapılarının (yani for, proc) alışılagelmiş şekilde davranmasına neden olur. Ancak return, interact'in çağrıcısına dönmesine neden olurken, inter_return, interact'in çağrıcısında bir return'e neden olmasına yol açar. Örneğin, "proc foo" interact'i çağırdıysa ve o da inter_return eylemini yürüttüyse, proc foo geri döner. (Bu, interact etkileşimli olarak interpreter'ı çağırırsa return yazmanın interact'in devam etmesine neden olacağı, inter_return yazmanın ise interact'in çağrıcısına dönmesine neden olacağı anlamına gelir.)
interact sırasında, tüm karakterlerin mevcut sürece iletilebilmesi için ham (raw) mod kullanılır. Mevcut süreç iş kontrolü sinyallerini yakalamıyorsa, bir durdurma sinyali (varsayılan olarak ^Z) gönderildiğinde duracaktır. Yeniden başlatmak için bir devam etme sinyali (örneğin "kill -CONT
Karakter dizisi-gövde çiftleri, yorumlayıcıya girmek ve komutları etkileşimli olarak yürütmek zorunda kalmamak için bir kısayol olarak kullanılabilir. Karakter dizisi-gövde çiftinin gövdesi yürütülürken önceki uçbirim modu kullanılır.
Hız için eylemler varsayılan olarak ham modda yürütülür. -reset bayrağı, uçbirimi interact yürütülmeden önceki moduna (değişmez bir şekilde pişirilmiş/cooked mod) sıfırlar. Mod değiştirilirken girilen karakterlerin kaybolabileceğini unutmayın (bazı sistemlerdeki uçbirim sürücüsünün talihsiz bir özelliği). -reset kullanmanın tek nedeni, eyleminizin pişirilmiş modda çalışmaya bağlı olmasıdır.
-echo bayrağı, her karakter okundukça aşağıdaki desenle eşleşen karakterleri bunları üreten sürece geri gönderir. Bu, kullanıcının kısmen yazılmış desenlerden geri bildirim görmesi gerektiğinde yararlı olabilir.
Bir desen yankılanıyor (echo) ancak sonunda eşleşmiyorsa, karakterler oluşturulan sürece gönderilir. Oluşturulan süreç de bunları yankılarsa, kullanıcı karakterleri iki kez görecektir. -echo muhtemelen yalnızca kullanıcının deseni tamamlamama olasılığının düşük olduğu durumlarda uygundur. Örneğin, aşağıdaki alıntı recursive-ftp betiği olan rftp'den alınmıştır; burada kullanıcıdan mevcut dizini özyinelemeli olarak almak, koymak veya listelemek için ~g, ~p veya ~l girmesi istenir. Bunlar normal ftp komutlarından o kadar uzaktır ki, kullanıcının yanlışlıkla olmadığı sürece ~ işaretinden sonra başka bir şey yazması olası değildir; bu durumda da muhtemelen sonucu göz ardı edecektir.
interact { -echo ~g {getcurdirectory 1} -echo ~l {getcurdirectory 0} -echo ~p {putcurdirectory} }
-nobuffer bayrağı, karakterler okundukça aşağıdaki desenle eşleşen karakterleri çıktı sürecine gönderir.
Bu, bir programın deseni geri yankılamasına izin vermek istediğinizde yararlıdır. Örneğin, aşağıdakiler bir kişinin nereye aradığını izlemek için kullanılabilir (Hayes tarzı bir modem). "atd" her görüldüğünde betik satırın geri kalanını günlüğe kaydeder.
proc lognumber {} { interact -nobuffer -re "(.*)\r" return puts $log "[clock format [clock seconds]]: dialed $interact_out(1,string)" }
interact -nobuffer "atd" lognumber
interact sırasında, log_user'ın önceki kullanımı göz ardı edilir. Özellikle interact, kullanıcının körü körüne etkileşimde bulunmak istemediği varsayıldığından çıktısının günlüğe kaydedilmesini (standart çıktıya gönderilmesini) zorlayacaktır.
-o bayrağı, takip eden herhangi bir tuş-gövde çiftinin mevcut sürecin çıktısına uygulanmasına neden olur. Bu, örneğin bir telnet oturumu sırasında istenmeyen karakterler gönderen sunucularla uğraşırken yararlı olabilir.
Varsayılan olarak interact, kullanıcının Expect sürecinin kendisinin stdin'ine yazmasını ve stdout'unu okumasını bekler. -u (user/kullanıcı için) bayrağı, interact'in kullanıcıyı argümanı tarafından adlandırılan süreç (oluşturulmuş bir id olmalıdır) olarak aramasını sağlar.
Bu, iki ilgisiz sürecin açık bir döngü kullanılmadan bir araya getirilmesini sağlar. Hata ayıklamaya yardımcı olmak için Expect tanılamaları her zaman stderr'e gider (veya belirli günlük ve hata ayıklama bilgileri için stdout'a). Aynı nedenden dolayı, interpreter komutu stdin'den etkileşimli olarak okuma yapacaktır.
Örneğin, aşağıdaki fragment bir giriş süreci oluşturur. Sonra kullanıcıyı arar (gösterilmemiştir) ve son olarak ikisini birbirine bağlar. Elbette, login yerine herhangi bir süreç kullanılabilir. Bir kabuk, örneğin, kullanıcının hesap ve şifre sağlamadan çalışmasına izin verecektir.
spawn login set login $spawn_id spawn tip modem
dial back out to user
connect user to login
interact -u $login
To send output to multiple processes, list each spawn id list prefaced by a -output flag. Input for a group of output spawn ids may be determined by a spawn id list prefaced by a -input flag. (Both -input and -output may take lists in the same form as the -i flag in the expect command, except that any_spawn_id is not meaningful in interact.) All following flags and strings (or patterns) apply to this input until another -input flag appears. If no -input appears, -output implies "-input $user_spawn_id -output". (Similarly, with patterns that do not have -input.) If one
-input belirtilirse, $user_spawn_id değerini geçersiz kılar.: İkinci bir -input belirtilirse, $spawn_id değerini geçersiz kılar. Ek -input bayrakları belirtilebilir.
İma edilen iki girdi süreci, varsayılan olarak çıktılarını (ters sırada) $spawn_id ve $user_spawn_id olarak belirtir. Bir -input bayrağı -output bayrağı olmadan görünürse, o süreçten gelen karakterler atılır.
-i bayrağı, başka hiçbir -input veya
-output bayrağı kullanılmadığında mevcut spawn_id için bir alternatif sunar.: Bir -i bayrağı bir -o bayrağını ima eder.
Dolaylı spawn id'leri kullanarak etkileşimde bulunulan süreçleri değiştirmek mümkündür. (Dolaylı spawn id'leri expect komutuyla ilgili bölümde açıklanmıştır.) Dolaylı spawn id'leri -i, -u, -input veya -output bayraklarıyla belirtilebilir.
interpreter [args] kullanıcıdan etkileşimli olarak Expect ve Tcl komutları istenmesine neden olur. Her komutun sonucu yazdırılır.
break ve continue gibi eylemler, kontrol yapılarının (yani for, proc) alışılagelmiş şekilde davranmasına neden olur. Ancak return, interpreter'ın çağrıcısına dönmesine neden olurken, inter_return, interpreter'ın çağrıcısında bir return'e neden olmasına yol açar. Örneğin, "proc foo" interpreter'ı çağırdıysa ve o da inter_return eylemini yürüttüyse, proc foo geri döner. Diğer herhangi bir komut, interpreter'ın yeni komutlar istemeye devam etmesine neden olur.
Varsayılan olarak, istem (prompt) iki tamsayı içerir. Birinci tamsayı değerlendirme yığınının derinliğini açıklar (yani Tcl_Eval'in kaç kez çağrıldığını). İkinci tamsayı Tcl geçmiş (history) tanımlayıcısıdır. İstem, dönüş değeri bir sonraki istem haline gelen "prompt1" adında bir yordam tanımlayarak ayarlanabilir. Bir ifadenin açık tırnak işaretleri, parantezleri, süslü parantezleri veya köşeli parantezleri varsa, yeni satırda ikincil bir istem (varsayılan olarak "+> ") verilir. İkincil istem "prompt2" adında bir yordam tanımlanarak ayarlanabilir.
interpreter sırasında, çağırıcısı ham mod kullanıyor olsa bile pişirilmiş (cooked) mod kullanılır.
stdin kapatılırsa, -eof bayrağı kullanılmadığı sürece interpreter geri dönecektir; -eof bayrağı kullanıldığında ise takip eden argüman çağrılır.
log_file [args] [[-a] file] Bir dosya adı sağlanırsa, log_file oturumun bir dökümünü (o noktadan başlayarak) dosyaya kaydeder. Hiçbir argüman verilmezse log_file kaydetmeyi durduracaktır. Önceki tüm günlük dosyaları kapatılır.
Bir dosya adı yerine, -open veya
-leaveopen bayrakları kullanılarak bir Tcl dosya tanımlayıcısı sağlanabilir.: Bu, spawn komutuna benzer. (Daha fazla bilgi için spawn komutuna bakın.)
-a bayrağı, log_user komutu tarafından bastırılan çıktıların da günlüğe kaydedilmesini zorunlu kılar.
Varsayılan olarak log_file komutu, tek bir oturumda günlüğe kaydetmeyi birden çok kez kapatıp açabilme kolaylığı sağlamak için eski dosyaların üzerine yazmak (truncate etmek) yerine yenilerini ekler (append). Dosyaların üzerine yazmak için -noappend bayrağını kullanın.
-info bayrağı, log_file komutunun verilen en son bilgi dışı argümanların bir açıklamasını döndürmesini sağlar.
log_user -info|0|1 Varsayılan olarak, send/expect diyaloğu stdout'a (ve açıksa bir günlük dosyasına) kaydedilir. stdout'a günlüğe kaydetme "log_user 0" komutuyla 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 komunun verilen en son bilgi dışı argümanların bir açıklamasını döndürmesini sağlar.
match_max [-d] [-i spawn_id] [size] expect tarafından dahili olarak kullanılan arabelleğin boyutunu (bayt cinsinden) tanımlar. Boyut argümanı verilmezse mevcut boyut döndürülür.
-d bayrağı ile varsayılan boyut ayarlanır. (İlk varsayılan değer 2000'dir.) -i bayrağı ile boyut belirtilen spawn id için ayarlanır, aksi takdirde mevcut süreç için ayarlanır.
overlay [-# spawn_id] [-# spawn_id] [...] program [args] sonlanan mevcut Expect programının yerine program args yürütür. Yalın bir tire argümanı, komut adının önüne sanki bir oturum açma kabuğuymuş gibi bir tire getirilmesini zorunlu kılar. Argüman olarak adlandırılanlar dışındaki tüm spawn_id'ler kapatılır. Bunlar adlandırılan dosya tanımlayıcıları üzerine eşleştirilir.
Spawn_id'ler, yeni programın devralması için dosya tanımlayıcılarıyla eşleştirilir. Örneğin, aşağıdaki satır chess programını çalıştırır ve mevcut süreç tarafından (diyelim ki bir satranç ustası tarafından) kontrol edilmesini sağlar.
overlay -0 $spawn_id -1 $spawn_id -2 $spawn_id chess
Bu, "interact -u" komutundan daha verimlidir, ancak Expect süreci artık kontrol sahibi olmadığından programlanmış etkileşim yapma yeteneğini feda eder.
Hiçbir kontrol uçbiriminin sağlanmadığını unutmayın. Bu nedenle, standart girdinin bağlantısını keser veya yeniden eşleştirirseniz, iş kontrolü yapan programlar (kabuklar, oturum açma vb.) düzgün çalışmayacaktır.
parity [-d] [-i spawn_id] [value] oluşturulan süreçlerin çıktılarından eşlik bitinin (parity) korunup korunmayacağını veya çıkarılıp çıkarılmayacağını tanımlar. Değer sıfırsa eşlik çıkarılır, aksi takdirde çıkarılmaz. Değer argümanı verilmezse mevcut değer döndürülür.
-d bayrağı ile varsayılan eşlik değeri ayarlanır. (İlk varsayılan değer 1'dir, yani eşlik çıkarılmaz.) -i bayrağı ile eşlik değeri belirtilen spawn id için ayarlanır, aksi takdirde mevcut süreç için ayarlanır.
remove_nulls [-d] [-i spawn_id] [value] desen eşleştirmeden veya expect_out ya da interact_out değişkeninde saklamadan önce oluşturulan süreçlerin çıktılarından boş karakterlerin (nulls) korunup korunmayacağını veya kaldırılıp kaldırılmayacağını tanımlar. Değer 1 ise boş karakterler kaldırılır. Değer 0 ise boş karakterler kaldırılmaz. Değer argümanı verilmezse mevcut değer döndürülür.
-d bayrağı ile varsayılan değer ayarlanır. (İlk varsayılan değer 1'dir, yani boş karakterler kaldırılır.) -i bayrağı ile değer belirtilen spawn id için ayarlanır, aksi takdirde mevcut süreç için ayarlanır.
Boş karakterlerin kaldırılıp kaldırılmadığına bakılmaksızın, Expect boş baytları günlüğe ve stdout'a kaydedecektir.
send [-flags] string Mevcut sürece string dizisini gönderir. Örneğin, komut
send "hello world\r"
mektupları, h e l l o <boşluk> w o r l d <satırbaşı> mevcut sürece gönderir. (Tcl, rastgele karmaşık diziler oluşturabilen (format adı verilen) printf benzeri bir komut içerir.)
Satır arabellekli girdisi olan programlar satır başı karakteri gönderilene kadar karakterleri okumayacak olsa da karakterler hemen gönderilir. Bir satır başı karakteri "\r" ile belirtilir.
-- bayrağı, bir sonraki argümanın bir bayrak yerine bir karakter dizisi olarak yorumlanmasını zorunlu kılar. Herhangi bir karakter dizisinden önce, aslında bir bayrağa benzeyip benzemediğine bakılmaksızın "--" getirilebilir. Bu, yanlışlıkla bayraklara benzeyen değişken karakter dizilerini karıştırmadan 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ğı, karakter dizisinin belirtilen spawn_id'ye gönderileceğini bildirir. Eğer spawn_id user_spawn_id ise ve uçbirim ham moddaysa, karakter dizisindeki satır sonları satır başı-satır sonu dizilerine dönüştürülür, böylece uçbirim pişirilmiş moddaymış gibi görünürler. -raw bayrağı bu dönüşümü devre dışı bırakır.
-null bayrağı boş karakterler (0 baytı) gönderir. Varsayılan olarak bir boş karakter gönderilir. Kaç tane boş karakter gönderileceğini belirtmek için -null bayrağını bir tamsayı takip edebilir.
-break bayrağı bir kesme (break) durumu oluşturur. Bu yalnızca spawn id'si "spawn -open" aracılığıyla açılmış bir tty aygıtına atıfta bulunuyorsa anlamlıdır. tip gibi bir süreç oluşturduysanız, bir kesme oluşturmak için tip'in kendi kuralını kullanmalısınız.
-s bayrağı, çıktının "yavaşça" gönderilmesini zorunlu kılar, böylece bir bilgisayarın, aynı arabelleği asla aşamayacak bir insan için tasarlanmış bir girdi arabelleğini aşması şeklindeki yaygın durumun önüne geçilir. Bu çıktı, iki elemanlı bir liste alan "send_slow" değişkeninin değeri tarafından kontrol edilir. İlk eleman, atomik olarak gönderilecek bayt sayısını tanımlayan bir tamsayıdır. İkinci eleman, atomik gönderimlerin ayrılması gereken saniye sayısını tanımlayan bir reel sayıdır. Örneğin, "set send_slow {10 .001}" komutu, "send -s"in her 10 karakter gönderimi arasında 1 milisaniye olacak şekilde diziler göndermesini sağlayacaktır.
-h bayrağı, çıktının (bir dereceye kadar) gerçekten yazan bir insan gibi gönderilmesini zorunlu kılar. Karakterler arasında insan benzeri gecikmeler görünür. (Algoritma, bu özel uygulamaya uyacak şekilde yapılan değişikliklerle birlikte bir Weibull dağılımına dayanmaktadır.) Bu çıktı, beş elemanlı bir liste alan "send_human" değişkeninin değeri tarafından kontrol edilir. İlk iki eleman, karakterlerin saniye cinsinden ortalama varış süreleridir. Birincisi varsayılan olarak kullanılır. İkincisi, bu tür geçişlerde ara sıra meydana gelen ince duraklamaları simüle etmek için kelime sonlarında kullanılır. Üçüncü parametre, değişkenliğin bir ölçüsüdür; burada .1 oldukça değişken, 1 makul derecede değişken ve 10 oldukça sabittir. Uç değerler 0 ila sonsuzdur. Son iki parametre sırasıyla minimum ve maksimum varış süresidir. Minimum ve maksimum en son kullanılır ve nihai süreyi "kırpar" (clip). Minimum ve maksimum yeterince değeri kırparsa, nihai ortalama verilen ortalamadan oldukça farklı olabilir.
Bir örnek olarak, aşağıdaki komut hızlı ve tutarlı bir daktilo yazarını taklit eder:
set send_human {.1 .3 1 .05 2} send -h "I'm hungry. Let's do lunch."
aşağıdakiler ise akşamdan kalma bir durumdan sonra daha uygun olabilir:
set send_human {.4 .4 .2 .5 100} send -h "Goodd party lash night!"
Hataların simüle edilmediğini unutmayın, ancak bir send argümanına hatalar ve düzeltmeler ekleyerek hata düzeltme durumlarını kendiniz ayarlayabilirsiniz.
Boş karakter gönderme, kesme gönderme, yavaş çıktıyı zorlama ve insan tarzı çıktı bayrakları birbirini dışlar. Yalnızca en son belirtilen kullanılacaktır. Dahası, boş karakter veya kesme gönderme bayraklarıyla hiçbir karakter dizisi argümanı belirtilemez.
Bir sürece ilk send işleminden önce bir expect getirmek iyi bir fikirdir. expect sürecin başlamasını beklerken, send bekleyemez. Özellikle, ilk send işlemi süreç çalışmaya başlamadan önce tamamlanırsa, verilerinizin göz ardı edilmesi riskiyle karşı karşıya kalırsınız. Etkileşimli programların başlangıçta hiçbir istem sunmadığı durumlarda, send işleminden önce şu şekilde bir gecikme getirebilirsiniz:
Bilgisayar korsanlarına nasıl sızılacağına dair ipuçları vermemek için,
bu sistem harici bir parola istemi sunmaz.
exec'in tamamlanması için 5 saniye bekleyin
spawn telnet very.secure.gov sleep 5 send password\r
exp_send, send için bir takma addır. Expectk veya Tk ortamında Expect'in başka bir varyantını kullanıyorsanız, send tamamen farklı bir amaç için Tk tarafından tanımlanmıştır. exp_send, ortamlar arasındaki uyumluluk için sağlanmıştır. Expect'in diğer send komutları için de benzer takma adlar sağlanmıştır.
send_error [-flags] string send gibidir, ancak çıktının mevcut süreç yerine stderr'e gönderilmesi hariçtir.
send_log [--] string send gibidir, ancak karakter dizisinin yalnızca günlük dosyasına (bkz. log_file) gönderilmesi hariçtir. Hiçbir günlük dosyası açık değilse argümanlar göz ardı edilir.
send_tty [-flags] string send gibidir, ancak çıktının mevcut süreç yerine /dev/tty'ye gönderilmesi hariçtir.
send_user [-flags] string send gibidir, ancak çıktının mevcut süreç yerine stdout'a gönderilmesi hariçtir.
sleep seconds betiğin verilen saniye boyunca uyumasını sağlar. Saniye ondalıklı bir sayı olabilir. Expect uyurken kesmeler (ve Expectk kullanıyorsanız Tk olayları) işlenir.
spawn [args] program [args] program args çalıştıran yeni bir süreç oluşturur. stdin, stdout ve stderr çıktıları Expect'e bağlanır, böylece diğer Expect komutları tarafından okunup yazılabilirler. Bağlantı close ile veya sürecin kendisi dosya tanımlayıcılarından herhangi birini kapatırsa kopar.
Bir süreç spawn tarafından başlatıldığında, spawn_id değişkeni o sürece atıfta bulunan bir tanımlayıcıya ayarlanır. spawn_id tarafından tanımlanan süreç mevcut süreç olarak kabul edilir. spawn_id okunabilir veya yazılabilir, böylece etkili bir iş kontrolü sağlanır.
user_spawn_id, kullanıcıya atıfta bulunan bir tanımlayıcı içeren küresel bir değişkendir. Örneğin, spawn_id bu değere ayarlandığında, expect komutu expect_user gibi davranır.
error_spawn_id, standart hataya atıfta bulunan bir tanımlayıcı içeren küresel bir değişkendir. Örneğin, spawn_id bu değere ayarlandığında, send komutu send_error gibi davranır.
tty_spawn_id, /dev/tty'ye atıfta bulunan bir tanımlayıcı içeren küresel bir değişkendir. Eğer /dev/tty mevcut değilse (örneğin bir cron, at veya toplu iş (batch) betiğinde), tty_spawn_id tanımlanmaz. Bu şu şekilde test edilebilir:
if {[info vars tty_spawn_id]} {
/dev/tty mevcut
} else {
/dev/tty mevcut değil
muhtemelen cron, batch veya at betiğinde
}
spawn, UNIX süreç kimliğini (pid) döndürür. Hiçbir süreç oluşturulmazsa 0 döndürülür. spawn_out(replica,name) değişkeni pty replika aygıtının adına ayarlanır.
Varsayılan olarak spawn, komut adını ve argümanları yankılar. -noecho bayrağı spawn'ın bunu yapmasını engeller.
-console bayrağı, konsol çıktısının oluşturulan sürece yönlendirilmesine neden olur. Bu her sistemde desteklenmez.
Dahili olarak spawn, kullanıcının tty'si ile aynı şekilde başlatılmış bir pty kullanır. Bu, tüm ayarların (stty(1) uyarınca) "makul" (sane) olması için daha da başlatılır. Eğer stty_init değişkeni tanımlanmışsa, daha fazla yapılandırma olarak stty argümanları tarzında yorumlanır. Örneğin, "set stty_init raw" komutu, daha sonra oluşturulacak süreçlerin uçbirimlerinin ham modda başlamasına neden olacaktır. -nottycopy, kullanıcının tty'sine dayalı başlatmayı atlar. -nottyinit, "makul" (sane) başlatmayı atlar.
Normalde spawn'ın yürütülmesi çok az zaman alır. spawn'ın önemli miktarda zaman aldığını fark ederseniz, muhtemelen kilitlenmiş pty'lerle karşılaşıyordur. Hatalı süreçlerle karmaşayı önlemek için pty'ler üzerinde bir dizi test çalıştırılır. (Bunlar kilitlenmiş pty başına 10 saniye sürer.) Expect'i -d seçeneğiyle çalıştırmak, Expect'in garip durumlarda birçok pty ile karşılaşıp karşılaşmadığını gösterecektir. Bu pty'lerin bağlı olduğu süreçleri sonlandıramıyorsanız, tek çareniz yeniden başlatmak (reboot) olabilir.
program, exec(2) başarısız olduğu için (örneğin program mevcut olmadığında) başarıyla oluşturulamazsa, bir sonraki interact veya expect komutu tarafından sanki program çalışmış ve hata mesajını çıktı olarak üretmiş gibi bir hata mesajı döndürülecektir. Bu davranış, spawn uygulamasının doğal bir sonucudur. Dahilî olarak spawn çatallanır (fork), ardından oluşturulan sürecin spawn_id aracılığıyla iletişim kurmak dışında orijinal Expect süreciyle iletişim kurma yolu kalmaz.
-open flag causes the next argument to be interpreted as a Tcl file identifier (i.e., returned by open.) The spawn id can then be used as if it were a spawned process. (The file identifier should no longer be used.) This lets you treat raw devices, files, and pipelines as spawned processes without using a pty. 0 is returned to indicate there is no associated process. When the connection to the spawned process is closed, so is the Tcl file identifier. The -leaveopen flag is similar to -open except that -leaveopen causes the file identifier to be left open even after the spawn id is closed.
-pty flag causes a pty to be opened but no process spawned. 0 is returned to indicate there is no associated process. Spawn_id is set as usual.
The variable spawn_out(replica,fd) is set to a file identifier corresponding to the pty replica. It can be closed using "close -replica".
-ignore flag names a signal to be ignored in the spawned process. Otherwise, signals get the default behavior. Signals are named as in the trap command, except that each signal requires a separate flag.
strace level sonraki ifadelerin yürütülmeden önce yazdırılmasına neden olur. (Tcl'nin trace komutu değişkenleri izler.) level, çağrı yığınında ne kadar aşağıya kadar izleme yapılacağını belirtir. Örneğin, aşağıdaki komut ilk 4 çağrı düzeyini izleyerek Expect'i çalıştırır, ancak bunun altındakileri izlemez.
expect -c "strace 4" script.exp
-info bayrağı, strace komutunun verilen en son bilgi dışı argümanların bir açıklamasını döndürmesini sağlar.
stty args harici stty komutuna benzer şekilde uçbirim modlarını değiştirir.
Varsayılan olarak, kontrol uçbirimine erişilir. Diğer uçbirimlere komutun sonuna "< /dev/tty..." eklenerek erişilebilir. (Argümanların tek bir argümanda gruplandırılmaması gerektiğini unutmayın.)
Durum talepleri bunu komutun sonucu olarak döndürür. Hiçbir durum talep edilmezse ve kontrol uçbirimine erişilirse, raw ve echo niteliklerinin önceki durumu, daha sonra komut tarafından kullanılabilecek bir biçimde döndürülür.
Örneğin, raw veya -cooked argümanları uçbirimi ham moda alır. -raw veya cooked argümanları uçbirimi pişirilmiş moda alır. echo ve -echo argümanları uçbirimi sırasıyla yankı ve yankısız moda alır.
Aşağıdaki örnek, yankılamanın geçici olarak nasıl devre dışı bırakılacağını göstermektedir. Bu, otomatik betiklerde parolaların betiğe gömülmesini önlemek için kullanılabilir. (Bu konuda daha fazla tartışma için aşağıdaki EXPECT İPUÇLARI bölümüne bakın.)
stty -echo send_user "Password: " expect_user -re "(.*)\n" set password $expect_out(1,string) stty echo
system args args argümanını sanki bir uçbirimden komut olarak yazılmış gibi sh(1)'e girdi olarak verir. Expect, kabuk sonlanana kadar bekler. sh'tan dönen çıkış durumu, exec'in kendi çıkış durumunu ele aldığı şekilde ele alınır.
stdin ve stdout çıktılarını betiğe yönlendiren exec'in aksine, system hiçbir yönlendirme gerçekleştirmez (dizenin kendisi tarafından belirtilenler hariç). Bu nedenle, doğrudan /dev/tty ile konuşması gereken programları kullanmak mümkündür. Aynı nedenden dolayı, system sonuçları günlüğe kaydedilmez.
timestamp [args] bir zaman damgası döndürür. Hiçbir argüman verilmezse, epoch'tan bu yana geçen saniye sayısı döndürülür.
-format bayrağı, POSIX strftime kurallarına göre değiştirmeler yapılarak döndürülen bir karakter dizisi tanıtır. Örneğin %a, kısaltılmış bir gün adıyla (yani Sat) değiştirilir. Diğerleri şunlardır: %a kısaltılmış gün adı %A tam gün adı %b kısaltılmış ay adı %B tam ay adı %c şu biçimde tarih-saat: Wed Oct 6 11:45:56 1993 %d ayın 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 am veya pm %S saniye (00-61) %u gün (1-7, Pazartesi haftanın ilk günüdür) %U hafta (00-53, ilk Pazar birinci haftanın ilk günüdür) %V hafta (01-53, ISO 8601 tarzı) %w gün (0-6) %W hafta (00-53, ilk Pazartesi birinci haftanın ilk günüdür) %x şu biçimde tarih-saat: Wed Oct 6 1993 %X şu biçimde saat: 23:59:59 %y yıl (00-99) %Y şu biçimde yıl: 1993 %Z saat dilimi (belirlenemiyorsa hiçbir şey) %% yalın bir yüzde işareti
Diğer % tanımlamaları tanımsızdır. Diğer karakterler dokunulmadan geçirilecektir. Yalnızca C yereli (locale) desteklenir.
-seconds bayrağı, biçimlendirme için kaynak olarak kullanılacak epoch'tan bu yana geçen saniye sayısını tanıtır. Aksi takdirde, geçerli saat kullanılır.
-gmt bayrağı, zaman damgası çıktısının GMT saat dilimini kullanmasını zorunlu kılar. Bayrak kullanılmazsa yerel saat dilimi kullanılır.
trap [[command] signals] verilen sinyallerden herhangi birinin gelecekte alınması üzerine verilen komutun yürütülmesine neden olur. Komut küresel 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 döndürülür. signals, tek bir sinyal veya sinyal listesidir. Sinyaller, signal(3) uyarınca sayısal veya sembolik olarak belirtilebilir. "SIG" öneki atlanabilir.
Hiçbir argüman verilmezse (veya -number argümanı verilirse), trap şu anda yürütülmekte olan trap komutunun sinyal numarasını döndürür.
-code bayrağı, komutun başlangıçta çalışmaya başladığı sırada Tcl'nin döndürmek üzere olduğu kod yerine komutun çıkış kodunu kullanır.
-interp bayrağı, komutun yakalamanın (trap) bildirildiği zaman yerine komutun çalışmaya başladığı sırada etkin olan yorumlayıcı kullanılarak değerlendirilmesine neden olur.
-name bayrağı, trap komutunun şu anda yürütülmekte olan trap komutunun sinyal adını döndürmesini sağlar.
-max bayrağı, trap komutunun ayarlanabilen en büyük sinyal numarasını döndürmesini sağlar.
Örneğin, "trap {send_user "Ouch!"} SIGINT" komutu, kullanıcı ^C tuşuna her bastığında "Ouch!" yazdıracaktır.
Varsayılan olarak, (genellikle ^C tuşuna basılarak oluşturulabilen) SIGINT ve SIGTERM, Expect'in çıkmasına neden olur. Bunun nedeni, Expect başladığında varsayılan olarak oluşturulan aşağıdaki yakalamadır (trap).
trap exit {SIGINT SIGTERM}
Hata ayıklayıcıyı başlatmak için -D bayrağını kullanırsanız, SIGINT etkileşimli hata ayıklayıcıyı başlatacak şekilde yeniden tanımlanır. Bunun nedeni aşağıdaki yakalamadır:
trap {exp_debug 1} SIGINT
Hata ayıklayıcı yakalaması, EXPECT_DEBUG_INIT çevre değişkeni yeni bir trap komutuna ayarlanarak değiştirilebilir.
Elbette, betiğinize trap komutları ekleyerek bunların her ikisini de geçersiz kılabilirsiniz. Özellikle, kendi "trap exit SIGINT" komutunuz varsa, bu hata ayıklayıcı yakalamasını geçersiz kılacaktır. Bu, kullanıcıların hata ayıklayıcıya ulaşmasını tamamen engellemek istiyorsanız kullanışlıdır.
SIGINT üzerinde kendi yakalamanızı tanımlamak ancak hata ayıklayıcı çalışırken yine de hata ayıklayıcıyı yakalamak istiyorsanız şunu kullanın:
if {![exp_debug]} {trap mystuff SIGINT}
Alternatif olarak, başka bir sinyal kullanarak hata ayıklayıcıyı yakalayabilirsiniz.
Expect içinde dahili olarak kullanıldığından trap, SIGALRM eylemini geçersiz kılmanıza izin vermez. disconnect komutu SIGALRM sinyalini SIG_IGN (göz ardı et) olarak ayarlar. Sonraki spawn komutları sırasında devre dışı bıraktığınız sürece bunu yeniden etkinleştirebilirsiniz.
Daha fazla bilgi için signal(3) sayfasına bakın.
wait [args] oluşturulan bir süreç (veya adlandırılmamışsa mevcut süreç) sonlanana kadar geciktirir.
wait normalde dört tamsayıdan oluşan bir liste döndürür. İlk tamsayı, beklenen sürecin pid'sidir. İkinci tamsayı karşılık gelen spawn id'sidir. Bir işletim sistemi hatası oluşmuşsa üçüncü tamsayı -1, aksi takdirde 0'dır. Üçüncü tamsayı 0 ise, dördüncü tamsayı oluşturulan süreç tarafından döndürülen durumdur. Üçüncü tamsayı -1 ise, dördüncü tamsayı işletim sistemi tarafından ayarlanan errno değeridir. Küresel errorCode değişkeni de ayarlanır.
wait'ten dönen değerin sonunda ek elemanlar görünebilir. İsteğe bağlı bir beşinci eleman bir bilgi sınıfını tanımlar. Şu anda, bu eleman için tek olası değer CHILDKILLED'dir; bu durumda sonraki iki değer C tarzı sinyal adı ve kısa bir metinsel açıklamadır.
-i bayrağı, beklenecek sürecin (süreç kimliği DEĞİL) belirtilen spawn_id değerine karşılık geldiğini bildirir. Bir SIGCHLD işleyicisinin içinde, spawn id olarak -1 kullanılarak oluşturulan herhangi bir süreç beklenebilir.
-nowait bayrağı, wait'in başarılı bir bekleme belirtisiyle hemen dönmesine neden olur. Süreç (daha sonra) çıktığında, açık bir wait işlemine gerek kalmadan otomatik olarak kaybolacaktır.
wait komutu, "-i
-1" argümanları kullanılarak çatallanmış (fork edilmiş) bir süreci beklemek için de kullanılabilir.: Oluşturulan süreçlerle kullanımının aksine, bu komut herhangi bir zamanda yürütülebilir. Hangi sürecin toplanacağı (reaped) üzerinde hiçbir kontrol yoktur. Ancak, süreç kimliği için dönüş değeri kontrol edilebilir.
Kütüphaneler
Expect, Expect betikleri için iki yerleşik kütüphaneyi otomatik olarak tanır. Bunlar exp_library ve exp_exec_library değişkenlerinde adlandırılan dizinler tarafından tanımlanır. Her ikisi de diğer betikler tarafından kullanılabilecek yardımcı program dosyalarını içermek üzere 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ığı, /bin/cat aracınızın varsayılan olarak arabelleğe alıp almadığını açıklar.
Güzel Yazdırma (Pretty-Printing)
Expect betiklerini güzel yazdırmak için bir vgrind tanımı mevcuttur. Expect dağıtımıyla birlikte sağlanan vgrind tanımının doğru şekilde kurulduğunu varsayarsak, bunu şu şekilde kullanabilirsiniz:
vgrind -lexpect file
Örnekler
Kılavuz sayfasının açıkladığı her şeyi nasıl bir araya getireceğiniz açık görünmeyebilir.
Expect dağıtımının example dizinindeki örnekleri okumanızı ve denemenizi tavsiye ederim.
Bazıları gerçek programlardır. Diğerleri sadece belirli tekniklerin gösterimidir ve tabii
ki birkaçı da sadece hızlı pratik çözümlerdir (quick hacks). INSTALL dosyası bu programlara
hızlı bir genel bakış sunar.
Expect makaleleri de (bkz. AYRICA BAKINIZ) yararlıdır. Bazı makaleler Expect'in eski
sürümlerine karşılık gelen sözdizimini kullansa da, beraberindeki gerekçeler hala geçerlidir
ve bu kılavuz sayfasından çok daha fazla ayrıntıya girer.
Uyarılar (Caveats)
Uzantılar Expect'in komut adlarıyla çakışabilir. Örneğin send, Tk tarafından tamamen farklı bir amaç için tanımlanmıştır. Bu nedenle, Expect komutlarının çoğu "exp_XXXX" olarak da mevcuttur. "exp", "inter", "spawn" ve "timeout" ile başlayan komutların ve değişkenlerin takma adları yoktur. Ortamlar arasında bu uyumluluğa ihtiyacınız varsa genişletilmiş komut adlarını kullanın.
Expect kapsam belirlemeye (scoping) oldukça esnek bir bakış açısına sahiptir. Özellikle, Expect programına özgü komutlar tarafından okunan değişkenler önce yerel kapsamda aranacak ve bulunamazsa küresel kapsamda aranacaktır. Örneğin bu, expect kullanan yazdığınız her yordama "global timeout" koyma ihtiyacını ortadan kaldırır. Öte yandan, yazılan değişkenler her zaman yerel kapsamdadır (bir "global" komutu verilmediği sürece). Bunun neden olduğu en yaygın sorun, bir yordam içinde spawn yürütüldüğündedir. Yordamın dışında spawn_id artık mevcut değildir, bu nedenle oluşturulan sürece yalnızca kapsam belirleme nedeniyle artık erişilemez. Böyle bir yordama bir "global spawn_id" ekleyin.
Çoklu oluşturma (multispawning) özelliğini etkinleştiremezseniz (yani sisteminiz select (BSD .), poll (SVR>2) veya eşdeğer bir şeyi desteklemiyorsa), Expect aynı anda yalnızca tek bir süreci kontrol edebilecektir. Bu durumda, spawn_id'yi ayarlamaya çalışmayın ve oluşturulan bir süreç çalışırken exec aracılığıyla süreçleri yürütmeyin. Ayrıca, aynı anda birden fazla süreçten (kullanıcı dahil) expect yapamayacaksınız.
Uçbirim parametrelerinin betikler üzerinde büyük bir etkisi olabilir. Örneğin, bir betik yankılamayı (echoing) arayacak şekilde yazılmışsa, yankılama kapatıldığında yanlış davranacaktır. Bu nedenle Expect, varsayılan olarak makul (sane) uçbirim parametrelerini zorunlu kılar. Ne yazık ki bu, diğer programlar için işleri tatsız hale getirebilir. Bir örnek olarak emacs kabuğu "olağan" eşlemeleri değiştirmek ister: satır sonları satır başı satır sonları yerine satır sonlarına eşlenir ve yankılama devre dışı bırakılır. Bu, girdiyi düzenlemek için emacs kullanılmasına olanak tanır. Maalesef Expect bunu tahmin edemez.
Expect'in varsayılan uçbirim parametreleri ayarını geçersiz kılmamasını talep edebilirsiniz, ancak bu tür ortamlar için betik yazarken çok dikkatli olmalısınız. emacs durumunda, yankılama ve satır sonu eşlemeleri gibi şeylere bağlı olmaktan kaçının.
Süslü parantez içine alınmış tek bir liste halinde argümanları kabul eden komutlar (expect varyantları ve interact), listenin gerçekten tek bir argüman mı yoksa çok sayıda argüman mı olduğuna karar vermek için bir sezgisel yöntem (heuristic) kullanır. Sezgisel yöntem, yalnızca listenin gerçekten aralarında boşluk olmayan karakterler bulunan birden çok gömülü \n içeren tek bir argümanı temsil ettiği durumda başarısız olabilir. Bu yeterince olası görünmemektedir, ancak tek bir argümanın tek bir argüman olarak ele alınmasını zorunlu kılmak için "-nobrace" argümanı kullanılabilir. Bu, makine tarafından üretilen Expect kodlarıyla düşünülebilir. Benzer şekilde, -brace tek bir argümanın birden fazla desen/eylem olarak ele alınmasını zorunlu kılar.
Hatalar (Bugs)
Programı "sex" (ya "Smart EXec" ya da "Send-EXpect" için) olarak adlandırmak gerçekten çok cazipti, ancak sağduyu (veya belki de sadece Püritenlik) galip geldi.
Bazı sistemlerde, bir kabuk spawn edildiğinde, tty'ye erişememekten şikayet eder ancak yine de çalışır. Bu, sisteminizin Expect'in bilmediği, kontrol eden tty'yi elde etmek için bir mekanizmaya sahip olduğu anlamına gelir. Lütfen bunun ne olduğunu öğrenin ve bu bilgiyi bana geri gönderin.
Ultrix 4.1 (en azından buralardaki en son sürümleri), 1000000 üzerindeki zaman aşımlarını 0'a eşdeğer kabul eder.
Digital UNIX 4.0A (ve muhtemelen other versions) refuses to allocate ptys if you define a SIGCHLD handler. See grantpt page for more info.
IRIX 6.0 does not handle pty permissions correctly so that if Expect attempts to allocate a pty previously used by someone else, it fails. Upgrade to IRIX 6.1.
Telnet (yalnızca SunOS 4.1.2 altında doğrulanmıştır) TERM ayarlanmamışsa askıda kalır. Bu, TERM'i tanımlamayan cron, at ve cgi betikleri altında bir sorundur. Bu nedenle, bunu açıkça ayarlamalısınız - hangi tür olduğu genellikle önemsizdir. Sadece bir şeye ayarlanmış olması gerekir! Aşağıdakiler çoğu durum için muhtemelen yeterlidir.
set env(TERM) vt100
Tip (yalnızca BSDI BSD/OS 3.1 i386 altında doğrulanmıştır) SHELL ve HOME ayarlanmamışsa askıda kalır. Bu, bu çevre değişkenlerini tanımlamayan cron, at ve cgi betikleri altında bir sorundur. Bu nedenle, bunları açıkça ayarlamalısınız - hangi tür olduğu genellikle önemsizdir. Sadece bir şeye ayarlanmış olması gerekir! Aşağıdakiler çoğu durum için muhtemelen yeterlidir.
set env(SHELL) /bin/sh set env(HOME) /usr/local/bin
Pty'lerin bazı uygulamaları, süreç dosya tanımlayıcısını kapattıktan 10 ila 15 saniye sonra (gerçek sayı uygulamaya bağlıdır) çekirdeğin okunmamış tüm çıktıları atacağı şekilde tasarlanmıştır. Bu nedenle şu gibi Expect programları:
spawn date sleep 20 expect
başarısız olacaktır. Bunu önlemek için, etkileşimli olmayan programları spawn yerine exec ile çağırın. Bu tür durumlar düşünülebilse de, pratikte gerçekten etkileşimli bir programın nihai çıktısının bu davranış nedeniyle kaybolduğu bir durumla hiç karşılaşmadım.
Diğer yandan, Cray UNICOS pty'leri, süreç dosya tanımlayıcısını kapattıktan hemen sonra okunmamış çıktıları atar. Bunu Cray'e bildirdim ve bir düzeltme üzerinde çalışıyorlar.
Bazen bir uçbirim arayüzü UART ayarlarını değiştirirken veya durdurma/başlatma bitlerini arayarak baud hızlarını eşleştirirken olduğu gibi, bir istem ile yanıt arasında bir gecikme gerekir. Genellikle tek gereken bir veya iki saniye uyumaktır. Daha sağlam bir teknik, donanım girdi almaya hazır olana kadar yeniden denemektir. Aşağıdaki örnek her iki stratejiyi de kullanır:
send "speed 9600\r"; sleep 1 expect { timeout {send "\r"; exp_continue} $prompt }
trap -code, sleep gibi Tcl'nin olay döngüsünde (event loop) yer alan hiçbir komutla çalışmayacaktır. Sorun, olay döngüsünde Tcl'nin eşzamansız (async) olay işleyicilerinden gelen dönüş kodlarını atmasıdır. Geçici bir çözüm, trap kodunda bir bayrak ayarlamaktır. Ardından, komuttan (yani sleep'ten) hemen sonra bayrağı kontrol edin.
expect_background komutu -timeout argümanlarını göz ardı eder ve genel olarak zaman aşımı kavramına sahip değildir.
Expect İpuçları
Expect hakkında sezgisel olmayabilecek birkaç şey vardır. Bu bölüm, birkaç öneri ile bu şeylerden bazılarını ele almaya çalışmaktadır.
Yaygın bir expect sorunu, kabuk istemlerinin (shell prompts) nasıl tanınacağıdır. Bunlar farklı kişiler ve farklı kabuklar tarafından farklı şekilde özelleştirildiğinden, rlogin'i taşınabilir şekilde otomatikleştirmek istemi bilmeden zor olabilir. Makul bir kural, kullanıcıların istemlerini tanımlayan düzenli bir ifadeyi (özellikle sonunu) EXPECT_PROMPT çevre değişkeninde saklamasıdır. Aşağıdaki gibi bir kod kullanılabilir. EXPECT_PROMPT mevcut olmasa bile, kodun doğru çalışma şansı hala yüksektir.
set prompt "(%|#|\$) $" ;# varsayılan istem catch {set prompt $env(EXPECT_PROMPT)}
expect -re $prompt
Görmeyi beklediğiniz her şeyin sonunu içeren expect desenleri yazmanızı tavsiye ederim. Bu, tamamını görmeden bir soruyu yanıtlama olasılığını önler. Ek olarak, soruları tamamen görmeden önce yanıtlayabilseniz de, erken yanıt verirseniz yanıtınız sorunun ortasında yankılanmış gibi görünebilir. Başka bir deyişle, ortaya çıkan diyalog doğru olacaktır ancak karışık görünecektir.
Çoğu istemin sonunda bir boşluk karakteri bulunur. Örneğin ftp'den gelen istem 'f', 't', 'p', '>' ve <boşluk> şeklindedir. Bu istemle eşleşmek için bu karakterlerin her birini hesaba katmalısınız. Boşluğu dahil etmemek yaygın bir hatadır. Boşluğu açıkça koyun.
X* biçiminde bir desen kullanırsanız, * karakteri X'in sonundan alınan son şeye kadar alınan tüm çıktıyla eşleşecektir. Bu sezgisel kulağa hoş gelir ancak biraz kafa karıştırıcı olabilir çünkü "alınan son şey" ifadesi bilgisayarın hızına ve G/Ç'nin hem çekirdek hem de aygıt sürücüsü tarafından işlenmesine bağlı olarak değişebilir.
Özellikle insanlar, gerçekte çoğu program çıktıları her seferinde bir satır ürettiğinde, program çıktısının devasa bloklar halinde (atomik olarak) geldiğini görme eğilimindedir. Durumun böyle olduğunu varsayarsak, önceki paragrafın desenindeki * yalnızca mevcut satırın sonuyla eşleşebilir, çünkü eşleşme sırasında alınan tüm çıktı buydu.
deseniniz bunu özel olarak hesaba katmadığı sürece expect daha fazla çıktının geleceğini bilmesinin hiçbir yolu yoktur.
Satır yönelimli arabelleğe almaya güvenmek bile akıllıca değildir. Programlar nadiren yaptıkları arabelleğe alma türü hakkında söz vermekle kalmaz, aynı zamanda sistem hazımsızlığı çıktı satırlarını parçalayabilir, böylece satırlar görünüşte rastgele yerlerde kırılabilir. Uçbirim arayüzü UART ayarlarını değiştirirken veya baud hızlarını eşleştirirken olduğu gibi, bir istem ile yanıt arasında bir gecikme gerekir.
Bir programın son çıktısında bir desen bekliyorsanız ve program bunun yerine başka bir şey yayarsa, bunu timeout anahtar kelimesiyle algılayamazsınız. Bunun nedeni expect'in zaman aşımına uğramaması, bunun yerine bir eof belirtisi almasıdır. Bunun yerine bunu kullanın. Daha da iyisi, her ikisini de kullanın. Bu şekilde, o satır başka bir yere taşınırsa satırın kendisini düzenlemek zorunda kalmazsınız.
Satır sonları genellikle uçbirim sürücüsü tarafından çıktı verildiğinde satır başı, satır besleme (linefeed) dizilerine dönüştürülür. Bu nedenle, örneğin printf("foo\nbar")'dan gelen iki satırla açıkça eşleşen bir desen istiyorsanız, "foo\r\nbar" desenini kullanmalısınız.
Kullanıcıdan expect_user aracılığıyla okuma yaparken de benzer bir dönüşüm gerçekleşir. Bu durumda, return tuşuna bastığınızda bu bir satır sonuna dönüştürülecektir. Eğer Expect daha sonra bunu uçbirimini ham moda ayarlayan bir programa (telnet gibi) geçirirse, program gerçek bir satır başı beklediğinden bir sorun olacaktır. (Bazı programlar satır sonlarını otomatik olarak satır başlarına dönüştürerek affedicidir, ancak çoğu değildir.) Maalesef, bir programın uçbirimini ham moda aldığını öğrenmenin hiçbir yolu yoktur.
Satır sonlarını manuel olarak satır başlarıyla değiştirmek yerine çözüm, dönüşümü durduracak olan "stty raw" komutunu kullanmaktır. Ancak bunun, pişirilmiş satır düzenleme özelliklerini artık alamayacağınız anlamına geldiğini unutmayın.
interact örtük olarak uçbiriminizi ham moda ayarlar, bu nedenle bu sorun o zaman ortaya çıkmaz.
Expect betiklerinde parolaları (veya diğer özel bilgileri) saklamak genellikle yararlıdır. Bilgisayarda saklanan her şeye herkes tarafından erişilebileceğinden bu önerilmez. Bu nedenle, parolaları betiğe kelimesi kelimesine gömmek yerine etkileşimli olarak bir betikten istemek daha akıllıca bir fikirdir. Yine de, bazen bu tür bir gömme tek olasılıktır.
Ne yazık ki, UNIX dosya sisteminin yürütülebilir ancak okunamayan betikler oluşturmanın doğrudan bir yolu yoktur. setgid kabuk betiklerini destekleyen sistemler bunu dolaylı olarak şu şekilde simüle edebilir:
Expect betiğini (gizli verileri içeren) her zamanki gibi oluşturun. İzinlerini 750 (-rwxr-x---) yapın ve güvenilir bir gruba, yani onu okumasına izin verilen bir gruba ait olmasını sağlayın. Gerekirse bu amaçla yeni bir grup oluşturun. Ardından, öncekiyle aynı gruba ait, izinleri 2751 (-rwxr-s--x) olan bir /bin/sh betiği 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.
Ayrıca Bakınız
Tcl(3), libexpect(3) "Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs" yazan Don Libes, sf. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995. "expect: Curing Those Uncontrollable Fits of Interactivity" yazan Don Libes, Proceedings of the Summer 1990 USENIX Conference, Anaheim, California, June 11-15, 1990. "Using expect to Automate System Administration Tasks" yazan Don Libes, Proceedings of the 1990 USENIX Large Installation Systems Administration Conference, Colorado Springs, Colorado, October 17-19, 1990. "Tcl: An Embeddable Command Language" yazan John Ousterhout, Proceedings of the Winter 1990 USENIX Conference, Washington, D.C., January 22-26, 1990. "expect: Scripts for Controlling Interactive Programs" yazan Don Libes, Computing Systems, Vol. 4, No. 2, University of California Press Journals, November 1991. "Regression Testing and Conformance Testing Interactive Programs", yazan Don Libes, Proceedings of the Summer 1992 USENIX Conference, pp. 135-144, San Antonio, TX, June 12-15, 1992. "Kibitz - Connecting Multiple Interactive Programs Together", yazan Don Libes, Software - Practice & Experience, John Wiley & Sons, West Sussex, England, Vol. 23, No. 5, May, 1993. "A Debugger for Tcl Applications", yazan Don Libes, Proceedings of the 1993 Tcl/Tk Workshop, Berkeley, CA, June 10-11, 1993.
Yazar
Don Libes, National Institute of Standards and Technology
Teşekkür
Tcl için John Ousterhout'a ve ilham için Scott Paisley'e teşekkürler. Expect'in otomatik yapılandırma kodu için Rob Savoye'a teşekkürler.
HISTORY dosyası expect'in gelişiminin çoğunu belgelemektedir. İlginç bir okumadır ve size bu yazılım hakkında daha fazla bilgi verebilir. Bana hata düzeltmeleri gönderen ve diğer yardımlarda bulunan orada adı geçen kişilere teşekkürler.
Expect'in tasarımı ve uygulaması kısmen U.S. government tarafından ödenmiştir ve bu nedenle kamu malıdır (public domain). Ancak yazar ve NIST, bu program ve belgeler veya bunların bir kısmı kullanılırsa itibar edilmesini (credit verilmesini) ister.
29 December 1994 EXPECT(1)