.TH AUTOEXPECT 1 "30 June 1995" .SH "نام (NAME)" autoexpect \- تولید اسکریپت Expect از طریق نظارت بر یک نشست تعاملی .SH "خلاصه دستور (SYNOPSIS)" .B autoexpect [ .I آرگومان‌ها ] [ .I برنامه آرگومان‌ها... ] .br .SH "مقدمه (INTRODUCTION)" دستور .B autoexpect تعامل شما با یک برنامه دیگر را زیر نظر می‌گیرد و یک اسکریپت .B Expect ایجاد می‌کند که تعاملات شما را بازتولید می‌نماید. برای اسکریپت‌های خطی و سرراست، .B autoexpect زمان قابل‌توجهی را در مقایسه با نوشتن دستی اسکریپت‌ها ذخیره می‌کند. حتی اگر در .B Expect متخصص باشید، استفاده از .B autoexpect را برای خودکارسازی بخش‌های خسته‌کننده‌تر و تکراری تعاملات بسیار راحت خواهید یافت. برش و چسباندن (cut/paste) تکه‌های اسکریپت‌های .B autoexpect به یکدیگر بسیار آسان‌تر از نوشتن آن‌ها از ابتدا است. و اگر مبتدی باشید، ممکن است بتوانید بدون یادگیری چیز بیشتری از .B Expect به‌جز نحوه فراخوانی .BR autoexpect ، کارتان را راه بیندازید. ساده‌ترین روش استفاده از .B autoexpect فراخوانی آن از خط فرمان بدون هیچ آرگومانی است. برای مثال: % autoexpect به‌طور پیش‌فرض، .B autoexpect یک شل برای شما اجرا می‌کند. در صورت ارائه نام برنامه و آرگومان‌ها، .B autoexpect آن برنامه را اجرا می‌کند. برای مثال: % autoexpect ftp ftp.cme.nist.gov پس از اجرای برنامه، به‌صورت عادی با آن تعامل کنید. هنگامی که از شل (یا برنامه‌ای که مشخص کرده‌اید) خارج شدید، .B autoexpect یک اسکریپت جدید برای شما ایجاد خواهد کرد. به‌طور پیش‌فرض، .B autoexpect اسکریپت جدید را در "script.exp" ذخیره می‌کند. می‌توانید این مقدار را با گزینه .B \-f همراه با نام اسکریپت جدید تغییر دهید. مثال زیر دستور "ftp ftp.cme.nist.gov" را اجرا کرده و اسکریپت .B Expect حاصل را در فایل "nist" ذخیره می‌کند. .nf % autoexpect \-f nist ftp ftp.cme.nist.gov .fi درک این نکته مهم است که .B autoexpect کارکرد بی‌نقص اسکریپت را تضمین نمی‌کند، زیرا ناگزیر است درباره برخی موارد حدس بزند \- و گاهی اوقات اشتباه حدس می‌زند. با این حال، شناسایی و رفع این مشکلات معمولاً بسیار آسان است. مشکلات معمول عبارتند از: .RS .TP 4 \(bu زمان‌بندی (Timing). تعداد شگفت‌آوری از برنامه‌ها (مانند rn، ksh، zsh، telnet و غیره) و دستگاه‌ها (مانند مودم‌ها) کلیدهایی را که "خیلی سریع" پس از اعلان‌ها (prompts) ارسال می‌شوند نادیده می‌گیرند. اگر متوجه شدید اسکریپت جدید شما در یک نقطه متوقف می‌شود، سعی کنید یک مکث کوتاه (sleep) درست پیش از ارسال (send) قبلی اضافه کنید. می‌توانید این رفتار را با تغییر متغیر "force_conservative" در نزدیکی ابتدای اسکریپت تولیدشده، در سراسر آن اعمال کنید. این حالت "محافظه‌کارانه" باعث می‌شود .B autoexpect به‌طور خودکار پیش از ارسال هر نویسه، مکث کوتاهی (یک دهم ثانیه) انجام دهد. این کار همه برنامه‌های شناخته‌شده را آرام و سازگار می‌کند. این حالت محافظه‌کارانه زمانی مفید است که بخواهید سریعاً مطمئن شوید مشکل از زمان‌بندی است (یا اگر سرعت اجرای اسکریپت اهمیت چندانی برایتان ندارد). همین حالت را می‌توان پیش از تولید اسکریپت با استفاده از گزینه .B \-c نیز اجبار کرد. خوشبختانه، این نقاط حساس به زمان‌بندی نادر هستند. برای مثال، telnet نویسه‌ها را تنها پس از ورود به توالی فرار (escape sequence) خود نادیده می‌گیرد. مودم‌ها نویسه‌ها را تنها بلافاصله پس از اولین اتصال نادیده می‌گیرند. تعداد کمی از برنامه‌ها همیشه این رفتار را نشان می‌دهند اما معمولاً سوییچی برای غیرفعال کردن آن دارند. برای مثال، گزینه .B \-T در برنامه rn این رفتار را غیرفعال می‌کند. مثال زیر .B autoexpect را در حالت محافظه‌کارانه اجرا می‌کند. .nf autoexpect \-c .fi گزینه .B \-C کلیدی را برای تغییر وضعیت (toggle) حالت محافظه‌کارانه تعیین می‌کند. مثال زیر .B autoexpect را (در حالت غیرمحافظه‌کارانه) با کلید ^L به‌عنوان کلید تغییر وضعیت شروع می‌کند. (توجه داشته باشید که ^L به‌صورت لفظی وارد می‌شود - یعنی یک control-L واقعی وارد کنید). .nf autoexpect \-C ^L .fi مثال زیر .B autoexpect را در حالت محافظه‌کارانه با کلید ^L به‌عنوان تغییر وضعیت شروع می‌کند. .nf autoexpect \-c \-C ^L .fi .TP \(bu پژواک نویسه‌ها (Echoing). بسیاری از برنامه‌ها نویسه‌ها را پژواک (echo) می‌کنند. برای مثال، اگر در یک شل عبارت "more" را تایپ کنید، آنچه .B autoexpect می‌بیند به این صورت است: .nf شما 'm' را تایپ کردید، رایانه 'm' را تایپ کرد، شما 'o' را تایپ کردید، رایانه 'o' را تایپ کرد، شما 'r' را تایپ کردید، رایانه 'r' را تایپ کرد، ... .fi بدون داشتن دانش مشخص درباره برنامه، غیرممکن است بدانیم آیا منتظر دیدن پژواک هر نویسه پیش از تایپ نویسه بعدی بوده‌اید یا خیر. اگر .B autoexpect ببیند که نویسه‌ها پژواک می‌شوند، فرض می‌کند که می‌تواند همه آن‌ها را به‌صورت یک گروه ارسال کند، نه اینکه آن‌ها را به همان ترتیبی که در ابتدا ظاهر شدند در هم بیامیزد. این کار خوانایی اسکریپت را بسیار بهتر می‌کند. با این حال، اگر واقعاً لازم بوده منتظر پژواک تک‌تک نویسه‌ها بمانید، ممکن است رفتار تولیدشده نادرست باشد. .TP \(bu تغییرات خروجی (Change). ابزار .B autoexpect تمام نویسه‌های تعامل را در اسکریپت ثبت می‌کند. این کار مطلوب است زیرا به شما امکان می‌دهد درباره آنچه مهم است و آنچه می‌تواند با تطبیق الگو جایگزین شود قضاوت کنید. از سوی دیگر، اگر از دستوراتی استفاده کنید که خروجی آن‌ها از یک اجرا به اجرای دیگر تغییر می‌کند، اسکریپت‌های تولیدشده درست کار نخواهند کرد. برای مثال، دستور "date" همیشه خروجی متفاوتی تولید می‌کند. بنابراین استفاده از دستور date هنگام اجرای .B autoexpect روشی مطمئن برای تولید اسکریپتی است که برای کارکرد صحیح نیازمند ویرایش دستی خواهد بود. گزینه .B \-p ابزار .B autoexpect را در "حالت اعلان" (prompt mode) قرار می‌دهد. در این حالت، .B autoexpect تنها به دنبال آخرین خط از خروجی برنامه \- که معمولاً اعلان (prompt) است \- می‌گردد. این کار مشکل دستور date (به بالا مراجعه کنید) و اکثر موارد دیگر را برطرف می‌کند. مثال زیر .B autoexpect را در حالت اعلان اجرا می‌کند. .nf autoexpect \-p .fi گزینه .B \-P کلیدی را برای تغییر وضعیت حالت اعلان تعریف می‌کند. مثال زیر .B autoexpect را (در حالت غیر اعلان) با کلید ^P به‌عنوان تغییر وضعیت شروع می‌کند. توجه داشته باشید که ^P به‌صورت لفظی وارد می‌شود - یعنی یک control-P واقعی وارد کنید. .nf autoexpect \-P ^P .fi مثال زیر .B autoexpect را در حالت اعلان با کلید ^P به‌عنوان تغییر وضعیت شروع می‌کند. .nf autoexpect \-p \-P ^P .fi .SH "سایر گزینه‌ها (OTHER FLAGS)" گزینه .B \-quiet پیام‌های اطلاع‌رسانی تولیدشده توسط .B autoexpect را غیرفعال می‌کند. گزینه .B \-Q یک نویسه نقل‌قول (quote character) تعیین می‌کند که می‌تواند برای وارد کردن نویسه‌هایی استفاده شود که .B autoexpect به دلیل استفاده به‌عنوان کلید تغییر وضعیت آن‌ها را مصرف می‌کرد. مثال زیر تعدادی گزینه را همراه با نویسه نقل‌قول نشان می‌دهد که روشی برای ورود لفظی کلیدهای تغییر وضعیت فراهم می‌کند. .nf autoexpect \-P ^P \-C ^L \-Q ^Q .fi .SH "سبک نگارش (STYLE)" نمی‌دانم آیا "سبک خاصی" برای برنامه‌های Expect وجود دارد یا خیر، اما .B autoexpect قطعاً نباید به‌عنوان الگویی برای سبک نگارش در نظر گرفته شود. برای مثال، .B autoexpect از قابلیت‌هایی از Expect استفاده می‌کند که مشخصاً برای اسکریپت‌نویسی تولیدشده توسط رایانه در نظر گرفته شده‌اند. بنابراین سعی نکنید اسکریپت‌ها را دقیقاً به شکلی بنویسید که گویی توسط .B autoexpect تولید شده‌اند؛ این کار سودی ندارد. از سوی دیگر، اسکریپت‌های .B autoexpect برخی نکات ارزشمند را نشان می‌دهند. برای مثال، می‌توانید با عبور دادن رشته‌ها از .BR autoexpect ، به‌سادگی مشاهده کنید که هر رشته برای استفاده در یک اسکریپت Tcl چگونه باید نقل‌قول (quote) شود. .SH "همچنین ببینید (SEE ALSO)" .I "Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs" \fRby Don Libes, O'Reilly and Associates, January 1995. .SH "نویسنده (AUTHOR)" Don Libes, National Institute of Standards and Technology دستورهای .B expect و .B autoexpect در مالکیت عمومی (public domain) قرار دارند. موسسه NIST و نویسنده در صورت استفاده از این برنامه‌ها یا بخش‌هایی از آن‌ها، از ذکر نام و ارجاع قدردانی خواهند کرد.