فرمان لینوکس / یونیکس انتظار دارد

انتظار می رود یک برنامه است که به برنامه های تعاملی دیگر با توجه به یک اسکریپت صحبت می کند. پس از اسکریپت، Expect می داند که از یک برنامه انتظار می رود و چه پاسخ صحیح باید باشد. یک زبان تفسیری، ساختارهای کنترل و انعطاف پذیری بالا را برای هدایت گفتگو فراهم می کند. علاوه بر این، کاربر می تواند در صورت لزوم کنترل را کنترل کند و به طور مستقیم با آن ارتباط برقرار کند، پس از آن کنترل را به اسکریپت بازگرداند.

Expectk ترکیبی از Expect و Tk است. این رفتار درست مثل انتظار Expect و Tk است. انتظار می رود همچنین می تواند به طور مستقیم در C یا C ++ بدون Tcl استفاده شود.

نام "Expect" از ایده ارسال / انتظار توالی محبوب شده توسط uucp، kermit و دیگر برنامه های کنترل مودم می آید. با این حال بر خلاف uucp، Expect تعریف شده است به طوری که می توان آن را به عنوان یک فرمان سطح کاربر با هر برنامه و کار در ذهن اجرا کرد. انتظار می توان همزمان با چندین برنامه صحبت کرد.

چه انتظار می تواند انجام دهد

به عنوان مثال، در اینجا برخی از مواردی که فرمان انتظار می تواند انجام دهد:

دلایل مختلفی وجود دارد که چرا پوسته نمی تواند این وظایف را انجام دهد. همه با Expect امکان پذیر هستند

به طور کلی، انتظار می رود برای اجرای هر برنامه ای که نیاز به تعامل بین برنامه و کاربر دارد مفید باشد. همه چیز لازم است که تعامل را می توان برنامه ریزی کرد. انتظار می رود همچنین می تواند کنترل کاربر را بدون توقف برنامه کنترل شود. به طور مشابه، کاربر می تواند در هر زمان کنترل را به اسکریپت بازگرداند.

استفاده

انتظار می رود cmdfile را برای لیستی از دستورات اجرا کند. انتظار می رود ممکن است به صورت ضمنی در سیستم هایی که از # علامت گذاری به عنوان اسکریپت به عنوان اجرایی و ساخت خط اول در اسکریپت:

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

البته، مسیر باید با دقت توصیف کند که در آن انتظارات زندگی است. / usr / local / bin فقط یک مثال است.

پرچم -c قبل از هر دستور در یک اسکریپت دستور را اجرا می کند. فرمان باید برای جلوگیری از شکسته شدن پوسته نقل شود. این گزینه ممکن است چند بار استفاده شود دستورالعمل های چندگانه ممکن است با یک تک -c اجرا شوند، با جدا کردن آنها با semicolons. دستورات به ترتیب آنها ظاهر می شوند. هنگام استفاده از Expectk، این گزینه به عنوان -command مشخص شده است.

پرچم -d برخی از خروجی های تشخیصی را فراهم می کند که در ابتدا فعالیت داخلی دستورات مانند انتظار و تعامل را گزارش می کند. این پرچم همانند "exp_internal 1" در آغاز یک اسکریپت Expect است، به علاوه نسخه Expect چاپ شده است.

پرچم -D یک اشکال زدایی تعاملی را فراهم می کند. مقدار عدد صحیح باید دنبال شود. اشکال زدا قبل از روش بعدی Tcl کنترل می شود اگر مقدار غیر صفر باشد یا اگر A ^ C فشار داده شود یا یک نقطه توقف رخ داده باشد، یا دیگر دستور debugger مناسب در اسکریپت نمایش داده می شود. هنگام استفاده از Expectk، این گزینه به عنوان - Debug مشخص شده است.

پرچم -f یک پرونده از پیش تعیین شده برای خواندن دستورات را فراهم می کند. پرچم خود اختیاری است زیرا فقط در هنگام استفاده از #! نماد، به طوری که دیگر استدلال ممکن است در خط فرمان ارائه شده است. هنگام استفاده از Expectk، این گزینه به عنوان -file مشخص شده است.

به طور پیش فرض، فایل فرمان به حافظه خوانده می شود و به طور کامل اجرا می شود. گاهی اوقات مطلوب است که فایل ها یک خط را در یک زمان بخوانند. به منظور اجبار کردن فایل های دلخواه به این روش، از پرچم -b استفاده کنید. هنگام استفاده از Expectk، این گزینه به عنوان bufer مشخص شده است.

اگر رشته "-" به عنوان نام فایل ارائه شده باشد، به جای آن خواندن استاندارد انجام می شود. از "./-" برای خواندن از یک فایل به طور واقعی به نام "-" استفاده کنید.

پرچم -i انتظار می رود به جای تعویض برای دستورات به جای خواندن آنها از یک فایل، دستورات را فراخوانی کند. اعلان از طریق فرمان خروج یا EOF خاتمه می یابد. پرچم -i فرض است اگر نه یک فایل فرمان یا نه -c استفاده می شود. هنگام استفاده از Expectk این گزینه به عنوان Interactive تعریف شده است.

- ممکن است برای محدود کردن پایان گزینه ها استفاده شود. این امر مفید است اگر شما می خواهید یک آرگومان مانند گزینه مانند اسکریپت خود را بدون آن که توسط Expect تفسیر شود منتقل کنید. این می تواند مفید باشد در #! خط برای جلوگیری از هر تفسیر پرچم توسط انتظار. به عنوان مثال، زیر استدلال اصلی را از جمله نام اسکریپت در متغیر argv را ترک می کند.

#! / usr / local / bin / expect -

توجه داشته باشید که هنگام اضافه کردن استدلال به #! باید از conventions of getopt (3) و execve (2) معمول استفاده شود. خط

فایل $ exp_library / expect.rc به طور خودکار در صورت وجود، مگر اینکه پرچم -N استفاده شود. (هنگام استفاده از Expectk، این گزینه به عنوان -NORC مشخص شده است.) بلافاصله پس از این، فایل ~ / .expect.rc به طور خودکار منبع می شود، مگر اینکه از پرچم -n استفاده شود. اگر متغیر محیطی DOTDIR تعریف شده باشد، آن را به عنوان دایرکتوری پردازش می کند و .expect.rc از آنجا خوانده می شود. هنگام استفاده از Expectk، این گزینه به عنوان -norc مشخص شده است. این منابع تنها پس از اجرای هر پرچم -c رخ می دهد.

-v باعث می شود شماره نسخه آن را چاپ و خارج شود. پرچم مربوطه در Expectk، که از نامهای طولانی پرچم استفاده می کند، -version است.

args اختیاری به یک لیست ساخته شده و در متغیری با نام argv و. argc به طول argv مقداردهی شده است.

Argv0 به عنوان اسکریپت یا باینری تعریف شده است اگر هیچ اسکریپتی استفاده نشود. به عنوان مثال، زیر نام اسکریپت و سه استدلال اول را چاپ می کند.

send_user "$ argv0 [lrange $ argv 0 2] \ n"

دستورات

انتظار می رود از زبان فرمان ابزار استفاده کند. Tcl کنترل جریان (اگر، برای، شکستن) فراهم می کند، ارزیابی بیان و چندین ویژگی دیگر، از جمله تعریف روش recursionand procedure. دستورات استفاده شده در اینجا اما تعریف نشده (set، if، exec) دستورات Tcl هستند. Expect پشتیبانی از دستورات اضافی. به غیر از موارد دیگر تعیین شده، دستورات رشته خالی را باز می گرداند.

دستورات به ترتیب حروف الفبا لیست می شوند تا بتوانند به سرعت در آنها قرار بگیرند. با این حال، کاربران جدید ممکن است با خواندن توصیفهای ریزه کاری، ارسال، انتظار، و ارتباط برقرار کردن در آن سفارش شروع به خواندن آن کنند.

close [-slave] [-onexec 0 | 1] [-i spawn_id]

اتصال را به روند فعلی بستگی دارد . اکثر برنامه های تعاملی EOF را بر روی صفحه نمایش و خروجی خود شناسایی می کنند. بنابراین معمولا نزدیک است کافی برای کشتن روند نیز هست. پرچم -i فرآیند را برای بستن مربوط به نام spawn_id اعلام می کند.

هر دو انتظار می رود و در تعامل هستند هنگامی که فرایند فعلی خارج می شود و به طور ضمنی نزدیک می شود تشخیص می دهد، اما اگر شما فرایند را بکشید، مثلا "exec kill $ pid"، باید به صراحت با نزدیک تماس بگیرید .

پرچم -onexec تعیین می کند که آیا idwn id در هر فرآیند تولید شده جدید بسته شده یا در صورت فرایند پوشیده شده است. برای خروج از id شناسه باز، از مقدار 0. استفاده کنید. مقدار عدد صحیح غیر صفر باعث بسته شدن هرکدام در هر فرایند جدید می شود.

پرچم slave برده ای را که با id شناسایی شده است، بسته می کند. هنگامی که اتصال بسته است، برده به طور خودکار بسته می شود و اگر هنوز باز است.

مهم نیست که اتصال بسته به صورت ضمنی یا صریح بسته باشد، باید صبر کنید تا صلوات پردازشی مربوطه را پاک کنید. فرمان نزدیک صبر نمیکند چون هیچ تضمینی وجود ندارد که بسته شدن یک اتصال فرآیند باعث خروج آن شود.

اشکال زدایی [[-now] 0 | 1]

یک اشکال زدایی Tcl را کنترل می کند که به شما اجازه می دهد تا از طریق اظهارات گام بردارید و نقطه توقف را تنظیم کنید.

بدون استدلال، اگر یک اشکال زدایی اجرا نشد، 1 بازگردانده می شود، در غیر اینصورت 0 بازگشت می شود.

با یک استدلال، اشکال زدگی آغاز می شود. با یک آرگومان 0، اشکال زدایی متوقف می شود. اگر یک آرگومان توسط پرچم جدید به پیش برده شود، دیباگر بلافاصله شروع می شود. در غیر این صورت، اشکال زدایی با دستور Tcl بعدی شروع می شود.

فرمان debug هیچ تله ای را تغییر نمی دهد. این را با آغاز امید با پرچم -D مقایسه کنید.

دستور قطع اتصال فرایند خراب را از ترمینال قطع می کند . در حال اجرا در پس زمینه ادامه دارد. این فرایند به گروه فرآیند خود داده می شود. استاندارد I / O به / dev / null هدایت می شود .

قطعه زیر از قطع اتصال برای ادامه اجرای اسکریپت در پسزمینه استفاده می کند.

اگر {[fork]! = 0} قطع شود. . .

اسکریپت زیر یک رمز عبور را می خواند و هر ساعت یک برنامه را اجرا می کند که هر بار اجرا می شود. اسکریپت رمز عبور را فراهم می کند به طوری که شما فقط باید آن را یک بار تایپ کنید.

send_user "password؟ \" expect_user -re "(. *) \ n" برای {} 1 {} {if {[fork]! = 0} {sleep 3600؛ continue} disconnect spawn en_prog expect Password: send "$ expect_out 1، رشته) \ r ". . . خروج}

مزیت استفاده از قطع اتصال از طریق فرایند فرآیند پوسته غیرفعال (&) این است که انتظار می تواند پارامترهای ترمینال را قبل از قطع کردن ذخیره کند و سپس آنها را به ptys جدید اعمال کند. با &، انتظار می رود شانس خواندن پارامترهای ترمینال را ندارد از آنجا که ترمینال در حال حاضر توسط زمان انتظار منتظر کنترل قطع شده است.

خروج [-opts] [وضعیت]

باعث می شود که خروج و یا در غیر این صورت برای انجام این کار آماده شود.

پرچم -onexit سبب می شود که آرگومان بعدی بعنوان یک handler خروجی مورد استفاده قرار گیرد. بدون یک استدلال، پردازنده خروجی فعلی بازگشته است.

پرچم non-exits باعث می شود انتظار برای آماده شدن برای خروج فراهم شود اما از کنترل بازگشت به سیستم عامل مستثنا نیست. Handler خروجی تعریف شده توسط کاربر اجرا می شود و همچنین Handlers داخلی خود Expect است. دستور Expect دیگر باید اجرا شود. این کار مفید است اگر شما در حال اجرا Expect با دیگر برنامه های افزودنی Tcl هستید. مترجم کنونی (و پنجره اصلی اگر در محیط Tk باقی بماند تا دیگر برنامه های افزودنی Tcl بتوانند پاک شوند. اگر خروج Expect دوباره فراخوانی شود (با این وجود ممکن است رخ دهد)، پردازنده ها مجددا مجددا اجرا نمی شوند.

پس از خروج، تمام ارتباطات با فرآیندهای تولید شده بستگی دارد. بسته شدن فرآیندهای تخمینی به عنوان EOF شناسایی خواهد شد. خروج از اقدامات عادی _exit (2) فراتر نمی رود. بنابراین فرایندهای تولید شده که برای EOF بررسی نمی شود، ممکن است ادامه یابد. (برای مثال تعیین شرایط مختلف برای تعیین اینکه چه چیزی نشان دهنده فرایند تولید شده است مهم است، اما این وابستگی به سیستم است، معمولا تحت خروج (3) مستند می شود.) فرآیندهای ناپدری که به اجرا ادامه می دهند، توسط init به ارث برده می شوند.

وضعیت (یا 0 اگر مشخص نشده است) به عنوان وضعیت خروج از انتظار منتظر بازگشت . خروج به صورت بی نهایت اجرا می شود اگر پایان اسکریپت رسیده باشد.

exp_continue [-continue_timer]
فرمان exp_continue اجازه می دهد تا خود را به عنوان اجرای معمول به جای بازگشت به حالت عادی ادامه دهد. به طور پیش فرض exp_continue زمانبندی تایمر را بازنشانی می کند. پرچم -continue_timer مانع از راه اندازی مجدد تایمر می شود. (برای کسب اطلاعات بیشتر انتظار می رود .)

exp_internal [-f file] ارزش
باعث می شود دستورات بیشتر برای ارسال اطلاعات تشخیصی داخلی به انتظار برای stderr اگر مقدار غیر صفر است. این خروجی غیر فعال است اگر مقدار 0. اطلاعات تشخیصی شامل هر شخصیت دریافت شده و هر تلاش برای مطابقت با خروجی فعلی در برابر الگوهای.

اگر فایل اختیاری عرضه شده باشد، تمام خروجی عادی و اشکال زدایی به آن فایل (بدون در نظر گرفتن مقدار ارزش ) نوشته می شود. هر فایل خروجی تشخیصی قبلی بسته است.

پرچم -info باعث می شود exp_internal برای توصیف جدیدترین استدلال های غیرمستقیم داده شده ارائه شود.

exp_open [args] [-i spawn_id]
یک شناسه پرونده Tcl را که مربوط به شناسه اصلی پیدایش است را نشان می دهد. شناسه فایل سپس می تواند مورد استفاده قرار گیرد به عنوان اگر آن را با دستور باز Tcl باز شد. (شناسه اشکال دیگر نباید استفاده شود. منتظر نباشید.

پرچم Leaveopen ID را برای دسترسی از طریق فرمان Expect باز می کند. صبر باید بر روی شناسه اشک آور اجرا شود.

exp_pid [-i spawn_id]
شناسه پردازش مربوط به فرایند در حال حاضر تولید می شود. اگر flag -i مورد استفاده قرار گیرد، pid باز می شود مربوط به id شناسه داده شده است.

exp_send
نام مستعار برای ارسال است .

exp_send_error
نام مستعار برای send_error است

exp_send_log
نام مستعار برای send_log است .

exp_send_tty
نام مستعار برای send_tty است

exp_send_user
نام مستعار برای send_user است .

exp_version [[-exit] نسخه]
برای اطمینان از اینکه اسکریپت با نسخه فعلی Expect سازگار است مفید است.

بدون استدلال، نسخه فعلی Expect بازگشت می شود. این نسخه ممکن است در اسکریپت شما رمزگذاری شود. اگر شما واقعا می دانید که از ویژگی های نسخه های اخیر استفاده نمی کنید، می توانید یک نسخه قبلی را مشخص کنید.

نسخه ها شامل سه عدد از نقطه های جدا شده اند. اول شماره اصلی است. اسکریپت هایی که برای نسخه های Expect نوشته شده اند با شماره های مختلف متفاوت خواهد بود تقریبا قطعا کار نخواهد کرد. exp_version اگر تعداد اعداد مطابقت نداشته باشد، یک خطا را برمی گرداند.

دوم تعداد کمی است. اسکریپت هایی که برای یک نسخه با تعداد کمی جزئی تر از نسخه فعلی نوشته شده است ممکن است به برخی ویژگی های جدید بستگی داشته باشد و ممکن است اجرا نشود. exp_version یک خطا را بازمی گرداند اگر شماره های اصلی مطابقت داشته باشد، اما تعداد جزئی جزئی اسکریپت بیشتر از حد انتظار در حال اجرا است.

سوم عدد است که هیچ مقایسه ای در نسخه ندارد. با این حال، زمانی که توزیع نرم افزار Expect به هیچ وجه تغییری نکرده است، از قبیل مستندات اضافی یا بهینه سازی، افزایش می یابد. این نسخه به 0 بر اساس هر نسخه جدید جزئی تنظیم شده است.

با استفاده از پرچم خروج ، Expect یک خطا را چاپ می کند و اگر نسخه از تاریخ گذشته باشد، خروجی می کند.

انتظار [[-opts] pat1 body1] ... [-opts] patn [bodyn]
منتظر می ماند تا زمانی که یکی از الگوهای مطابق با خروجی یک فرآیند تولید شده، یک دوره مشخص شده گذشت یا پایان فایل دیده می شود. اگر بدن نهایی خالی باشد، ممکن است حذف شود.

الگوها از آخرین دستور expects_before بطور ضمنی قبل از هر الگو دیگری استفاده می شوند. الگوها از جدیدترین فرمان hop_after بطور ضمنی پس از هر الگو دیگری استفاده می شوند.

اگر استدلال به کل توضیح انتظار می رود بیش از یک خط، تمام استدلال ممکن است "به" به یک، به منظور جلوگیری از پایان دادن به هر خط با یک بکسلشیل. در این مورد، جایگزینی Tcl معمولی با وجود اتصالات وجود دارد.

اگر یک الگوی کلید واژه ایف است ، بدن مربوطه پس از پایان فایل اجرا می شود. اگر یک الگوریتم زمان کلمه کلیدی است، بدن مربوطه بر اساس زمان وقفه اجرا می شود. اگر کلمه کلیدی timeout استفاده نشود، یک عمل null ضمنی بر پایه زمان اجرا اجرا می شود. مدت زمان وقفه پیش فرض 10 ثانیه است، اما ممکن است به عنوان مثال به 30 تنظیم شده با دستور "set timeout 30" تنظیم شود. یک وقفه بی نهایت ممکن است با مقدار -1 تعیین شود. اگر الگوی پیشفرض کلیدواژه باشد، بدن مربوطه بر اساس زمان یا انتهای فایل اجرا می شود.

اگر یک الگو مطابقت داشته باشد، بدن متناظر اجرا می شود. انتظار می رود نتیجه بدن (و یا رشته خالی اگر الگوی همسان باشد) نتیجه می گیرد. در صورتی که الگوی چندگانه مطابقت داشته باشد، یکی که ظاهر می شود برای استفاده از بدن انتخاب می شود.

هر بار خروجی جدید وارد می شود، با هر الگو در ترتیب فهرست آنها مقایسه می شود. بنابراین، شما می توانید برای عدم وجود یک مسابقه با ایجاد آخرین الگوی چیزی تضمین شده به نظر می رسد، مانند یک فوری تست کنید. در شرایطی که سریعا وجود نداشته باشد، شما باید از زمان استفاده استفاده کنید (درست مثل اینکه در صورت تعامل با دست).

الگوها در سه راه مشخص شده اند. به طور پیش فرض، الگوهای به عنوان با دستور string match string مشخص شده اند. (چنین الگوهایی نیز شبیه عبارات منظم C-shell معمولا به عنوان الگوهای glob شناخته می شوند). ممکن است پرچم ggl برای حفاظت از الگوها استفاده شود که ممکن است در صورت لزوم از پرچم های انتظار استفاده کند. هر الگوی که با "-" آغاز می شود باید از این طریق محافظت شود. (تمام رشته ها با شروع با "-" برای گزینه های آینده محفوظ می باشند.)

به عنوان مثال، قطعه زیر به دنبال یک ورود موفق می باشد. (توجه داشته باشید که سقط جنین به عنوان یک فرایند تعریف شده در جای دیگر اسکریپت فرض شده است.)

انتظار {busy {مشغول به کار است \ n؛ exp_continue} شکست خورده "رمز عبور نامعتبر" را قطع کرده است.

نقل قول در الگوی چهارم ضروری است، زیرا حاوی یک فضای است که در غیر این صورت الگوی از عمل را جدا می کند. الگوها با عمل مشابه (مانند 3 و 4) نیاز به فهرست کردن اقدامات مجدد دارند. این می تواند با استفاده از الگوهای سبک regexp اجتناب شود (نگاه کنید به زیر). اطلاعات بیشتر در مورد الگوهای شکل گیری glob-style در کتابچه راهنمای Tcl یافت می شود.

الگوهای سبک Regexp به دنبال نحو تعریف شده توسط regexp Tcl (کوتاه برای "بیان منظم") است. الگوهای regexp با پرچم -re معرفی می شوند . مثال قبلی را می توان با استفاده از regexp بازنویسی کرد:

انتظار {busy {مشغول به کار است \ n؛ exp_continue} -re "شکست خورده است؛ گذرواژه نامعتبر" قطع زمان وقفه قطع ارتباط متصل است}

هر دو نوع الگوهای غیرقابل تصوری هستند. این به این معنی است که الگوهای لازم نیست که تمام رشته را مطابقت دهند، اما میتواند در هر سطر رشته (هر زمان که همه چیز مطابقت دارد) شروع و پایان یابد. با استفاده از ^ برای مطابقت با آغاز یک رشته، و $ برای مطابقت با پایان. توجه داشته باشید که اگر شما برای پایان دادن به یک رشته صبر نکنید، پاسخ های شما به راحتی می تواند در وسط رشته به پایان برسد، همانطور که از فرآیند تولید شده است. در حالی که هنوز تولید نتایج صحیح، خروجی می تواند غیر طبیعی باشد. بنابراین، استفاده از $ تشویق می شود اگر شما می توانید دقیقا توصیف شخصیت در انتهای یک رشته.

توجه داشته باشید که در بسیاری از سردبیران، ^ و $ با شروع و پایان خطوط مطابقت دارند. با این حال، به این دلیل که انتظار نداشت خط خطی باشد، این کاراکترها با شروع و پایان داده ها (به عنوان خطوط متفاوتی) در حال حاضر در مورد بافر مورد نظر مطابقت دارند. (همچنین توجه داشته باشید در زیر "سوء هاضمه سیستم" را ببینید)

پرچم -ex باعث می شود که الگو به عنوان رشته "دقیق" مطابقت داشته باشد. هیچ تفسیری از *، ^ و غیره صورت نگرفته است (اگر چه معمول قراردادهای TCL هنوز باید مورد توجه قرار گیرد). الگوهای دقیق همیشه غیرقانونی هستند.

پرچم -nocase کاراکترهای بزرگ را برای خروجی مقایسه می کند به شرط اینکه آنها کاراکترهای کوچک هستند. الگوی تحت تاثیر قرار نمی گیرد.

در حالی که خواندن خروجی، بیش از 2000 بایت می تواند بایت های قبلی را "فراموش" کند. این ممکن است با عملکرد match_max تغییر کند . (توجه داشته باشید که مقادیر بیش از حد بزرگ می تواند الگو را تضعیف کند .) اگر patlist full_buffer باشد ، اگر متضاد با max_baks دریافت شده باشد ، متناظر با آن اجرا می شود و هیچ الگوهای دیگری همسان نیستند. کلمه کلیدی full_buffer یا نه استفاده می شود، شخصیت های فراموش شده به wait_out (buffer) نوشته می شوند.

اگر patlist کلمه کلیدی null است و null ها مجاز هستند (از طریق دستور حذف_nulls )، اگر یک ASCII 0 هماهنگ باشد، body مربوطه اجرا می شود. 0 بایت را نمی توان با استفاده از الگوهای glob یا regexp مطابقت داد.

پس از تطبیق الگوی (یا eof یا full_buffer)، هر خروجی تطابق و قبلا بی همتا در متغیر expect_out (buffer) ذخیره می شود . مسابقات زیر رشته ای به ترتیب در 9 متغیر انتظار می رود (1، رشته) از طریق expect_out (9، string) . اگر پرچم -indices قبل از یک الگوی استفاده شود، شاخص های شروع و پایان (در قالب مناسب برای لنگر ) از 10 رشته در متغیرهای expect_out (X، start) و expect_out (X، end) ذخیره می شوند که X یک رقمی، به موقعیت substring در بافر مربوط می شود. 0 اشاره به رشته هایی است که با الگوی کلی همخوانی دارد و برای الگوهای glob و همچنین الگوهای regexp تولید می شود. به عنوان مثال، اگر یک روند تولید خروجی "abcdefgh \ n" را تولید کند، نتیجه:

انتظار "سی دی"

همانطور که اظهارات زیر اعدام شده است:

set expec_out (0، string) cd set expec_out (buffer) abcd

و "efgh \ n" در بافر خروجی باقی مانده است. اگر یک روند تولید خروجی "abbbcabkkkka \ n" را تولید کرد، نتیجه:

انتظار می رود -indices -re "b (b *). * (k +)"

همانطور که اظهارات زیر اعدام شده است:

مجموعه ای از انتظار (0، شروع) 1 مجموعه انتظار انتظار (0، پایان) 10 مجموعه انتظار انتظار (0، رشته) مجموعه ای از انتظار انتظار (1، شروع) 2 مجموعه انتظار انتظار (1، پایان) (2، شروع) 10 مجموعه انتظار انتظار (2، پایان) 10 مجموعه انتظار انتظار (2، رشته) k مجموعه انتظار انتظار (از بافر) abbbcabkkkk

و "a \ n" در بافر خروجی باقی مانده است. الگوی "*" (و -re ". *") بافر خروجی را بدون خواندن خروجی بیشتر از روند، فاش می کند.

به طور معمول، خروجی همگرا از Buffers داخلی Expect حذف می شود. این ممکن است با پیشوند الگوی با پرچم -notransfer جلوگیری شود . این پرچم در آزمایش های بسیار مفید است (و برای آزمایش راحت می تواند برای "راحت" استفاده شود).

id شناسه مرتبط با خروجی مطابق (یا eof یا full_buffer) در expect_out (spawn_id) ذخیره می شود.

پرچم -timeout باعث می شود که فرمان مورد انتظار فعلی به جای استفاده از مقدار متغیر زمان با استفاده از مقدار زیر به عنوان زمان وقفه استفاده شود.

به طور پیش فرض، الگوها نسبت به خروجی از فرآیند فعلی مطابقت دارند، اما پرچم -i اعلام می کند که خروجی از لیست spawn_id نامیده می شود، در مقایسه با هر الگو زیر (تا بعد -i ) سازگار است. list spawn_id باید یک لیست جدا از فضای خالی از spawn_ids یا متغیری باشد که به لیستی از spawn_ids اشاره دارد.

به عنوان مثال، مثال زیر منتظر «اتصال» از روند فعلی یا «مشغول»، «شکست» یا «رمز عبور نامعتبر» از spawn_id با نام $ proc2 است.

انتظار می رود {-i $ proc2 مشغول {قرار داده است مشغول \ n؛ exp_continue} -re "شکست خورده است؛ گذرواژه نامعتبر" قطع زمان وقفه قطع ارتباط متصل است}

مقدار متغیر جهانی any_spawn_id ممکن است برای مطابقت با الگوهای هر spawn_ids که با همه پرچم های دیگر در فرمان انتظار فعلی نامگذاری شده است، استفاده شود. spawn_id از یک پرچم -i با هیچ الگوی مرتبط (به عنوان مثال، بلافاصله توسط دیگری -i دنبال می شود ) برای هر الگو دیگر در همان فرمان انتظار در ارتباط با هر_spawn_id در دسترس است.

پرچم -i همچنین می تواند یک متغیر جهانی نامیده شود و در این صورت متغیر برای لیستی از idwns خوانده می شود. متغیر هر بار تغییر می کند. این یک راه برای تغییر منبع I / O در هنگام اجرای فرمان است. شناسه های spell ارائه شده توسط این روش نامیده می شوند "غیر مستقیم".

اقدامات مانند شکستن و ادامه دادن به ساختارهای کنترل (به عنوان مثال، برای proc ) رفتار معمولی است. فرمان exp_continue اجازه می دهد تا خود را به عنوان اجرای معمول به جای بازگشت به حالت عادی ادامه دهد.

این برای اجتناب از حلقه های صریح یا اظهارات مکرر انتظار است. مثال زیر بخشی از یک قطعه برای بهینه سازی rlogin است. exp_continue اجتناب از نیاز به نوشتن بیانیه دوم انتظار (برای جستجوی سریع) اگر rlogin برای یک رمز عبور درخواست کند.

انتظار می رود {password: {stty -echo send_user "password (برای $ user) در میزبان $:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out (1، string) \ r" stty echo exp_continue} اشتباه {send_user} رمز عبور نامعتبر یا حساب \ n "exit" timeout {send_user اتصال به $ میزبان به پایان رسیده \ n "exit} eof {send_user] اتصال به میزبان شکست خورد: $ expect_out (buffer)" exit} دوباره به سرعت}

به عنوان مثال، قطعه زیر ممکن است به یک راهنمای کاربر تعامل کمک کند که در حال حاضر کاملا خودکار است. در این مورد، ترمینال به حالت خام وارد می شود. اگر کاربر فشار "+"، یک متغیر افزایش می یابد. اگر "p" فشرده شود، چندین بازده به فرآیند ارسال می شود، شاید بتوان آن را به نوعی متزلزل کرد، و "i" به کاربر اجازه می دهد با فرایند ارتباط برقرار کند و به طور موثر از کنترل اسکریپت جلوگیری کند. در هر مورد، exp_continue اجازه می دهد که انتظارات فعلی برای ادامه تطبیق الگو بعد از اجرای فعلی ادامه یابد.

stty raw -cheo expect_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"؛ exp_continue} "+" {incr foo؛ exp_continue} "i" {interact؛ exp_continue} "خروج" خروج}

به طور پیش فرض، exp_continue زمانبندی تایمر را بازنشانی میکند. تایمر دوباره راه اندازی نمی شود، اگر exp_continue با پرچم -continue_timer نامیده می شود.

expect_after [expect_args]
کار می کند به طور مشابه به expect_before به جز اینکه اگر الگوها از هر دو انتظار و انتظار داشته باشند می توانند مطابقت داشته باشند، الگوی انتظار استفاده می شود. برای اطلاعات بیشتر دستور expects_before را ببینید.

expect_background [expect_args]
استدلال های مشابه را انتظار می رود ، هرچند بلافاصله باز می گردد. الگوها هر زمان که ورودی جدید وارد می شوند، آزمایش می شوند. زمان بندی پیش فرض و پیش فرض به expec_background معنی ندارند و به صورت صریح از بین می روند. در غیر این صورت، دستور expects_background از انتظارات پیشین و الگوهای expected_after استفاده می کند همانطور که انتظار می رود .

هنگامی که اقدامات expect_background در حال ارزیابی می شوند، پردازش پس زمینه برای همان idwn idle مسدود می شود. پردازش پس زمینه هنگامی که عمل کامل می شود، قفل شده است. در حالیکه پردازش پس زمینه مسدود شده است، ممکن است یک (پیش زمینه) انتظار برای یک شناسه مشابه وجود داشته باشد.

امیدوارم انتظار نداشته باشید در حالی که expect_background قفل شده است. expect_background برای شناسایی خاص تخم مرغ با اعلام یک expect_background جدید با همان idwn id پاک می شود. اعلام کردن expect_background با هیچ الگویی، شناسه داده شده را از توانایی برای مطابقت الگوهای در پس زمینه حذف می کند.

expect_before [expect_args]
استدلال های مشابه را انتظار می رود ، هرچند بلافاصله باز می گردد. جفت های الگوی عمل از most recent expect_before با همان idwn id به طور ضمنی به هر دستور زیر انتظار می رود اضافه شده است. اگر یک الگوریتم مطابقت دارد، آن را مانند آن که در دستور فرمان خود مشخص شده است، پردازش می کند، و بدن مرتبط در چارچوب دستور انتظار اجرا می شود . اگر الگوهایی از هر دو expect_before و انتظار می توانند مطابقت کنند، الگوی expected_before استفاده می شود.

اگر هیچ الگوی مشخص نشده است، شناسه ریشه برای هر الگو مورد بررسی قرار نمی گیرد.

به جای اینکه با پرچم -i لغو شود، پیش بینی های پیش بینی شده در برابر شناسه اشکال تعریف شده در زمانی که دستور expects_before اجرا شد (نه زمانی که الگوی آن همسان باشد) مطابقت دارد.

پرچم -info پیش بینی می کند تا قبل از بازگشت مشخصات مشخصی از چه الگوهایی مطابقت داشته باشد. به طور پیش فرض، آن را بر روی شناسه فعلی تخمینی گزارش می کند. ممکن است یک مشخصه خصوصیات ریزپردازنده ممکن است برای اطلاعات مربوط به آن idwn id داده شود. مثلا

expect_before -info -i $ proc

در بیشتر موارد ممکن است یک مشخصه شناسایی شود. پرچم غیر مستقیم باعث می شود که شناسایی مستقیم شناسایی شوند که تنها از مشخصات غیر مستقیم استفاده می شود.

به جای مشخصات مشخصه، پرچم "-all" "-info" را برای گزارش همه شناسه های تخمینی ایجاد می کند.

خروجی پرچم -info را می توان به عنوان argument به expect_before استفاده کرد.

expect_tty [expect_args]
مانند انتظار است، اما کاراکترهایی از / dev / tty (به عنوان مثال کلید های میانبر از کاربر) را می خواند. به طور پیش فرض، خواندن در حالت پخته انجام می شود. بنابراین، خطوط باید با بازگشت به پایان برسند تا انتظار داشته باشند آنها را ببینند. این ممکن است از طریق stty تغییر کند (دستور زیر را ببینید).

expect_user [expect_args]
مانند انتظار است، اما کاراکترهای stdin (به عنوان مثال کلید های میانبر از کاربر) را می خواند. به طور پیش فرض، خواندن در حالت پخته انجام می شود. بنابراین، خطوط باید با بازگشت به پایان برسند تا انتظار داشته باشند آنها را ببینند. این ممکن است از طریق stty تغییر کند (دستور زیر را ببینید).

چنگال
یک فرآیند جدید ایجاد می کند. فرایند جدید یک کپی دقیق از روند Expect فعلی است . در مورد موفقیت، چنگال 0 را به فرآیند جدید (child) میفرستد و شناسه پردازش فرآیند فرزند را به فرآیند پدر و مادر باز میگرداند. در شکست (به طور قطع به علت فقدان منابع، به عنوان مثال، فضای مبادله، حافظه)، چنگال -1 به پردازش پدر و مادر بازگردانده می شود و هیچ پرونده فرزندی ایجاد نمی شود.

فرآیندهای Forked از طریق فرمان خروج خروجی ، درست همانند فرایند اصلی. فرایندهای Forked مجاز به نوشتن در فایل های log هستند. اگر اشکال زدایی را غیرفعال یا ورود به سیستم در بسیاری از فرآیندها را غیرفعال نکنید، نتیجه ممکن است گیج کننده باشد.

برخی از پیاده سازی های pty ممکن است توسط خوانندگان و نویسندگان چندگانه، حتی لحظه ای، اشتباه گرفته شوند. بدین ترتیب، قبل از تخمک گذاری، امن ترین است.

تعامل [string1 body1] ... [stringn [bodyn]]
کنترل فرایند فعلی را به کاربر می دهد، به طوری که جلوه های کلیدی به فرآیند فعلی ارسال می شود و stdout و stderr روند فعلی به دست می آیند.

جفت های رشته ای ممکن است به عنوان آرگومان مشخص شوند و در این صورت بدن وقتی رشته مربوطه وارد می شود اعدام می شود. (به صورت پیش فرض، رشته به فرآیند فعلی ارسال نمی شود .) اگر بدن نهایی از دست رفته باشد، دستور فرمان فرض شده است.

اگر استدلال به کل تعریف تعریف نیاز به بیش از یک خط، تمام استدلال ممکن است "braced" به یک به طوری که برای جلوگیری از پایان هر خط با یک بکسلش. در این مورد، جایگزینی Tcl معمولی با وجود اتصالات وجود دارد.

به عنوان مثال، فرمان زیر اجرا می شود با جفت های رشته ای زیر تعریف می شود: هنگامی که ^ Z فشار داده می شود، انتظار می رود به حالت تعلیق درآمده است. (پرچم -reset حالت ترمینال را بازیابی می کند.) هنگامی که ^ A فشار داده می شود، کاربر می بیند "شما یک کنترل A تایپ کرده اید و روند A ^ A ارسال می شود. هنگامی که $ فشرده می شود، کاربر تاریخ را می بیند. هنگامی که ^ C فشار داده می شود، Expect خروج. اگر "foo" وارد شود، کاربر "bar" را می بیند. هنگامی که ~ ~ فشرده می شود، مترجم Expect اجرا می شود تعاملی.

set CTRLZ \ 032 interact {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user شما یک کنترل را تایپ کردید \ n "؛ ارسال "\ 001"} $ {send_user "تاریخ [فرمت ساعت [ساعت ثانیه]]" "} \ 003 exit foo {send_user bar"} ~~}

در جفت های رشته ای، رشته ها به ترتیب آنها به عنوان استدلال فهرست می شوند. رشته هایی که تا حدی با هم مطابقت دارند، پیش بینی می شود که روند باقی نمانده باشد. اگر پس از وارد شدن شخصیت ها به این ترتیب که دیگر احتمالا یک بازی وجود نداشته باشد، فقط بخشی از رشته به فرایند فرستاده می شود که احتمالا دیگر نمیتواند شروع شود. به این ترتیب، رشته هایی که زیر رشته های بازی های جزئی هستند، می توانند بعدا مطابقت کنند، اگر رشته های اصلی که سعی در مطابقت دارند نهایتا شکست می خورد.

به طور پیش فرض، تطبیق رشته دقیقا بدون کارت وحشی است . (در مقابل، دستور انتظار از الگوهای پیش فرض سبک glob به طور پیش فرض استفاده می کند.) پرچم -ex برای محافظت از الگوهایی که ممکن است در غیر این صورت مطابقت با پرچم ها را از انجام این کار، مورد استفاده قرار گیرد. هر الگوی که با "-" آغاز می شود باید از این طریق محافظت شود. (تمام رشته ها با شروع با "-" برای گزینه های آینده محفوظ می باشند.)

علامت " -re " رشته را به عنوان الگویی سبک regexp تفسیر می کند. در این حالت، تابع subrings در متغیر interact_out ذخیره می شود به همان شیوه ای که انتظار می رود فروشگاه خروجی آن را در متغیر expect_out ذخیره کند . پرچم -indices به طور مشابه پشتیبانی می شود.

الگوی eof یک عمل را اجرا می کند که بعد از پایان فایل اجرا می شود. یک الگوی جداگانه eof نیز ممکن است از پرچم خروجی پیروی کند که در این صورت آن را با هم مقایسه می کند اگر eof در هنگام نوشتن خروجی شناسایی شود. پیش فرض عمل عمل "بازگشت" است، به طوری که تعامل به سادگی بر هر EOF بازگشت.

زمان بندی الگو زمان وقفه (در ثانیه) و عمل را اجرا می کند که پس از آنکه هیچ یک از کاراکتر ها برای یک زمان معین خوانده نشد، اجرا می شود. الگوی زمانبندی برای آخرین فرآیند مشخص شده اعمال می شود . زمان پیش فرض پیش فرض وجود ندارد. متغیر خاص "timeout" (که توسط فرمان انتظار استفاده می شود) تاثیری بر این وقفه ندارد.

برای مثال، بیانیه زیر می تواند به کاربر autologout که هیچ چیز را برای یک ساعت تایپ کرده است اما هنوز پیام های مکرر سیستم را دریافت می کند استفاده می شود:

interact-input $ user_spawn_id timeout 3600 return -output \ $ spawn_id

اگر الگوی کلمه کلیدی صفر است و null ها مجاز می باشند (از طریق دستور حذف_nulls )، اگر یک ASCII 0 هماهنگ باشد، بدن مربوطه اجرا می شود. 0 بایت را نمی توان با استفاده از الگوهای glob یا regexp مطابقت داد.

پیشوند یک الگو با پرچم -iwrite متغیر interact_out (spawn_id) را به spawn_id تنظیم می کند که با الگوی (یا eof) سازگار است.

اقدامات مانند شکستن و ادامه دادن به ساختارهای کنترل (به عنوان مثال، برای proc ) رفتار معمولی است. با این حال، بازگشت به تعاملات می پردازد تا به تماس گیرنده خود بازگردد، در حالی که inter_return باعث تعامل می شود که سبب بازگشت به تماس گیرنده می شود. به عنوان مثال، اگر "proc foo" تعامل برقرار کند و سپس اجرا inter_return را اجرا کند، proc foo بازگشت می کند. (به این معنی که اگر تعاملات برقرار شود، مترجم تعریف تایپ کردن بازگشت به تعاملات ادامه می دهد، در حالی که inter_return موجب برقراری تعامل برای بازگشت به تماس گیرنده می شود.)

در طی تعامل ، حالت خام مورد استفاده قرار می گیرد به طوری که تمام کاراکترها ممکن است به روند فعلی منتقل شوند . اگر فرآیند فعلی سیگنال های کنترل کار را بدست نیاورد، اگر یک سیگنال متوقف (به طور پیش فرض ^ Z) ارسال شود، متوقف خواهد شد. برای راه اندازی مجدد، یک سیگنال ادامه دهید (مانند "kill-CONT"). اگر واقعا میخواهید یک SIGSTOP را به چنین فرایندی بفرستید (به وسیله ^ Z) ابتدا ابتدا csh را در نظر بگیرید و سپس برنامه خود را اجرا کنید. از سوی دیگر، اگر می خواهید یک SIGSTOP را برای انتظار خود بفرستید، ابتدا مترجم را فراخوانی کنید (شاید با استفاده از یک شخصیت فرار) و سپس ^ Z را فشار دهید.

جفت های رشته ای می تواند به عنوان یک اصطلاح به منظور اجتناب از نیاز به ورود به مترجم و اجرای دستورات به صورت تعاملی استفاده شود. حالت ترمینال قبلی در حالی که بدن جفت بدن رشته ای اجرا می شود استفاده می شود.

برای سرعت، اقدامات به طور پیش فرض در حالت خام انجام می شود. پرچم -reset ترمینال را به حالت قبل از تعامل اجرا می کند (همیشه، حالت پخته شده). توجه داشته باشید که کاراکترهای وارد شده هنگام تغییر حالت ممکن است از دست رفته باشند (یکی از ویژگی های ناامید کننده راننده ترمینال در برخی از سیستم ها). تنها دلیل استفاده از reset این است که آیا عمل شما بستگی به اجرای در حالت پخت دارد.

پرچم -echo کاراکترهایی را ارسال می کند که با الگوی زیر به فرآیند که آنها را به عنوان هر شخصیت به عنوان خوانده شده مطابقت دارد. این ممکن است مفید باشد زمانی که کاربر نیاز به بازخورد از الگوهای تقریبا تایپ شده داشته باشد.

اگر الگوی در حال تکرار است اما در نهایت نمیتواند مطابقت کند، شخصیتها به فرآیند تولید شده ارسال می شود . اگر فرایند تولید شده پس از آن آنها را بازتاب می کند، کاربر دو بار شخصیت ها را می بیند. -echo احتمالا فقط در شرایطی است که کاربر بعید است که این الگوی را کامل کند مناسب است. به عنوان مثال، گزاره زیر از rftp، اسکریپت بازگشتی ftp است، جایی که کاربر از دستور ~ g، ~ p، یا ~ l درخواست می شود تا دایرکتوری فعلی را به صورت مجزا، دایرکتوری یا لیست کند. اینها خیلی دور از دستورات معمول ftp هستند، بعید است که کاربر تا ~ هر چیز دیگری را دنبال کند، به جز اشتباه، در این صورت، آنها احتمالا فقط نتیجه را نادیده می گیرند.

تعامل {-echo ~ g {getcurdirectory 1} -cheo ~ l {getcurdirectory 0} -cheo ~ p {putcurdkeyory}}

پرچم -nobuffer شخصیت هایی را که با الگوی زیر در فرایند خروجی مطابقت دارند به عنوان شخصیت ها خوانده می شود.

این مفید است هنگامی که شما مایل به اجازه دادن به یک برنامه الگوی بازگشت. به عنوان مثال، موارد زیر ممکن است مورد استفاده قرار گیرد برای نظارت بر اینکه در کدام یک از افراد کدام است (یک مودم سبک Hayes). هر بار "ATD" دیده می شود اسکریپت بقیه خط ها را وارد می کند.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" return put $ log "[فرمت ساعت [ساعت ثانیه]]: dialed $ interact_out (1، string)" interact -nobuffer "ATD" lognumber

در طول تعامل ، استفاده قبلی از log_user نادیده گرفته می شود. به طور خاص، تعامل ، خروجی خود را مجبور می کند وارد شود (به خروجی استاندارد فرستاده می شود)، زیرا فرض می شود که کاربر نمی خواهد کورکورانه تعامل داشته باشد.

پرچم -o هر جفت جفت کلید زیر را به خروجی فرآیند فعلی اعمال می کند . برای مثال می توان برای مثال در هنگام برخورد با میزبان هایی که شخصیت های ناخواسته را در طول یک جلسه تلفنی ارسال می کنند مفید باشد.

به طور پیشفرض، در تعامل برقرار است و انتظار دارد که کاربر به نوشتن stdin و خواندن stdout خود فرایند انتظار بپردازد . پرچم -u (برای "کاربر") باعث می شود که کاربر به عنوان فرآیند نامیده شده توسط استدلال آن (که باید یک شناسه ایجاد شده) را دنبال کند.

این اجازه می دهد تا دو فرایند غیر مرتبط بدون استفاده از یک حلقه صریح به یکدیگر متصل شوند. برای کمک به اشکال زدایی، انتظار تشخیص همیشه به stderr (یا stdout برای اطلاعات مربوط به ورود و اشکالزدایی) بروید. به همین دلیل، فرمان interpreter به صورت تعاملی از stdin خواند.

به عنوان مثال، قطعه زیر یک فرآیند ورود را ایجاد می کند. سپس آن کاربر را شماره گیری می کند (نشان داده نمی شود)، و در نهایت این دو را با یکدیگر متصل می کند. البته، هر فرآیند ممکن است جایگزین شود. برای مثال، پوسته اجازه می دهد تا کاربر بدون ارائه یک حساب کاربری و رمز عبور کار کند.

ورودی set login $ spawn_id مودم نوک را برمی گرداند # شماره گیری مجدد به کاربر # اتصال کاربر به ورودی interact -u $ login

برای ارسال خروجی به فرآیندهای چندگانه، لیست هر فهرست شناسایی پیش رونده را با یک پرچم خروجی فهرست کنید. ورودی برای یک گروه از ids تولید تخم مرغ ممکن است با یک لیست شناسه تخم ریزی پیش از یک پرچم ورودی تعیین شود . (هر دو ورودی و خروجی ممکن است لیست ها را همانند پرچم -i در دستور انتظار انتظار داشته باشند ، به جز اینکه any_spawn_id در تعامل معناداری نیست.) همه پرچم ها و رشته ها (یا الگوها) زیر به این ورودی تا زمان دیگری اعمال می شود - پرچم ورودی ظاهر می شود. اگر هیچ ورودی به نظر می رسد، -output نشان می دهد "-input $ user_spawn_id -output". (به طور مشابه، با الگوهایی که ورودی ندارند .) اگر one -input مشخص شود، آن را $ user_spawn_id منحرف می کند. اگر ورودی دوم مشخص شود، این مقدار $ spawn_id را از بین می برد. پرچم های اضافی ورودی ممکن است مشخص شود.

دو فرآیند ورودی ضمنی به طور پیشفرض به داشتن خروجی های آنها به عنوان $ spawn_id و $ user_spawn_id (در معکوس) مشخص شده است. اگر پرچم ورودی با پرچم بدون خروجی نمایش داده شود، کاراکترهای آن پردازش از بین می روند .

پرچم -i جایگزین spawn_id فعلی را معرفی می کند، زمانی که هیچ پرچم دیگری از ورودی یا خروجی استفاده نمی شود. پرچم -i یک پرچم -o را نشان می دهد.

ممکن است فرایندهایی را که با استفاده از شناسه های غیرمستقیم غیرمستقیم ارتباط دارند، تغییر دهید. (شناسه های تخم ریزی غیر مستقیم در بخش دستورالعمل انتظار می رود.) شناسه های تخم ریزی غیر مستقیم می توانند با پرچم های -i، -u، -input یا -output مشخص شوند.

مترجم [args]
باعث می شود که کاربر به طور تعاملی دستورات Expect و Tcl را فراخوانی کند. نتیجه هر دستور چاپ می شود.

اقدامات مانند شکستن و ادامه دادن به ساختارهای کنترل (به عنوان مثال، برای proc ) رفتار معمولی است. با این حال، بازگشت باعث می شود مترجم برای بازگشت به تماس گیرنده خود، در حالی که inter_return باعث می شود مترجم برای ایجاد بازگشت در تماس گیرنده خود. به عنوان مثال، اگر "proc foo" مترجم نامیده شود که پس از اجرای inter_return اجرا می شود، proc foo بازگشت می کند. هر فرمان دیگری باعث می شود مترجم برای ادامه دستورات جدید ادامه دهد.

به طور پیش فرض، فوری شامل دو عدد صحیح است. اولین عدد صحیح عمق پشته ارزیابی را توضیح می دهد (یعنی چند بار Tcl_Eval فراخوانی شده است). عدد صحیح دوم، شناسه تاریخ Tcl است. فوریت را می توان با تعریف یک رویه به نام "prompt1" تنظیم کرد که مقدار بازگشتی آن بعدی خواهد شد. اگر یک بیانیه دارای نقل قول های باز، پارنز، braces یا brackets باشد، یک خط دوم ثانویه (به طور پیش فرض "+>") بر اساس خط جدید صادر می شود. خطای ثانویه ممکن است با تعریف یک روش به نام "prompt2" تنظیم شود.

در طی مترجم ، حالت پخته شده مورد استفاده قرار می گیرد، حتی اگر تماس گیرنده از حالت خام استفاده کند.

اگر stdin بسته شود، مترجم برگشت نخواهد کرد، مگر اینکه از پرچم -eof استفاده شود، در این صورت استدلال بعدی فراخوانی می شود.

log_file [args] [[-a] file]
اگر یک نام فایل ارائه شده باشد، log_file یک رونوشت از جلسه (که در آن نقطه شروع می شود) در فایل ضبط می شود. log_file اگر هیچ استدلالی داده نشود ، ضبط خواهد شد. هر پرونده ورود قبلی بسته است

به جای نام فایل، یک شناسه فایل Tcl ممکن است با استفاده از پرچم -open یا -leaveopen ارائه شود . این شبیه به دستور spawn است . (برای اطلاعات بیشتر ریشه یابی کنید.)

پرچم نیروی خروجی را وارد می کند که توسط دستور log_user سرکوب شده است.

به طور پیش فرض، فرمان log_file به جای تعطیل کردن آنها به فایل های قدیمی افزوده می شود، برای اینکه راحتی داشته باشید که بتوانید ورود و خروج را چند بار در یک جلسه انجام دهید. برای کوتاه کردن فایلها از پرچم-noappend استفاده کنید.

پرچم -info باعث می شود که log_file یک توضیح جدیدترین استدلال های غیر اطلاعات را ارائه دهد.

log_user -info | 0 | 1
به طور پیشفرض، ارسال / انتظار گفتگو به stdout وارد شده است (و یک فایل ورودی اگر باز باشد). ورود به stdout با دستور "log_user 0" غیرفعال شده و با "log_user 1" مجددا فعال می شود. ورود به سیستم logfile بدون تغییر است.

پرچم -info باعث می شود که log_user یک توضیح جدیدترین استدلال های غیر اطلاعات را ارائه دهد.

match_max [-d] [-i spawn_id] [اندازه]
اندازه بافر (در بایت) که با استفاده از درون داخلی مورد استفاده قرار می گیرد تعیین می کند. بدون هیچ آرگومان اندازه ، اندازه جاری بازگشته است.

با پرچم -d ، اندازه پیش فرض تنظیم شده است. (پیش فرض اولیه 2000 است.) با پرچم -i ، اندازه برای idwn set id تنظیم شده است، در غیر این صورت برای روند فعلی تنظیم شده است .

پوشش [- # spawn_id] [- # spawn_id] [...] برنامه [args]
اجرای برنامه " args" به جای برنامه فعلی Expect که پایان می یابد. یک بحث آشکار بر خط خطی در مقابل نام فرمان به عنوان یک پوسته ورود به سیستم است. همه spawn_ids بسته شده اند به جز کسانی که به عنوان استدلال نامیده می شوند. اینها بر روی شناسه های فایل نامیده می شوند.

spawn_ids برای شناسایی پرونده برای برنامه جدید به ارث برده می شوند. به عنوان مثال، خط زیر شطرنج را اجرا می کند و اجازه می دهد تا آن را توسط فرایند فعلی کنترل شود - مثلا یک استاد شطرنج.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id chess

این کارآیی بیشتری نسبت به "interact -u" است، با این حال، توانایی انجام تعامل برنامه ریزی شده را از بین می برد زیرا فرایند Expect دیگر در کنترل نیست.

توجه داشته باشید که هیچ ترمینال کنترل ارائه نشده است. بنابراین، اگر شما قطع یا دوباره ورودی استاندارد، برنامه هایی که کنترل کار را انجام می دهند (پوسته، ورود، و غیره) به درستی کار نمی کنند.

parity [-d] [-i spawn_id] [ارزش]
تعریف می کند که آیا بایستی از خروجی فرآیندهای تولید شده حفظ یا حذف شود. اگر مقدار صفر باشد، تساوی تنزل می شود، در غیر این صورت آن را نمی بندیم. بدون مقدار استدلال، مقدار فعلی باز می شود.

با پرچم -d ، مقدار پارتی پیش فرض تنظیم شده است. (پیش فرض اولیه 1 است، یعنی پاریته از بین نمی رود.) با پرچم -i ، مقدار تقارن برای شناسه نامرتبط تنظیم شده است، در غیر این صورت برای روند فعلی تنظیم شده است .

remove_nulls [-d] [-i spawn_id] [ارزش]
قبل از اینکه الگوی تطبیق یا ذخیره سازی در متغیر expect_out یا interact_out را حفظ کند یا از خروجی فرآیندهای تولید شده حفظ یا حذف شود، تعریف می کند. اگر مقدار 1 باشد، صفر حذف می شود اگر مقدار 0 باشد، null ها حذف نمی شوند. بدون مقدار استدلال، مقدار فعلی باز می شود.

با پرچم -d ، مقدار پیش فرض تنظیم شده است. (پیش فرض اولیه 1 است، یعنی nulls حذف می شوند.) با پرچم -i ، مقدار برای idwn نام تنظیم شده است، در غیر این صورت برای روند فعلی تنظیم شده است .

آیا null ها حذف می شوند، انتظار می رود بایت های صفر به log و stdout را ضبط کند.

ارسال [-flags] رشته
رشته را به روند فعلی ارسال می کند . به عنوان مثال، دستور

ارسال "سلام جهان \ r"

شخصیت های helloworld را به روند فعلی ارسال می کند . (Tcl شامل یک دستور printf -like می باشد ( فرمت نامیده می شود) که می تواند رشته های پیچیده دلخواه ایجاد کند.)

شخصیت ها بلافاصله ارسال می شوند، گرچه برنامه هایی با ورودی خطی بافر، شخصیت ها را نخوانده تا شخصیت برگشتی ارسال شود. شخصیت بازگشتی "\ r" را نشان می دهد.

- پرچم آرگومان بعدی را به عنوان یک رشته به جای یک پرچم تفسیر می کند. هر رشته می تواند پیش از «-» باشد یا خیر، به نظر می رسد مثل یک پرچم باشد. این مکانیزم قابل اعتماد را فراهم می کند که رشته های متغیر را بدون اینکه توسط کسانی که به طور تصادفی به مانند پرچم ها می آیند، ردیف شوند. (تمام رشته ها با شروع با "-" برای گزینه های آینده محفوظ می باشند.)

پرچم -i اعلام می کند که رشته به نام spawn_id فرستاده می شود. اگر spawn_id کاربر user_spawn_id باشد و ترمینال در حالت خام است، خطوط جدید در رشته به ترتیب return-newline ترجمه می شوند تا به نظر می رسد که ترمینال در حالت پخت شده است. پرچم پرچم این ترجمه را غیرفعال می کند.

پرچم -null کاراکترهای صفر (0 بایت) را ارسال می کند. به صورت پیش فرض، یک صفر ارسال می شود. یک عدد صحیح ممکن است از " -null " پیروی کند تا نشان دهد که تعداد ارسال کننده ها چقدر است.

پرچم -break باعث ایجاد حالت شکستگی می شود. این تنها به این معنی است که ID شناسایی به یک دستگاه tty که از طریق "spawn -open" باز شده است، اشاره دارد. اگر فرآیندی مانند نوک ایجاد کرده باشید، باید از نوک برای ایجاد شکست استفاده کنید.

نیروی -s نیروی خروجی به صورت آهسته ارسال می شود، بنابراین از وضعیت رایج که در آن کامپیوتر خارج از یک bufer ورودی است که برای یک انسان طراحی شده است، که هرگز بافر مشابهی طراحی نمی کند، اجتناب شود . این خروجی توسط مقدار متغیر "send_slow" کنترل می شود که یک لیست دو عنصر را می گیرد. عنصر اول یک عدد صحیح است که تعداد بایت ها را برای ارسال اتمی توصیف می کند. عنصر دوم یک عدد واقعی است که تعداد ثانیه ها را که توسط اتم ارسال می شود باید جدا کند. به عنوان مثال، "set send_slow {10 .001}" مجبور است "send -s" را برای ارسال رشته با 1 میلی ثانیه بین هر 10 کاراکتر ارسال کند.

نیروی -h پرچم نیروی خروجی را (تا حدودی) مانند یک انسان در حال تایپ کردن ارسال می کند. تاخیرهای انسانی بین شخصیت ها ظاهر می شود. (الگوریتم بر اساس توزیع Weibull است، با اصلاحات در نظر گرفته شده به این برنامه خاص.) این خروجی توسط مقدار متغیر "send_human" کنترل می شود که پنج لیست عنصر را می گیرد. دو عنصر برای اولین بار در زمان های مختلف به کار می روند. اولین مورد به طور پیش فرض استفاده می شود. دوم در انتهای کلمات استفاده می شود، برای شبیه سازی مکث های ظریف که گاهی در چنین تغییراتی رخ می دهد. پارامتر سوم اندازه گیری متغیر است که .1 کاملا متغیر است، 1 منطقی متغیر است و 10 کاملا غیر قابل تغییر است. شدت 0 تا بی نهایت دو پارامتر آخر به ترتیب حداقل و حداکثر زمان interarrival هستند. حداقل و حداکثر از گذشته استفاده می شود و "کلیپ" زمان آخرین. میانگین کلی نهایی می تواند کاملا متفاوت از میانگین داده شده باشد اگر حداقل و حداکثر کلیپ به اندازه کافی ارزش.

به عنوان مثال، دستور زیر یک تایپیست سریع و سازگار را تقلید می کند:

set_human {.1 .3 1 .05 2} send -h "من گرسنه هستم، اجازه دهید ناهار بخوریم."

در حالی که موارد زیر ممکن است پس از خم شدن مناسب باشد:

مجموعه send_human {.4 .4 .2 .5 100} ارسال -h "شب عروسی Goodd حزب!"

توجه داشته باشید که خطاهای شبیه سازی نشده اند، اگرچه می توانید تنظیمات خطا را با وارد کردن اشتباهات و اصلاحات در یک استدلال ارسال کنید.

پرچم ها برای ارسال شخصیت های خالی، برای ارسال وقفه ها، برای تحریک خروجی های آهسته و خروجی انسانی، به طور متقابلی منحصر به فرد هستند. فقط یک مورد مشخص شده آخرین مورد استفاده خواهد شد. علاوه بر این، هیچ آرگومان رشته ای را نمی توان با پرچم ها برای ارسال شخصیت های خالی یا شکاف مشخص کرد.

این یک ایده خوب است قبل از اولین ارسال به یک فرآیند با انتظار است . انتظار می رود منتظر روند آغاز شود، در حالی که ارسال نمی تواند. به طور خاص، اگر اولین تکمیل ارسال قبل از شروع فرآیند شروع شود، خطر ریسک داشتن اطلاعات شما را نادیده می گیرد. در شرایطی که برنامه های تعاملی هیچ فوری اولیه ارائه نمی دهند، شما می توانید قبل از ارسال با تاخیر به عنوان:

# برای جلوگیری از دادن هکرها نکاتی در مورد چگونگی شکستن آن، # این سیستم برای رمز عبور خارجی درخواست نمی کند. # منتظر 5 ثانیه برای exec برای تکمیل spawn telnet very.secure.gov sleep 5 send password / r

exp_send نام مستعار برای ارسال است. اگر از Expectk یا نوع دیگری از Expect در محیط Tk استفاده می کنید، ارسال توسط Tk برای یک هدف کاملا متفاوت تعریف شده است. exp_send برای سازگاری بین محیط ها ارائه شده است. Alias ​​های مشابه برای دیگر دستورات فرستاده Expect دیگر ارائه شده است.

send_error [-flags] رشته
مانند ارسال ، به جز اینکه خروجی به stderr به جای روند فعلی ارسال می شود .

send_log [-] رشته
مانند ارسال ، به جز اینکه رشته فقط به فایل log ارسال می شود (see log_file .) اگر هیچ پرونده باز نشود، استدلال ها نادیده می شوند.

send_tty [-flags] رشته
مانند ارسال ، به جز اینکه خروجی به / dev / tty به جای روند فعلی ارسال می شود .

send_user [-flags] رشته
مانند ارسال ، به جز اینکه خروجی به stdout به جای روند فعلی ارسال می شود .

ثانیه خواب
باعث می شود که اسکریپت برای تعداد معینی از ثانیه بخوابد . ثانیه ممکن است یک عدد دهدهی باشد. وقفه قطع (و رویدادهای Tk اگر شما از Expectk استفاده می کنید) در حال پردازش در حالی که انتظار خواب است.

برنامه آرج [args]
یک فرآیند جدید در حال اجرا " args program " ایجاد می کند. stdin، stdout و stderr آن ها به Expect متصل می شوند، به طوری که آنها می توانند توسط دستورات Expect دیگر خواند و نوشته شوند. اتصال توسط نزدیک بسته و یا اگر فرآیند خود را بسته هر یک از شناسه های فایل.

هنگامی که یک فرآیند توسط spawn شروع می شود ، متغیر spawn_id به یک توصیف کننده اشاره می کند که به آن فرایند است . فرایند spawn_id توصیف شده " فرآیند فعلی " است. spawn_id ممکن است بخواند یا نوشته شود، در واقع کنترل کار را فراهم می کند.

user_spawn_id یک متغیر جهانی است که حاوی یک توصیفگر است که به کاربر اشاره دارد. برای مثال، هنگامی که spawn_id به این مقدار تنظیم می شود، انتظار می رود رفتار مانند expect_user انجام شود .

.I error_spawn_id یک متغیر جهانی است که شامل یک توصیفگر است که به خطای استاندارد اشاره دارد. برای مثال، هنگامی که spawn_id به این مقدار تنظیم شده است، ارسال behaves مانند send_error .

tty_spawn_id یک متغیر جهانی است که شامل یک توصیفگر است که به / dev / tty اشاره دارد. اگر / dev / tty وجود ندارد (مانند در cron، in، یا batch script)، سپس tty_spawn_id تعریف نشده است. این ممکن است مورد آزمایش قرار گیرد:

اگر {{info vars tty_spawn_id}} {# / dev / tty وجود دارد} else {# / dev / tty وجود ندارد احتمالا در cron، batch یا در script وجود دارد}

اکسپلورر شناسه پردازش یونیکس را باز می کند . اگر فرايند ايجاد نشود، 0 بازگشت مي شود. متغیر spawn_out (برده، نام) به نام دستگاه pty slave تنظیم شده است.

به طور پیش فرض، spell ها نام فرمان و استدلال را تکرار می کنند. پرچم-noocho متوقف می شود از انجام این کار.

پرچم کنسول باعث می شود خروجی کنسول به روند تولید شده هدایت شود . این در تمام سیستم ها پشتیبانی نمی شود.

در داخل، تخم ریزی از یک pty استفاده می کند، همانند تتی کاربر راه اندازی شده است. این بیشتر تنظیم شده است تا تمام تنظیمات "عاقلانه" باشد (طبق stty (1)). اگر متغیر stty_init تعریف شده است، آن را در سبک استدلال stty به عنوان پیکربندی بیشتر تفسیر می شود. به عنوان مثال، "set stty_init raw" باعث میشود که ترمینال های فرآیند تولید شده بیشتر در حالت خام آغاز شود. -nottycopy ابتدایی را بر اساس کاربر tty اجرا می کند. -nottyinit ابتدایی "عاقلانه" را از بین می برد.

به طور معمول، تخم ریزی طول می کشد زمان برای اجرای. اگر متوجه شدید مقدار قابل توجهی از زمان تخمک گذاری را مشاهده می کنید، احتمالا با ptys هایی که درگیر می شوند روبرو می شوند. تعدادی از تست ها بر روی ptys اجرا می شوند تا از اشتباهات با فرآیندهای خطا جلوگیری شود. (این 10 ثانیه طول می کشد در هر گلوله گلزنی) در حال اجرا انتظار با گزینه -d نشان می دهد اگر انتظار می رود با بسیاری از ptys در حالت های عجیب و غریب مواجه است. اگر نمیتوانید فرایندهایی را که این پیتی ها متصل هستند را بکشید، ممکن است تنها راهکار مجدد راه اندازی مجدد باشد.

اگر برنامه نمیتواند موفقیت آمیز باشد چون exec (2) ناکام است (مثلا زمانی که برنامه وجود ندارد)، یک پیام خطا با دستور next interact یا expected انتظار می رود که برنامه اجرا شود و پیام خطا را به عنوان خروجی تولید کند. این رفتار یک نتیجه طبیعی از اجرای تخم ریزی است . در داخل، چنگال ها تولید می شود، پس از آن فرایند تولید شده هیچ راهی برای برقراری ارتباط با فرایند اصلی Expect به جز ارتباط با spawn_id ندارد.

پرچم -open باعث می شود که استدلال بعدی به عنوان یک شناسه فایل Tcl تفسیر شود (به عنوان مثال، توسط باز باز می شود). پس از آن می توان از id spawn استفاده کرد، به شرط اینکه این فرایند ایجاد شده است . (شناسه فایل دیگر نباید استفاده شود.) این به شما اجازه می دهد که دستگاه های خام، فایل ها و خطوط لوله را به عنوان فرایندهای تولید شده بدون استفاده از pty استفاده کنید. 0 نشان داده شده است که هیچ فرایند مرتبط وجود ندارد. هنگامی که اتصال به فرآیند تولید شده بسته شده است، بنابراین شناسه فایل Tcl است. پرچم -leaveopen شبیه به -open است به استثنای اینکه -leaveopen باعث می شود شناسه فایل حتی پس از شناسایی اشکال بسته شود.

پرچم "pty" سبب باز شدن یک pty می شود اما هیچ فرآیند ایجاد نمی شود . 0 نشان داده شده است که هیچ فرایند مرتبط وجود ندارد. spawn_id به طور معمول تنظیم شده است

متغیر spawn_out (slave، fd) به یک شناسه فایل مرتبط با pty slave تنظیم شده است. این می تواند با استفاده از "بستن بستن" بسته شود.

پرچم Signore نام یک سیگنال را در فرآیند تولید شده نادیده می گیرد. در غیر این صورت، سیگنال به رفتار پیش فرض می رسد. سیگنال ها به عنوان دستور فرمان نامیده می شوند، به جز اینکه هر سیگنال نیاز به یک پرچم جداگانه دارد.

سطح strace
باعث می شود اظهارات زیر را قبل از اجرای اعداد چاپ کنید. (ردیابی ردیابی Tcl متغیرها را نشان می دهد.) سطح نشان می دهد که چگونه پایین در پشته تماس برای ردیابی. به عنوان مثال، فرمان زیر Expect در هنگام ردیابی 4 سطح اول تماس ها اجرا می شود، اما هیچ کدام در زیر آن وجود ندارد.

انتظار دارید -c "strace 4" script.exp

پرچم -info باعث می شود که یک توضیح جدیدترین استدلال های غیر اطلاعات ارائه شود.

stty args
حالت های ترمینال را به طور مشابه با فرمان stty خارجی تغییر می دهد.

به طور پیش فرض، ترمینال کنترل دسترسی دارد. پایانه های دیگر می توانند با اضافه کردن «درخواست ها برای وضعیت آن را به عنوان نتیجه فرمان به دست آورند. اگر هیچ وضعیت درخواست شده و دسترسی ترمینال کنترل وجود نداشته باشد، وضعیت قبلی صفات خام و اکو در فرم باز شده است که بعدا می تواند باشد توسط فرمان استفاده می شود.

به عنوان مثال، استدلال های خام یا کوکی ، ترمینال را به حالت خام تبدیل می کند. استدلال - پرورش یا پخته شده ترمینال را به حالت پخته منتقل می کند. استدلال های echo و -echo ترمینال را به حالت echo و noecho ترجیح می دهند.

مثال زیر نشان می دهد که چگونه به طور موقت echoing را غیرفعال کنید. این می تواند در اسکریپت های دیگر به صورت خودکار برای جلوگیری از جاسازی کلمات عبور در آنها استفاده شود. (به بحث بیشتر در مورد زیر در زیر انتظارات انتظار مراجعه کنید.)

stty -echo send_user "رمز عبور: expect_user -re (. *) \ n" تنظیم رمز عبور $ expect_out (1، string) stty echo

args سیستم
args به sh (1) به عنوان ورودی می دهد، درست همانطور که اگر به عنوان فرمانی از یک ترمینال تایپ شده باشد. انتظار می رود تا زمانی که پوسته خاتمه یابد. وضعیت بازگشت از SH به همان شیوه ای عمل می کند که exec آن وضعیت بازگشت خود را مدیریت می کند.

در مقابل exec که stdin و stdout را به اسکریپت هدایت می کند، سیستم هیچ تغییر مسیری را انجام نمی دهد (به غیر از آن که توسط رشته مشخص شده است). بنابراین، ممکن است از برنامه هایی استفاده کنید که باید به طور مستقیم به / dev / tty صحبت کنند. به همین دلیل نتایج سیستم در ورود به سیستم ثبت نشده است.

نشانگر زمان [args]
یک نشانه زمانی را بازمی گرداند بدون استدلال، تعداد ثانیه ها از زمان عصر بازگشته است.

پرچم -format یک رشته را نشان می دهد که بازگشت می کند اما با جایگزینی هایی که طبق قوانین POSIX برای strftime ساخته شده است. به عنوان مثال،٪ a با نام روز هفته نامگذاری شده است (به عنوان مثال Sat). دیگران:

٪ نام خانوادگی نام روز هفته مختصات٪ نام روز کامل روز٪ ب نام اختصاری ماه٪ B نام ماه کامل٪ c زمان تاریخ در: Wed Oct 6 11:45:56 1993٪ d روز ماه (01-31٪ H ساعت (00-23)٪ I ساعت (01-12)٪ J روز (001-366)٪ ماه ماه (01-12)٪ M دقیقه (00-59)٪ P AM یا PM٪ S دوم (00-61) ٪ روزانه (1-7 روز اول روز اول هفته)٪ U هفته (00-53، اولین روز یکشنبه اولین روز هفته یک)٪ V هفته (01-53، سبک ISO 8601)٪ در روز (0- 6)٪ W هفته (00-53، اولین روز دوشنبه اولین روز هفته یک است)٪ x زمان تاریخ در: Wed Oct 6 1993٪ X زمان در: 23:59:59٪ Y سال (00-99) ٪ Y سال مانند: 1993 ZZ منطقه زمانی Z (یا هیچ چیز اگر قابل تعیین نیست) ٪٪ یک علامت درصد خالی

سایر مشخصات٪ تعریف نشده اند. شخصیت های دیگر از طریق دست نخورده عبور می کنند. تنها محلی C پشتیبانی می شود.

علامت -ceconds چند ثانیه پس از عصر به عنوان منبعی که از آن برای فرمت استفاده می شود معرفی می کند. در غیر این صورت، زمان کنونی استفاده می شود.

پرچم -gmt خروجی timestamp را برای استفاده از منطقه زمانی GMT استفاده می کند. بدون پرچم، منطقه زمانی محلی استفاده می شود.

تله [[فرمان] سیگنال]
باعث می شود که دستور داده شده بعد از دریافت هر گونه سیگنال داده شده، اعدام شود. فرمان در محدوده جهانی اجرا می شود. اگر دستور وجود ندارد، عمل سیگنال بازگردانده می شود. اگر دستور رشته SIG_IGN باشد، سیگنال ها نادیده گرفته می شوند. اگر دستور SIG_DFL رشته باشد، سیگنال ها به صورت پیش فرض به نتیجه می رسند. سیگنالها یک سیگنال تک یا یک لیست سیگنال است. سیگنال ها به صورت عددی یا نمادین به صورت هر سیگنال (3) مشخص می شوند. پیشوند SIG ممکن است حذف شود.

بدون استدلال (یا argument -number)، تله مقدار شماره سیگنال دستور trap را که در حال اجرا است، به دست می دهد.

پرچم کد با استفاده از کد بازگشتی فرمان به جای هر تکراری از کد Tcl در هنگام شروع فرمان آغاز می شود.

پرش -interp باعث می شود که فرمان را با استفاده از مترجم فعال در زمانی که دستور شروع به کار شد و نه زمانی که تله اعلام شد ارزیابی شود.

پرچم نامی باعث می شود که دستور trap به نام سیگنال دستور trap که در حال اجرا است، بازگردد.

پرچم -max باعث می شود که دستور trap بزرگترین شماره سیگنال را که می تواند تنظیم شود را به نمایش بگذارد .

به عنوان مثال، دستور "trap {send_user" Ouch! "} SIGINT" Ouch! "را چاپ می کند. هر بار که کاربر فشار می آورد ^ C.

به طور پیش فرض، SIGINT (که معمولا می تواند با فشار دادن ^ C) تولید شود و SIGTERM دلیل انتظار برای خروج. این به خاطر تله ی زیر است که به طور پیش فرض زمانی که Expect شروع می شود ایجاد شده است.

خروج تله {SIGINT SIGTERM}

اگر از پرچم -D برای شروع اشکال زدا استفاده می کنید، SIGINT تعریف شده برای شروع اشکال زدایی تعاملی. این به دلیل دامنه زیر است:

تله {exp_debug 1} SIGINT

تله اشکالزدایی را می توان با تنظیم متغیر محیط EXPECT_DEBUG_INIT به یک دستور جدید تله تغییر داد.

البته، می توانید هر دو این را فقط با اضافه کردن دستورات تکراری به اسکریپت خود، بروز دهید. به طور خاص، اگر شما "خروج تله SIGINT" خود را داشته باشید، این تله آشنا را از بین می برد. این امر مفید است اگر شما می خواهید برای جلوگیری از دسترسی کاربران به اشکال زدایی در همه.

اگر می خواهید تله خود را در SIGINT تعریف کنید، اما هنوز هم به اشکال زدایی در حال اجرا است، از:

اگر {! [exp_debug]} {trap mystuff SIGINT}

به علاوه، شما می توانید با استفاده از برخی از سیگنال های دیگر به اشکال زدایی دامن بزنید.

تله به شما اجازه نمیدهد که اقدام برای SIGALRM را لغو کند، زیرا این مورد به طور داخلی مورد استفاده قرار می گیرد. دستور disconnect SIGALRM را به SIG_IGN (ignore) تنظیم می کند. شما می توانید این را تا زمانی که شما آن را در طول دستور العمل های بعدی اکتسابی غیر فعال کنید reenable.

برای اطلاعات بیشتر سیگنال (3) را ببینید.

منتظر [args]
تاخیر زمانی که فرآیند تولید شده (یا فرآیند فعلی ، اگر هیچ کدام نامیده نمی شود) پایان می یابد.

به طور صحیح صبر کنید یک لیست از چهار عدد صحیح را نمایش می دهد. اولین عدد صحیح pid از روند است که منتظر بود. عدد صحیح دوم شناسه مربوطه است. عدد صحیح سوم -1 اگر خطای سیستم عامل رخ داده است، یا 0 در غیر این صورت. اگر عدد صحیح سوم 0 بود، عدد صحیح چهارم وضعیت بازگشت به فرآیند تولید شده است . اگر عدد صحیح سوم -1 باشد، عدد صحیح چهارم ارزش errno تعیین شده توسط سیستم عامل است. متغیر خطای متغیر جهانی نیز تنظیم شده است.

عناصر اضافی ممکن است در پایان مقدار بازگشت از انتظار ظاهر شود . یک عنصر پنجم اختیاری طبقه ای از اطلاعات را شناسایی می کند. در حال حاضر تنها مقدار ممکن برای این عنصر CHILDKILLED است و در این صورت دو مقدار بعدی نام سیگنال C و یک توضیح کوتاه متن است.

پرچم -i اعلام می کند که فرایند صحیح به نام spawn_id (NOT process id) منتظر است. در داخل یک SIGCHLD handler، ممکن است برای هر فرایند تولید شده با استفاده از id -1 شناسایی صبر کنید.

پرچم -nowait باعث می شود که منتظر بمانید تا بلافاصله با نشان دادن یک انتظار صبر کنید. هنگامی که روند فرار می کند (بعد)، بدون نیاز به صبر صحیح ، به طور خودکار از بین می رود.

فرمان صبر نیز ممکن است برای فرایند خراب با استفاده از استدلال "-i -1" صبر کنید. برخلاف استفاده از آن با فرآیندهای تولید شده، این فرمان میتواند در هر زمان اجرا شود. هیچ فرایندی در دست نیست که کنترل شود . با این حال، مقدار بازگشتی را می توان برای شناسه روند بررسی کرد.

کتابخانه ها

انتظار می رود به طور خودکار در مورد دو کتابخانه ساخته شده در انتظار برای اسکریپت Expect می داند. اینها توسط دایرکتوری هایی در متغیرهای exp_library و exp_exec_library تعریف می شوند. هر دو به معنای شامل فایل های ابزار است که می تواند توسط اسکریپت های دیگر استفاده می شود.

exp_library شامل فایل های مستقل معماری است. exp_exec_library شامل فایل های وابسته به معماری است. بسته به سیستم شما، هر دو دایرکتوری ممکن است کاملا خالی باشد. وجود پرونده $ exp_exec_library / cat-buffers توضیح می دهد که آیا / bin / cat buffers شما به طور پیش فرض است.

نسخه چاپی

تعریف vgrind برای اسکریپت Expect برای زیبا سازی در دسترس است. فرض کنید که تعریف vgrind که با توزیع Expect عرضه شده است به درستی نصب شده است، شما می توانید آن را به عنوان:

فایل vgrind -lexpect

مثال ها

بسیاری از مردم نمی دانند چگونه همه چیز را با هم ترکیب کنیم که صفحه شخص توضیح داده شود. من شما را تشویق می کنم نمونه هایی را در فهرست نمونه ای از توزیع Expect امتحان کنید . برخی از آنها برنامه های واقعی هستند. دیگران به سادگی از تکنیک های خاصی نشان داده می شوند و البته یک زن و شوهر فقط هک های سریع هستند. فایل INSTALL یک مرور سریع از این برنامه ها دارد.

مقاله های مورد انتظار (نگاه کنید به) همچنین مفید هستند. در حالی که بعضی از مقالات از نحو مربوط به نسخه های قبلی Expect استفاده می کنند، منطقی همراه با آن هنوز معتبر هستند و جزئیات بیشتری از صفحه این مرد می گیرند.

کادوها

برنامه های افزودنی ممکن است با نام فرمان Expect برخورد کنند. برای مثال، ارسال توسط Tk برای یک هدف کاملا متفاوت تعریف شده است. به همین دلیل، بیشتر دستورات Expect نیز به عنوان exp_XXXX در دسترس هستند. دستورات و متغیرهایی که از "exp"، "inter"، "spawn" و "timeout" شروع می شوند، نامهای مستعار ندارند. اگر به این سازگاری بین محیط نیاز دارید، از نامهای فرمان extended استفاده کنید.

انتظار می رود دیدگاه نسبتا لیبرال از دامنه. به طور خاص، متغیرهایی که با دستورات خاص برنامه Expect خوانده می شوند، ابتدا از محدوده محلی جستجو می شود و اگر در یافت نشد، در محدوده جهانی. به عنوان مثال، این مانع نیاز به قرار دادن "وقفه جهانی" در هر روشی است که می نویسید که از آن انتظار می رود . از سوی دیگر، متغیرهای نوشته شده همیشه در محدوده محلی هستند (مگر اینکه فرمان "جهانی" صادر شده باشد). شایع ترین مشکل این است که وقتی تخم ریزی انجام می شود در یک روش اجرا می شود. در خارج از این روش، spawn_id دیگر وجود ندارد، بنابراین فرایند تولید شده به دلیل محدودیت در دسترس نیست. یک "spawn_id جهانی" را به یک روش اضافه کنید.

اگر نمیتوانید قابلیت چندگانه را فعال کنید (یعنی سیستم شما از انتخاب (BSD *. *)، نظرسنجی (SVR> 2) یا چیزی معادل آن را پشتیبانی نمی کند، انتظار می رود تنها یک فرایند را در یک زمان کنترل کند. در این حالت، سعی نکنید spawn_id را تنظیم کنید و همچنین فرآیندهای را از طریق exec اجرا نکنید در حالی که فرایند تولید شده در حال اجرا است. علاوه بر این، شما نمیتوانید همزمان از چند فرایند (از جمله کاربر به عنوان یک) انتظار داشته باشید .

پارامترهای ترمینال می تواند تاثیر بزرگی روی اسکریپت ها داشته باشد. به عنوان مثال، اگر یک اسکریپت برای بازخوانی جستجو کند، اگر اکوژن غیرفعال باشد، اشتباه خواهد کرد. به همین دلیل، Expect نیروها به طور پیش فرض پارامترهای ترمینال را بهبود می بخشد. متأسفانه این می تواند چیزهای دیگر را برای برنامه های دیگر ناخوشایند کند. به عنوان مثال، پوسته emacs می خواهد تغییرات "معمولی" را تغییر دهد: خطوط جدید به جای خطوط بازگشت بارگذاری شده به خطوط جدید نقشه برداری می شوند و اکوژن غیر فعال است. این اجازه می دهد تا یکی برای استفاده از emacs برای ویرایش خط ورودی. متاسفانه، Expect این احتمالا نمی تواند حدس بزند.

شما می توانید درخواست کنید که انتظار نداشته باشید تنظیم پیش فرض خود را از پارامترهای ترمینال، اما شما باید هنگام نوشتن اسکریپت ها برای چنین محیطی بسیار مراقب باشید. در مورد emacs، از وابستگی به چیزهایی نظیر تکیه دادن و پایان دادن به خط، اجتناب کنید.

دستورالعملهایی که آرگومان را پذیرفتهاند به یک لیست واحد (انواع انتظار میرود و تعامل دارند ) از اکتشافی استفاده میکنند تا تصمیم بگیرند که آیا لیست واقعا یک بحث یا چند است. اکتشافی می تواند تنها در مورد شکست رخ دهد که لیست واقعا یک آرگومان واحد را نشان می دهد که چندین جاسازی شده \ n با شخصیت های غیر فضایی بین آنها دارند. به نظر می رسد این به اندازه کافی غیرممکن است، با این حال استدلال "-nobrace" می تواند مورد استفاده قرار گیرد تا یک آرگومان واحد را به عنوان یک آرگومان در نظر بگیرد. این احتمالا می تواند با Code Expected Code تولید شود. به طور مشابه، جابجایی یک آرگومان واحد را به عنوان چندین الگوی / اقدام انجام می دهد.

اشکالات

این واقعا وسوسهانگیز بود که برنامه "جنسیت" (برای "Smart EXec" یا "Send-EXpect") نامگذاری شود، اما حس قوی (یا شاید فقط Puritanism) غلبه کرد.

در بعضی از سیستم ها زمانی که یک پوسته ایجاد می شود، شکایت می کند که قادر به دسترسی به tty نیست اما به هر حال اجرا می شود. این به این معنی است که سیستم شما مکانیزمی برای به دست آوردن کنترل Tty است که انتظار نداشته باشد. لطفا آنچه را پیدا کرده اید، و این اطلاعات را به من ارسال کنید.

Ultrix 4.1 (حداقل آخرین نسخه های اطراف اینجا) زمان بندی بیش از 1000000 را معادل 0 می داند.

یونیکس دیجیتال 4.0A (و احتمالا نسخه های دیگر) اگر پیکربندی SIGCHLD را تعریف می کنید، تخصیص ptys را رد نمی کند. برای اطلاعات بیشتر به صفحه grantpt مراجعه کنید.

IRIX 6.0 مجوزهای pty را به درستی اجرا نمی کند، به طوری که اگر Expect تلاش کند تا یک pty را که قبلا توسط شخص دیگری استفاده می شود، نابود کند. ارتقاء به IRIX 6.1.

Telnet (فقط تحت SunOS 4.1.2 تأیید شده است) اگر TERM تنظیم نشده باشد قطع می شود. این یک مشکل در زیر cron، در و در اسکریپت cgi است که TERM را تعریف نمی کنند. بنابراین، شما باید آن را به صورت صریح تنظیم کنید - به نوعی که معمولا بی معنی است. این فقط باید برای چیزی تنظیم شود! احتمالا برای اکثر موارد بیشتر است.

تنظیم env (TERM) vt100

نکته (فقط تحت BSDI BSD / OS 3.1 i386 تأیید شده است) اگر SHELL و HOME تنظیم نشده باشند، آویزان می شوند. این یک مشکل در زیر cron ، در و در اسکریپت cgi است که این متغیرهای محیطی را تعریف نمی کنند. بنابراین، شما باید آنها را به صورت صریح تنظیم کنید - به نوعی که معمولا بی معنی است. این فقط باید برای چیزی تنظیم شود! احتمالا برای اکثر موارد بیشتر است.

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

برخی از پیاده سازی های ptys به طوری طراحی شده اند که پس از پردازش ، توصیفگر فایل بسته شده، هر خروجی خوانده نشده پس از 10 تا 15 ثانیه (تعداد واقعی وابسته به پیاده سازی) است. بنابراین انتظار برنامه هایی مانند

20 دقیقه انتظار کشف کنید

شکست خواهد خورد. برای اجتناب از این، برنامه های غیر تعاملی را با اکسپرس به جای تخم ریزی فراخوانی کنید. در حالی که چنین شرایطی قابل تصور است، در عمل من هرگز با شرایطی مواجه نیستم که در نهایت نتیجه نهایی یک برنامه واقعا تعاملی به دلیل این رفتار از بین می رود.

از سوی دیگر، Cray UNICOS هر خروجی نادرست را بلافاصله پس از فرآیند توضیحات فایل را بسته است. من این را به Cray گزارش کرده ام و آنها در حال اصلاح هستند.

گاهی اوقات یک تأخیر بین یک فوری و یک پاسخ ضروری است، مانند زمانی که یک رابط tty تغییرات تنظیمات UART یا تطبیق نرخ باند را با جستجوی بیت شروع / توقف متوقف می کند. معمولا این همه نیاز است که برای یک یا دو دقیقه دیگر بخوابیم. تکنیک قوی تر این است که دوباره تلاش کنید تا سخت افزار آماده دریافت ورودی باشد. مثال زیر از هر دو استراتژی استفاده می کند:

ارسال "سرعت 9600 \ r"؛ خواب 1 انتظار {timeout {ارسال '\ r "؛ exp_continue} $ prompt}

دامنه کد با هر فرمانی که در حلقه رویداد Tcl، مانند خواب، نشسته است، کار نخواهد کرد. مشکل این است که در حلقه رویداد، Tcl از کد های بازگشت از پردازنده های رویداد async دور می شود. یک راه حل این است که پرچم در کد تله را تنظیم کنید. سپس بلافاصله پس از فرمان (یعنی خواب) را بررسی کنید.

دستور expect_background نادیده گرفتن استدلالهای زمانبندی است و به طور کلی مفهوم زمانبندی را ندارد.

& # 34؛ انتظارات EXPECT & # 34؛

چند مورد در مورد انتظار وجود دارد که ممکن است غیر شهودی باشد. این بخش تلاش می کند تا با برخی از پیشنهادات برخی از این موارد را رفع کند.

یک مشکل معمول انتظار می رود نحوه تشخیص پوسته ها باشد. از آنجایی که اینها به صورت متفاوت توسط افراد مختلف و پوسته های مختلف سفارشی می شوند، rlogin به راحتی قابل حمل می باشد بدون دانستن سریع. یک توافق منطقی این است که کاربران یک عبارت منظم را، که سریع (مخصوصا پایان آن) را در EXPECT_PROMPT محیط زیست توصیف می کنند، ذخیره کنند. کد زیر می تواند مورد استفاده قرار گیرد. اگر EXPECT_PROMPT وجود نداشته باشد، کد هنوز شانس خوبی برای عملکرد درست دارد.

set prompt "(٪ | # | \\ $) $"؛ # default prompt catch {set prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

من شما را تشویق میکنم که الگوهایی را امتحان کنید که شامل همه چیزهایی هستند که انتظار دارید ببینید. این مسئله پیش از دیدن کل چیز امکان پاسخ دادن به سوال را از بین می برد. علاوه بر این، در صورتی که شما به زودی پاسخ دهید، ممکن است بتوانید به سؤالات قبل از دیدن آنها به طور کامل پاسخ دهید. به عبارت دیگر، گفتگو نتیجه درست خواهد بود اما به نظر می رسد.

اکثر دعوت ها عبارتند از یک شخصیت فضایی در انتها. به عنوان مثال، فوری از ftp 'f'، 't'، 'p'، '>' و. برای مطابقت با این فوری، شما باید برای هر یک از این شخصیت ها حساب کنید. اشتباه رایج این است که خالی را وارد نکنید. خالی بگذارید به صراحت

اگر شما از الگوی فرم X * استفاده می کنید، * تمام خروجی های دریافت شده از انتهای X را به آخرین چیزی که دریافت می شود مطابقت می دهد. این به نظر شهودی است اما می تواند تا حدودی گیج کننده باشد زیرا عبارت «آخرین چیزی که دریافت شده» می تواند بسته به سرعت کامپیوتر و پردازش I / O هر دو توسط هسته و درایور دستگاه متفاوت باشد.

به طور خاص، انسان ها تمایل دارند که خروجی برنامه ها را در قسمت های بزرگ (به صورت اتمی) ببینند، در حقیقت اکثر برنامه ها یک خط در یک زمان تولید می کنند. فرض کنید این مورد است، * در الگوی پاراگراف قبلی ممکن است تنها با پایان خط فعلی مطابقت داشته باشد، گرچه به نظر می رسد که بیشتر باشد، زیرا در زمان مسابقه که تمام خروجی که دریافت شده بود، بود.

انتظار نداشته باشید که بدانید خروجی بیشتر در آینده است مگر اینکه الگوی شما به طور خاص برای آن حساب شود.

حتی با توجه به بافر خطی گرا، ناعادلانه است. نه تنها برنامه ها به ندرت وعده هایی در مورد نوع بافر بودن انجام می دهند، بلكه سیستم گوارشی می تواند خطوط خروجی را از بین ببرد تا خطوط به نظر می رسد در موقعیت های تصادفی شكسته شوند. بنابراین، اگر بتوانید چندین کاراکتر نویسی سریع را هنگام نوشتن الگوهای بیان کنید، این عاقلانه است که این کار را انجام دهید.

اگر منتظر یک الگوی در آخرین خروجی یک برنامه هستید و برنامه به جای آن چیز دیگری را منتشر می کند، شما نمی توانید آن را با کلمه کلیدی timeout شناسایی کنید. دلیل این امر این است که انتظار نداشته باشید - به جای آن یک نشانه eof دریافت خواهد کرد. از آن استفاده کنید. حتی بهتر از هر دو استفاده کنید به این ترتیب اگر این خط همیشه حرکت کند، شما مجبور نیستید خط خود را ویرایش کنید.

Newlines معمولا در هنگام خروجی توسط راننده ترمینال، به ترتیب بارکشی، خطوط خطی تبدیل می شوند. بنابراین، اگر شما می خواهید یک الگوی که به صراحت با دو خط منطبق باشد، از، sayf، printf ("foo \ nbar")، شما باید از الگوی "foo \ r \ nbar" استفاده کنید.

ترجمه مشابهی هنگام خواندن از کاربر، از طریق expect_user رخ می دهد. در این حالت، هنگامی که شما فشار را فشار دهید، آن را به یک خط جدید ترجمه می شود. اگر Expect سپس آن را به یک برنامه که ترمینال آن را به حالت خام (مانند telnet) می رساند منتقل می شود، به عنوان یک برنامه در انتظار بازگشت واقعی است. (بعضی از برنامه ها در واقع گمراه کننده هستند، به طوری که آنها به صورت اتوماتیک خطوط خطوط جدید را برای بازگشت به کار می اندازند، اما اکثر آنها را انجام نمی دهند.) متاسفانه هیچ راهی برای پیدا کردن آن وجود ندارد که یک برنامه ترمینال خود را به حالت خام تبدیل کند.

به جای جایگزینی خطوط جدید با بازگشت، دستیابی به دستور "stty raw" است که ترجمه را متوقف می کند. توجه داشته باشید، اما این بدان معنی است که شما دیگر ویژگی های ویرایش خط تولید را دریافت نخواهید کرد.

تعامل به طور ضمنی ترمینال شما را به حالت خام تعریف می کند تا این مشکل پیش نیاید.

اغلب مفید است برای ذخیره کلمات عبور (یا سایر اطلاعات خصوصی) در اسکریپت Expect . این توصیه نمی شود زیرا هر چیزی که در رایانه ذخیره می شود حساس به دسترسی هر کسی است. بنابراین، تعاملی برای کلمات عبور از یک اسکریپت، یک ایده هوشمندانه تر از تعبیه آنها به معنای واقعی کلمه است. با این حال، گاهی اوقات چنین تعبیری تنها امکان است.

متاسفانه، سیستم فایل یونیکس هیچ راهی مستقیم برای ایجاد اسکریپت هایی که اجرایی هستند اما قابل خواندن نیستند. سیستم هایی که اسکریپت های shell را پشتیبانی می کنند ممکن است به طور غیرمستقیم این را به صورت زیر شبیه سازی کنند:

اسکریپت Expect (که حاوی داده های مخفی است) را به طور معمول ایجاد کنید. مجوزهای آن 750 (-rwxr-x ---) و متعلق به یک گروه قابل اعتماد است، یعنی گروهی که مجاز به خواندن آن است. در صورت لزوم، یک گروه جدید برای این منظور ایجاد کنید. بعد، یک اسکریپت / bin / sh ایجاد کنید با مجوز 2751 (-rwxr-s-x) متعلق به گروه مشابه همانند قبل است.

نتیجه یک اسکریپت است که ممکن است توسط هر کسی اجرا شود (و خوانده شود). هنگامی که فراخوانی می شود، اسکریپت Expect اجرا می شود.

& # 34؛ همچنین ببینید & # 34؛

Tcl (3)، libexpect (3)
"کاوش انتظار: مجموعه ابزار مبتنی بر Tcl برای اتوماسیون برنامه های تعاملی" توسط دان لییبز، ص 602، ISBN 1-56592-090-2، O'Reilly و همکاران، 1995.
"انتظار: درمان این موارد غیر قابل کنترل از تعامل" توسط دان لیبس، مقالات کنفرانس USENIX تابستان 1990، آناهیم، ​​کالیفرنیا، ژوئن 11-15، 1990.
"با استفاده از انتظارات به منظور خودکار سازی وظایف مدیریت سیستم" توسط دان لیبس، مقالات کنفرانس مدیریت نصب سیستم های بزرگ USENIX سال 1990، کلرادو اسپرینگز، کلرادو، 17-19 اکتبر 1990.
.I "Tcl: یک زبان فرمان قابل تعویض" توسط جان اوستر هات، مجموعه مقالات کنفرانس USENIX 1990 زمستان، واشنگتن دی سی، 22-26 ژانویه، 1990. "انتظار: اسکریپت برای کنترل برنامه های تعاملی" توسط دان لییبس، سیستم های محاسبات ، جلد 4، شماره 2، مجلات دانشگاهی کالیفرنیا، نوامبر 1991. من "تست رگرسیون و تطبیق برنامه های تعاملی"، توسط دان لیبس، مقالات تابستان 1992 کنفرانس USENIX، صفحات 135-144، سن آنتونیو، TX، 12-15 ژوئن 1992. من "Kibitz - اتصال برنامه های چندگانه تعاملی با هم"، توسط دان Libes، نرم افزار - تمرین و تجربه، جان ویل و پسران، غرب ساسکس، انگلستان، جلد.

23، No. 5، May 1993. "یک اشکال زدایی برای برنامه های Tcl"، توسط دان لیبس، مقالات کارگاه Tcl / Tk 1993، برکلی، CA، 10-11 ژوئن 1993.

نویسنده

دان Libes، موسسه ملی استاندارد و فناوری

تعهدات

با تشکر از جان Ousterhout برای Tcl، و اسکات Paisley برای الهام بخش. با تشکر از راب Savoye برای کد Autoconfiguration Expect.

پرونده HISTORY بیشتر تکامل انتظارات را نشان می دهد . این باعث می شود خواندن جالب و ممکن است به شما بیشتر درک به این نرم افزار. با تشکر از مردم ذکر شده در آن که به من رفع اشکالات ارسال و کمک های دیگر.

طراحی و پیاده سازی Expect بخشی از سوی دولت آمریکا پرداخت شده و از این رو در حوزه عمومی است. با این حال نویسنده و NIST مایل به اعتبار هستند اگر این برنامه و اسناد و یا بخشی از آنها مورد استفاده قرار گیرد.