شوخی با PS1

در هر مطلب مجبورم کمی با ابعاد مختلف صحبت کنم و از دید یک sysadmin/developr/کاربر حرفه‌ای/کار غیر حرفه‌ای صحبت کنم. شاید برای خواننده محترم جالب نباشد، ولی به دلیل تعدد و تکثر خوانندگان در طبقه‌های مختلف مجبور به این امر می‌باشم.
نکته: این مطلب راجع‌به *PS نیست. اندکی صبر ….
به عبارت زیر که در هنگام Prompt دیده می‌شود دقت نمایید:

وقتی برای هر بار برای اجرای فرمان prompt بالا دیده شود مسلماً این در یک متغیری ذخیره شده است. متغیر PS1 جهت انجام اینکار است. محتوای مجاز در این متغیر می‌توانند موارد زیر باشند:

  • a\

  • d\

  • D{format}\

  • e\

  • h\

  • w\

  • W\

  • H\

  • j\

  • I\

  • n\

  • r\

  • s\

  • t\

  • T\

  • @\

  • A\

  • u\

  • v\

  • V\

  • !\

  • #\

  • $\

  • nnn\

  • \\

  • ]\

  • [\

 

پس همانگونه که دیدید می‌توان محتوای PS1 را طبق دلخواه خود تغییر دهیم.

۱. انواع ترمینال :

ترمینال‌ها دارای تعدد زیادی هستند. منظور Terminal Emulator ها نیستند. بلکه VT100 ، VTE و غیره منظور می‌باشد.
برای اینکه هر کاربری برروی هر پلاتفرمی خاص کار می‌کند، تکه کد زیر می‌تواند کل انواع Terminal را بدست آورد:
در ابتدا باید مسیر terminfo را پیدا کنیم:

سپس با مسیر پیدا شده یک find می‌توان حدود ۱۶۵۲ Terminal پیدا کرد. البته بستگی به سیستم شما دارد:

برای توجه بیشتر به انواع Terminal ها می‌توانید دو grep زیر را بهره‌مند شوید:

و یا:

همانگونه که دیدید، فقط چندین گونه VTE و چنیدن گونه vt100 موجود می‌باشد.
نکته: حتماً با برنامه infocmp کار کنید و از option های آن بهره ببرید. گزینه‌های مختلفی دارد که می‌تواند به شما کمک کند. به مثال زیر توجه کنید:

نکته: انواع Terminal با Terminal Emulator ها فرق دارند. از جمله Terminal Emulator ها می‌توان به موارد زیر اشاره کرد:

  • gnome-terminal

  • terminator

  • tilda

  • guake

  • xfce4-terminal

  • konsole

قبل از هر کاری، بهتر است به Standard ECMA-48 سر بزنید. برایتان مفید است.

۲. دستکاری رنگ‌ها

بگذارید قبل از هر چیزی مثال‌ها را با echo پیش ببریم که درک مطلبی از جریان اتفاق بیافتد.
نکته: در چندین حالت می‌توان رنگ‌ها را تغییر داد، پس لطفاً صبوری کنید و به مثال‌ها توجه کنید:

ps1_1
بیایید کمی در مورد تکه کد بالا صحبت کنیم. شاید در قبل از این واژه Escape Sequence را شنیده باشید که دقیقاً در اینجا کاربرد دارد.
اما کد: قبل از کد برای echo پارامتر e- را پاس کردیم تا بتوانیم backslash code ها و مفسرها را فعال کنیم.
033\ ? این همان octal کد دسیمال ۲۷ می‌باشد(hex آن b1 یعنی xb1\ می‌شود.) که قبلاً در برنامه‌نویسی خیلی با آن کارکرده‌ایم. (همان کد اسکی کلید ESC) در‌واقع این کد به string می‌گوید که تازه Escape Code ها شروع شده‌اند.
بعد از آن علامت ] تنها یک شروع را اعلام می‌کند. اما کدام شروع؟ در این نوع کدها چندین نوع کد وجود دارد که جلوتر توضیح داده خواهد شد.
فعلاً به رنگ‌های بالا کاری نداشته باشید و جداول پایین را دریابید.

توصیف

code

‌Bold و روشن می‌کند.

۱

کم نور می‌کند.

۲

Underline می‌گذارد.

۴

چشمک زن می‌کند.

۵

رنگ پس‌زمینه و متن را تعویض می‌کند.

۷

مخفی می‌کند. (بدرد پسورد می‌خورد.)

۸

فرض کنید یک سری صفات را ست کردید. اما راهی برای برگشت وجود دارد؟ بله. جدول بالا را جدول بالا جدول ست کردن و جدول زیر را جدول reset می‌گویند.

توصیف

code

تمام صفات را reset می‌کند.(خیلی کاربرد دارد.)

۰

صفت Bold را reset می‌کند.

۲۱

صفت کم‌نور را reset می‌کند.

۲۲

صفت Underline را reset می‌کند.

۲۴

صفت چشمک‌زن را reset می‌کند.

۲۵

تعویض رنگ را reset می‌کند.

۲۷

مخفی را به عدم مخفی تبدیل می‌کند.(reset صفت hidden)

۲۸

نکته: همانطور که دیدید، کدهای reset فقط در دهگان ۲۰ هستند. و در اول آن‌ها یک صفر اضافه شده است که این صفر خیلی کاربرد دارد.
با جدول زیر می‌توان رنگ متون را ست کرد.

توصیف

code

رنگ پیش‌فرض

۳۹

سیاه

۳۰

قرمز

۳۱

سبز

۳۲

زرد

۳۳

آبی

۳۴

ارغوانی

۳۵

فیروزه‌ای

۳۶

خاکستری روشن

۳۷

خاکستری تیره

۹۰

قرمز روشن

۹۱

سبز روشن

۹۲

زرد روشن

۹۳

آبی روشن

۹۴

ارغوانی روشن

۹۵

فیروزه‌ای روشن

۹۶

سفید

۹۷

نکته: همانطور که حدس زدید، در این قسمت ۱۶ رنگ برایتان تشریح شد(سطر اول رنگ پیش‌فرض است.) که در جدول زیر ۱۶ رنگ پس زمینه تشریح می‌شود.
کدهای جدول زیر برای رنگ‌های پس زمینه می‌باشند.

توصیف

code

رنگ پیش‌فرض

۴۹

سیاه

۴۰

قرمز

۴‍۱

سبز

۴۲

زرد

۴۳

آبی

۴۴

ارغوانی

۴۵

فیروزه‌ای

۴۶

خاکستری روشن

۴۷

خاکستری تیره

۱۰۰

قرمز روشن

۱۰۱

سبز روشن

۱۰۲

زرد روشن

۱۰۳

آبی روشن

۱۰۴

ارغوانی روشن

۱۰۵

فیروزه‌ای روشن

۱۰۶

سفید

۱۰۷

ادامه تحلیل کد: حال با توجه شدن رنگ‌ها و صفات، یکبار دیگر می‌توان مثال زیر را بررسی کرد:

حال با توجه ]033\ می‌توان آن را برای شروع فرمان‌دهی در نظر گرفت. وقتی از کد 0 استفاده شده است، یعنی همه چی reset شود. سپس کد 35 به آن داده شده که کد رنگ ارغوانی است. سپس این روند تکرار شده است اما این بار برای پس زمینه : همه چی reset و سپس از کد رنگ قرمز استفاده شده است.
حال خودتان دیگر باید کد بعد از Hello World را حدس بزنید. اگر کد آخر را حذف کنیم خروجی چنین می‌شود:

ps1_2

بله تکه کد آخر همه چی را reset می‌کرد و همه چی به حالت عادی خود می‌برگشت. حال تصور کنید در کدهای خود از reset استفاده نکنید.
نکته: اگر رسما همانند بالا گند زدید به صفحه نمایش می‌توانید با اجرای دستور (1)reset همه چیز را برگردانید.

۳. چند مثال

مثال زیر، شروع خوبی است برای جدول reset:

ps1_3
همانطور که با کد ۴ underline تعریف کردیم تا آخرخط که چه عرض کنم بقیه خطوط هم باید underline می‌گرفتند، اما برای کلمه بعدی از کد reset آن یعنی 24 استفاده کردیم. و کدهای ۳۴ و ۹۲ به ترتیب کد آبی و سبز روشن می‌باشند.
در مثال زیر به جای 033\ می‌خواهیم e\ را به کار ببریم که هم کوتاهتر است و هم کار می‌کند. دقت کنید:

خروجی فرمان فوق به صورت زیر است :
ps1_4
نتیجه‌ای که از این فرمان خواستم بگیرم استفاده از فرامین دیگر بود. همانطور که شاهد بودید توانستیم خروجی فرمان date را تغییر دهیم.

۴. ۸۸ رنگ و ۲۵۶ رنگ

برای شما ۱۶ رنگ مثال زدم. عمدتا سیستم‌های جدید همگی ۲۵۶ رنگ را پشتیبانی می‌کنند. و عده کمی از ۸۸ رنگ پشتیبانی می‌کنند. خواهشا به مدارک ویکی‌پدیا رجوع کنید.

۵. تکه کد C

هیچ فرقی نمی‌کند. فقط شما باید هوشمندانه رفتار کنید و یکسری API بنویسید که کار با رنگ‌ها را ساده کنید.
به مثال زیر توجه کنید:

خروجی برنامه فوق به صورت زیر می‌شود:
ps1_5

۶. نتیجه‌گیری

اگر قصد کار با escape sequence را دارید که با نام‌های دیگری نیز خوانده می‌شوند، در ابتدا بنا به نیاز خود تحقیق کنید.

  • Terminal های مورد نظر را مورد بررسی قرار دهید.

  • بدانید از کدام کدها و در کدام Terminal استفاده می‌کنید.

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

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

  • در ابتدا حتماً یک کتابخانه بنویسید.

نمی‌دانم چه نوع استفاده‌ای از escape sequence ها دارید. ولی تا حدی این مطلب شروعی بود تا در هر زبانی بتوانید از آن‌ها استفاده نمایید.

یک دیدگاه در “شوخی با PS1”

  1. می‌توانید از دستورات زیر برای بهینه کردن PS1 بهره ببرید:
    uptime
    date
    sar
    top -b
    cat /proc/meminfo
    cat /proc/cpuinfo
    vmstat
    iostat => ترجیح نمی‌دم.
    و خیلی از متغیر‌های کلیدی شل مورد استفاده……

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *