tset(1) دستورات کاربر tset(1)

tset - مقداردهی اولیه و تنظیم ویژگیهای ترمینال

tset [-IQVcqrsw] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal-type]
reset [-IQVcqrsw] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal-type]

این برنامه ترمینال‌ها را مقداردهی اولیه می‌کند.

ابتدا، tset تنظیمات حالت فعلی ترمینال شما را بازیابی می‌کند. این کار با آزمودن متوالی موارد زیر انجام می‌شود:

  • خطای استاندارد،
  • خروجی استاندارد،
  • ورودی استاندارد و
  • در نهایت “/dev/tty”

تا تنظیمات ترمینال به دست آید. پس از دریافت این تنظیمات، tset به خاطر می‌سپارد که هنگام به‌روزرسانی تنظیمات از کدام توصیف‌گر فایل استفاده کند.

سپس، tset نوع ترمینالی را که استفاده می‌کنید تعیین می‌کند. این تعیین با استفاده از اولین نوع ترمینال یافت‌شده به صورت زیر انجام می‌پذیرد:

۱. آرگومان terminal که در خط فرمان مشخص شده است.

۲. مقدار متغیر محیطی TERM.

۳. (فقط در سیستم‌های BSD.) نوع ترمینال مرتبط با دستگاه خروجی خطای استاندارد در فایل /etc/ttys. (در میزبان‌های System V و سیستم‌هایی که از آن شیوه استفاده می‌کنند، getty(8) این کار را با تنظیم TERM بر اساس نوعی که از طریق /etc/inittab به آن ارسال شده است، انجام می‌دهد.)

۴. نوع ترمینال پیش‌فرض، “unknown”، که برای برنامه‌های curses مناسب نیست.

اگر نوع ترمینال در خط فرمان مشخص نشده باشد، نگاشت‌های گزینه -m اعمال می‌شوند؛ بخش “نگاشت نوع ترمینال (Terminal Type Mapping)” را ببینید. سپس، اگر نوع ترمینال با علامت سوال (“?”) آغاز شود، از کاربر تاییدیه نوع ترمینال خواسته می‌شود. یک پاسخ خالی نوع ترمینال را تایید می‌کند، یا می‌توان نوع دیگری را برای مشخص کردن یک نوع جدید وارد نمود. پس از تعیین نوع ترمینال، توصیف مربوط به آن ترمینال بازیابی می‌شود. اگر هیچ توصیفی برای آن نوع ترمینال یافت نشود، از کاربر خواسته می‌شود تا نوع ترمینال دیگری را وارد کند.

پس از بازیابی توصیف ترمینال:

•
اگر گزینه “-w” فعال باشد، tset ممکن است اندازه پنجره ترمینال را به‌روزرسانی کند.
اگر اندازه پنجره از سیستم‌عامل قابل دریافت نباشد، اما توصیف ترمینال (یا محیط، به عنوان مثال متغیرهای LINES و COLUMNS) آن را مشخص کرده باشند، از این مقادیر برای تنظیم اندازه پنجره در سیستم‌عامل استفاده می‌شود.
  • اگر گزینه “-c” فعال باشد، نویسه‌های backspace، وقفه (interrupt) و حذف خط (line kill) (در میان بسیاری از موارد دیگر) تنظیم می‌شوند.
  • مگر در حالتی که گزینه “-I” فعال باشد، رشته‌های مقداردهی اولیه ترمینال و تب‌ها به خروجی خطای استاندارد ارسال می‌شوند، و اگر دستگاه ترمینال یک شبه‌ترمینال (pseudoterminal، همان‌طور که ممکن است توسط یک برنامه شبیه‌ساز ترمینال استفاده شود) به نظر نرسد، tset یک ثانیه صبر می‌کند تا در صورت ارسال بازنشانی سخت‌افزاری، فرصت اعمال داده شود.
  • در نهایت، اگر نویسه‌های erase، وقفه (interrupt) و حذف خط (line kill) تغییر کرده باشند، یا روی مقادیر پیش‌فرض خود تنظیم نشده باشند، مقادیر آن‌ها در خروجی خطای استاندارد نمایش داده می‌شود.

هنگامی که به عنوان reset فراخوانی شود، tset حالت‌های ترمینال را روی مقادیر “معقول (sane)” تنظیم می‌کند:

  • حالت‌های متعارف (“cooked”) و echo را تنظیم می‌کند،
  • حالت‌های cbreak و raw را غیرفعال می‌کند،
  • ترجمه خط جدید (newline translation) را فعال می‌سازد، و
  • نویسه‌های ورودی ویژه را به مقادیر پیش‌فرض خود بازنشانی می‌کند

پیش از آنکه مقداردهی اولیه ترمینال را که در بالا شرح داده شد انجام دهد. همچنین به جای استفاده از رشته‌های مقداردهی اولیه ترمینال، از رشته‌های بازنشانی (reset) ترمینال استفاده می‌کند.

دستور reset زمانی مفید است که پس از پایان غیرعادی یک برنامه، ترمینال در وضعیتی غیرعادی و نامتعارف رها شده باشد:

  • ممکن است لازم باشد عبارت زیر را تایپ کنید:


    <LF>reset<LF>

    (نویسه خط‌خور یا line-feed معمولاً کنترل-J است) تا ترمینال به کار بیفتد، چرا که carriage-return ممکن است در وضعیت غیرعادی دیگر عمل نکند.

  • همچنین، ترمینال اغلب این دستور را منعکس (echo) نخواهد کرد.

اغلب مطلوب است که نوع ترمینال و اطلاعات مربوط به قابلیت‌های آن در محیط پوسته وارد شوند. این کار با استفاده از گزینه -s انجام می‌پذیرد.

هنگامی که گزینه -s مشخص شود، دستورات مربوط به ورود اطلاعات به محیط پوسته در خروجی استاندارد نوشته می‌شوند. اگر متغیر محیطی SHELL به “csh” ختم شود، دستورات برای csh(1) صادر می‌شوند؛ در غیر این صورت، برای sh(1) خواهند بود. دستورات csh متغیر پوسته noglob را تنظیم و بازنشانی می‌کنند و آن را در وضعیت تنظیم‌نشده باقی می‌گذارند. خط زیر در فایل‌های .login یا .profile محیط را به درستی مقداردهی اولیه می‌کند:


eval `tset -s options ... `

هنگامی که ترمینال به صورت سخت‌افزاری به سیستم متصل نیست (یا اطلاعات فعلی سیستم نادرست است)، نوع ترمینال به دست آمده از فایل /etc/ttys یا متغیر محیطی TERM اغلب مقداری عمومی مانند network، dialup یا unknown است. هنگامی که tset در یک اسکریپت راه‌اندازی استفاده می‌شود، اغلب مطلوب است که اطلاعات مربوط به نوع ترمینالِ استفاده‌شده روی چنین پورت‌هایی ارائه شود.

گزینه -m مجموعه‌ای از شرایط را به یک نوع ترمینال نگاشت می‌کند؛ یعنی به tset می‌گوید: “اگر من روی این پورت با سرعت مشخصی هستم، حدس بزن که پشت آن نوع ترمینال قرار دارم”.

آرگومان گزینه -m شامل یک نوع پورت اختیاری، یک عملگر اختیاری، مشخصه نرخ باود (baud rate) اختیاری، نویسه دو نقطه (“:”) اختیاری و یک نوع ترمینال است. نوع پورت یک رشته است (که توسط عملگر یا نویسه دو نقطه تفکیک می‌شود). عملگر می‌تواند هر ترکیبی از “>”، “<”، “@” و “!” باشد؛ “>” به معنای بزرگ‌تر از، “<” به معنای کوچک‌تر از، “@” به معنای برابر با، و “!” جهت آزمون را معکوس می‌کند. نرخ باود به صورت یک عدد مشخص می‌شود و با سرعت خروجی خطای استاندارد (که باید ترمینال کنترل‌کننده باشد) مقایسه می‌گردد. نوع ترمینال یک رشته است.

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

به عنوان مثال، نگاشت زیر را در نظر بگیرید: dialup>9600:vt100. نوع پورت dialup، عملگر >، مشخصه نرخ باود 9600، و نوع ترمینال vt100 است. نتیجه این نگاشت مشخص می‌کند که اگر نوع ترمینال dialup بوده و نرخ باود بیشتر از ۹۶۰۰ باود باشد، نوع ترمینال vt100 استفاده خواهد شد.

اگر هیچ نرخ باودی مشخص نشود، نوع ترمینال با هر نرخ باودی مطابقت خواهد داشت. اگر هیچ نوع پورتی مشخص نشود، نوع ترمینال با هر نوع پورتی مطابقت دارد. به عنوان مثال، -m dialup:vt100 -m :?xterm باعث می‌شود هر پورت dialup صرف‌نظر از نرخ باود با نوع ترمینال vt100 مطابقت یابد، و هر نوع پورت غیر dialup با نوع ترمینال ?xterm تطبیق داده شود. توجه داشته باشید که به دلیل علامت سوال ابتدایی، در یک پورت پیش‌فرض از کاربر سوال می‌شود که آیا واقعاً از ترمینال xterm استفاده می‌کند یا خیر.

استفاده از نویسه‌های فاصله (whitespace) در آرگومان گزینه -m مجاز نیست. همچنین، برای جلوگیری از بروز مشکل با نویسه‌های متا (meta-characters)، پیشنهاد می‌شود که کل آرگومان گزینه -m درون نویسه‌های نقل‌قول تکی (single quote) قرار گیرد، و کاربران csh پیش از هر علامت تعجب (“!”) یک نویسه بک‌اسلش (“\”) درج کنند.

گزینه‌ها به شرح زیر هستند:

تنظیم نویسه‌ها و حالت‌های کنترلی.
تنظیم نویسه پاک کردن (erase) به ch.
عدم ارسال رشته‌های مقداردهی اولیه ترمینال یا تب‌ها به ترمینال.
تنظیم نویسه وقفه (interrupt) به ch.
تنظیم نویسه حذف خط (line kill) به ch.
مشخص کردن یک نگاشت از نوع پورت به ترمینال؛ بخش “نگاشت نوع ترمینال (Terminal Type Mapping)” را ببینید.
عدم نمایش هرگونه مقدار برای نویسه‌های erase، وقفه (interrupt) و حذف خط (line kill). به طور معمول tset مقادیر نویسه‌های کنترلی را که با مقادیر پیش‌فرض سیستم تفاوت دارند نمایش می‌دهد.
نوع ترمینال در خروجی استاندارد نمایش داده می‌شود، و ترمینال به هیچ وجه مقداردهی اولیه نمی‌شود. گزینه “-” به تنهایی معادل این گزینه است اما منسوخ و قدیمی محسوب می‌شود.
چاپ نوع ترمینال در خروجی خطای استاندارد.
چاپ توالی دستورات پوسته برای مقداردهی اولیه متغیر محیطی TERM در خروجی استاندارد؛ بخش “تنظیم محیط (Setting the Environment)” را ببینید.
گزارش نسخه ncurses استفاده‌شده در این برنامه، و خروج.
تغییر اندازه پنجره برای تطابق با اندازه‌ای که از طریق setupterm(3NCURSES) استخراج شده است. به طور معمول این گزینه تاثیری ندارد، مگر اینکه setupterm قادر به تشخیص اندازه پنجره نباشد.

آرگومان‌های گزینه‌های -e، -i و -k می‌توانند هم به صورت نویسه‌های واقعی و هم با استفاده از نمادگذاری “کلاه (hat)” وارد شوند؛ به عنوان مثال، control-h می‌تواند به صورت “^H” یا “^h” مشخص گردد.

اگر هیچ‌یک از گزینه‌های -c یا -w مشخص نشوند، هر دو گزینه پیش‌فرض در نظر گرفته می‌شوند.

دستور tset از این متغیرهای محیطی استفاده می‌کند:

به tset می‌گوید که آیا TERM را با استفاده از نحو sh(1) یا csh(1) مقداردهی اولیه کند.
نشان‌دهنده نوع ترمینال شما است. هر نوع ترمینال متمایز است، هرچند بسیاری مشابه یکدیگرند.
ممکن است مکان یک پایگاه داده termcap را مشخص کند. اگر این متغیر یک مسیر مطلق نباشد (مثلاً با یک “/” شروع نشود)، tset پیش از جستجو برای توصیف ترمینال، متغیر را از محیط حذف می‌کند.

/etc/ttys
پایگاه داده نگاشت نام پورت سیستم به نوع ترمینال (فقط نسخه‌های BSD).
/etc/terminfo
دایرکتوری پایگاه داده کامپایل‌شده توصیف ترمینال

نه استاندارد IEEE Std 1003.1/The Open Group Base Specifications Issue 7 (POSIX.1-2008) و نه X/Open Curses Issue 7 هیچ‌کدام tset یا reset را مستند نکرده‌اند.

ابزار tput متعلق به AT&T در (AIX, HP-UX, Solaris) دستکاری حالت‌های ترمینال و همچنین ویژگی‌های مبتنی بر termcap مانند بازنشانی tabstopها را از tset در BSD (4.1c) ادغام کرد، احتمالاً با این هدف که tset را منسوخ کند. با این حال، هر یک از این سیستم‌ها همچنان tset را ارائه می‌دهند. در واقع، ابزار پرکاربرد reset همواره یک نام مستعار (alias) برای tset است.

ابزار tset سازگاری عقروعلی (backward compatibility) با محیط‌های BSD را فراهم می‌کند؛ تحت اکثر یونیکس‌های امروزی، /etc/inittab و getty(8) می‌توانند TERM را به طور مناسب برای هر خط dial-up تنظیم کنند، که این امر مهم‌ترین کاربرد tset را رفع نیاز می‌کند. این پیاده‌سازی رفتاری مشابه tset در 4.4BSD دارد، با چند استثنا که اکنون بررسی خواهیم کرد.

چند گزینه متفاوت هستند زیرا متغیر TERMCAP دیگر در ncurses مبتنی بر terminfo پشتیبانی نمی‌شود:

  • گزینه -S در tset سیستم‌های BSD دیگر کار نمی‌کند؛ پیام خطایی را در خطای استاندارد چاپ کرده و متوقف می‌شود.
  • گزینه -s فقط TERM را تنظیم می‌کند، نه TERMCAP.

یک ویژگی نامستند در 4.4BSD وجود داشت که در آن فراخوانی tset از طریق پیوندی به نام “TSET” (یا هر نام دیگری که با یک حرف بزرگ آغاز شود) ترمینال را طوری تنظیم می‌کرد که فقط از حروف بزرگ استفاده کند. این ویژگی حذف شده است.

گزینه‌های -A، -E، -h، -u و -v از ابزار tset در 4.4BSD حذف شدند. هیچ‌یک از آن‌ها در 4.3BSD مستند نشده بودند و در بهترین حالت کارایی بسیار محدودی داشتند. گزینه‌های -a، -d و -p نیز به همین ترتیب مستند یا مفید نبودند، اما به دلیل استفاده گسترده حفظ شدند. اکیداً توصیه می‌شود که هرگونه استفاده از این سه گزینه به گزینه -m تغییر یابد. بنابراین، گزینه‌های -a، -d و -p از خلاصه کاربرد در بالا حذف شده‌اند.

سیستم‌های بسیار قدیمی، مانند 3BSD، از یک درایور ترمینال متفاوت استفاده می‌کردند که در اوایل دهه ۱۹۸۰ در 4BSD جایگزین شد. برای تطابق با این سیستم‌های قدیمی‌تر، tset در 4BSD گزینه -n را ارائه کرد تا مشخص شود که درایور ترمینال جدید باید استفاده شود. این پیاده‌سازی چنین گزینه‌ای را ارائه نمی‌دهد.

همچنان مشخص کردن گزینه‌های -e، -i و -k بدون آرگومان مجاز است، اگرچه اکیداً توصیه می‌شود که این کاربردها برای مشخص کردن صریح نویسه اصلاح شوند.

از زمان 4.4BSD، اجرای tset به عنوان reset دیگر متضمن گزینه -Q نیست. همچنین، تداخل میان گزینه - و آرگومان terminal در برخی پیاده‌سازی‌های تاریخی tset حذف شده است.

گزینه‌های -c و -w در پیاده‌سازی‌های پیشین یافت نمی‌شوند. با این حال، یک قابلیت متفاوت تغییر اندازه پنجره در 4.4BSD ارائه شده بود.

  • در 4.4BSD، اگر tset نتواند اندازه پنجره را از سیستم‌عامل به دست آورد، از اندازه پنجره موجود در توصیف termcap برای تنظیم اندازه پنجره استفاده می‌کند.
  • در ncurses، دستور tset اندازه پنجره را با استفاده از setupterm(3NCURSES) به دست می‌آورد که ممکن است از سیستم‌عامل، متغیرهای محیطی LINES و COLUMNS یا توصیف ترمینال باشد.

دریافت اندازه پنجره از توصیف نوع ترمینال بین هر دو پیاده‌سازی مشترک است، اما منسوخ تلقی می‌شود. تنها کاربرد عملی آن برای ترمینال‌های سخت‌افزاری است. به طور کلی، اندازه پنجره تنها در صورتی مقداردهی‌نشده باقی می‌ماند که در دریافت مقدار از سیستم‌عامل مشکلی وجود داشته باشد (و setupterm نیز همچنان با شکست مواجه شود). بنابراین متغیرهای محیطی LINES و COLUMNS ممکن است برای حل مشکلات اندازه پنجره مفید باشند، اما این اشکال را دارند که در صورت تغییر اندازه پنجره، مقادیر آن‌ها باید مجدداً محاسبه و اختصاص داده شوند. برنامه resize(1) که همراه با xterm(1) توزیع شده است به این فرآیند کمک می‌کند.

یک دستور reset نوشته‌شده توسط Kurt Shoens در 1BSD (مارس ۱۹۷۸) ظاهر شد. این دستور نویسه‌های erase و kill را به ترتیب روی ^H (backspace) و @ تنظیم می‌کرد. Mark Horton این دستور reset را در 3BSD (اکتبر ۱۹۷۹) بهبود بخشید، و نویسه‌های intr، quit، start/stop و eof را اضافه کرد و همچنین برنامه را تغییر داد تا از دستکاری تنظیمات کاربری خودداری کند. آن نسخه از reset از termcap استفاده نمی‌کرد.

Eric Allman یک دستور مجزای tset برای 1BSD نوشت، که از یک پیش‌ساز termcap به نام ttycap استفاده می‌کرد. توضیحات Allman در کد منبع نشان می‌دهد که او کار را در اکتبر ۱۹۷۷ آغاز کرد، و توسعه را طی چند سال بعد ادامه داد. در اواخر سال ۱۹۷۹، این دستور به termcap مهاجرت کرد و متغیر TERMCAP را پشتیبانی نمود. توضیحات بعدی نشان می‌دهد که tset در سپتامبر ۱۹۸۰ اصلاح شد تا هنگام فراخوانی به صورت reset از منطق کپی‌شده از برنامه “reset” در 3BSD استفاده کند. این نسخه در 4.1cBSD، در اواخر ۱۹۸۲ ظاهر شد. توسعه‌دهندگان دیگر مانند Keith Bostic و Jim Bloom به اصلاح tset ادامه دادند تا اینکه 4.4BSD در سال ۱۹۹۳ منتشر شد.

پیاده‌سازی ncurses کمی از منابع 4.4BSD اقتباس شد تا توسط Eric S. Raymond <esr@snark.thyrsus.com> برای استفاده از رابط برنامه‌نویسی (API) terminfo آماده شود.

csh(1), sh(1), stty(1), terminfo(3NCURSES), tty(4), terminfo(5), ttys(4), environ(7)

2025-01-18 ncurses 6.5