در هر مطلب مجبورم کمی با ابعاد مختلف صحبت کنم و از دید یک sysadmin/developr/کاربر حرفهای/کار غیر حرفهای صحبت کنم. شاید برای خواننده محترم جالب نباشد، ولی به دلیل تعدد و تکثر خوانندگان در طبقههای مختلف مجبور به این امر میباشم.
نکته: این مطلب راجعبه *PS نیست. اندکی صبر ….
به عبارت زیر که در هنگام Prompt دیده میشود دقت نمایید:
1 |
mohsen@debian:~$ |
وقتی برای هر بار برای اجرای فرمان 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 را پیدا کنیم:
1 2 3 4 |
# infocmp -D /etc/terminfo /lib/terminfo /usr/share/terminfo |
سپس با مسیر پیدا شده یک find میتوان حدود ۱۶۵۲ Terminal پیدا کرد. البته بستگی به سیستم شما دارد:
1 2 |
# find /usr/share/terminfo/ -type f -print |wc -l 1652 |
برای توجه بیشتر به انواع Terminal ها میتوانید دو grep زیر را بهرهمند شوید:
1 2 3 4 5 6 7 8 9 10 11 |
# find /usr/share/terminfo/ -type f -print |grep vte /usr/share/terminfo/m/mvterm /usr/share/terminfo/v/vte-2014 /usr/share/terminfo/v/vte+pcfkeys /usr/share/terminfo/v/vte-256color /usr/share/terminfo/v/vte-2008 /usr/share/terminfo/v/vte-2007 /usr/share/terminfo/v/vte /usr/share/terminfo/v/vte-2012 /usr/share/terminfo/s/screen.vte /usr/share/terminfo/s/screen.vte-256color |
و یا:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# find /usr/share/terminfo/ -type f -print |grep vt100 /usr/share/terminfo/k/konsole-vt100 /usr/share/terminfo/m/ms-vt100-color /usr/share/terminfo/m/ms-vt100+ /usr/share/terminfo/m/ms-vt100 /usr/share/terminfo/v/vt100+fnkeys /usr/share/terminfo/v/vt100-putty /usr/share/terminfo/v/vt100-nav /usr/share/terminfo/v/vt100+enq /usr/share/terminfo/v/vt100-vb /usr/share/terminfo/v/vt100+pfkeys /usr/share/terminfo/v/vt100+keypad /usr/share/terminfo/v/vt100nam /usr/share/terminfo/v/vt100-w-nam /usr/share/terminfo/v/vt100-w /usr/share/terminfo/v/vt100-nav-w /usr/share/terminfo/v/vt100-s /usr/share/terminfo/v/vt100-s-bot /usr/share/terminfo/d/dec-vt100 /usr/share/terminfo/p/putty-vt100 /usr/share/terminfo/p/putty+fnkeys+vt100 /usr/share/terminfo/n/ncr260vt100wan /usr/share/terminfo/n/ncr160vt100an /usr/share/terminfo/n/ncr260vt100pp /usr/share/terminfo/n/ncr260vt100an /usr/share/terminfo/n/ncr160vt100wan /usr/share/terminfo/n/ncr160vt100wpp /usr/share/terminfo/n/ncr260vt100wpp /usr/share/terminfo/n/ncrvt100an /usr/share/terminfo/n/ncrvt100wan /usr/share/terminfo/n/ncr160vt100pp |
همانگونه که دیدید، فقط چندین گونه VTE و چنیدن گونه vt100 موجود میباشد.
نکته: حتماً با برنامه infocmp کار کنید و از option های آن بهره ببرید. گزینههای مختلفی دارد که میتواند به شما کمک کند. به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# infocmp vt100 # Reconstructed via infocmp from file: /lib/terminfo/v/vt100 vt100|vt100-am|dec vt100 (w/advanced video), am, mc5i, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m$, bold=\E[1m$, clear=\E[H\E[J$, cr=^M, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C$, cup=\E[%i%p1%d;%p2%dH$, cuu=\E[%p1%dA, cuu1=\E[A$, ed=\E[J$, el=\E[K$, el1=\E[1K$, enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=^J, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m$, ri=\EM$, rmacs=^O, rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m$, rmul=\E[m$, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$, sgr0=\E[m\017$, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m$, smul=\E[4m$, tbc=\E[3g, |
نکته: انواع Terminal با Terminal Emulator ها فرق دارند. از جمله Terminal Emulator ها میتوان به موارد زیر اشاره کرد:
-
gnome-terminal
-
terminator
-
tilda
-
guake
-
xfce4-terminal
-
konsole
قبل از هر کاری، بهتر است به Standard ECMA-48 سر بزنید. برایتان مفید است.
۲. دستکاری رنگها
بگذارید قبل از هر چیزی مثالها را با echo پیش ببریم که درک مطلبی از جریان اتفاق بیافتد.
نکته: در چندین حالت میتوان رنگها را تغییر داد، پس لطفاً صبوری کنید و به مثالها توجه کنید:
1 |
# echo -e "\033[0;35m\033[0;41mHello World \033[0m" |
بیایید کمی در مورد تکه کد بالا صحبت کنیم. شاید در قبل از این واژه 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 |
رنگ پیشفرض |
۴۹ |
سیاه |
۴۰ |
قرمز |
۴۱ |
سبز |
۴۲ |
زرد |
۴۳ |
آبی |
۴۴ |
ارغوانی |
۴۵ |
فیروزهای |
۴۶ |
خاکستری روشن |
۴۷ |
خاکستری تیره |
۱۰۰ |
قرمز روشن |
۱۰۱ |
سبز روشن |
۱۰۲ |
زرد روشن |
۱۰۳ |
آبی روشن |
۱۰۴ |
ارغوانی روشن |
۱۰۵ |
فیروزهای روشن |
۱۰۶ |
سفید |
۱۰۷ |
ادامه تحلیل کد: حال با توجه شدن رنگها و صفات، یکبار دیگر میتوان مثال زیر را بررسی کرد:
1 |
# echo -e "\033[0;35m\033[0;41mHello World \033[0m" |
حال با توجه ]033\ میتوان آن را برای شروع فرماندهی در نظر گرفت. وقتی از کد 0 استفاده شده است، یعنی همه چی reset شود. سپس کد 35 به آن داده شده که کد رنگ ارغوانی است. سپس این روند تکرار شده است اما این بار برای پس زمینه : همه چی reset و سپس از کد رنگ قرمز استفاده شده است.
حال خودتان دیگر باید کد بعد از Hello World را حدس بزنید. اگر کد آخر را حذف کنیم خروجی چنین میشود:
1 |
# echo -e "\033[0;35m\033[0;41mHello World" |
بله تکه کد آخر همه چی را reset میکرد و همه چی به حالت عادی خود میبرگشت. حال تصور کنید در کدهای خود از reset استفاده نکنید.
نکته: اگر رسما همانند بالا گند زدید به صفحه نمایش میتوانید با اجرای دستور (1)reset همه چیز را برگردانید.
۳. چند مثال
مثال زیر، شروع خوبی است برای جدول reset:
1 |
# echo -e "\033[4;34munderlined \033[24;92mnot underlined" |
همانطور که با کد ۴ underline تعریف کردیم تا آخرخط که چه عرض کنم بقیه خطوط هم باید underline میگرفتند، اما برای کلمه بعدی از کد reset آن یعنی 24 استفاده کردیم. و کدهای ۳۴ و ۹۲ به ترتیب کد آبی و سبز روشن میباشند.
در مثال زیر به جای 033\ میخواهیم e\ را به کار ببریم که هم کوتاهتر است و هم کار میکند. دقت کنید:
1 |
# echo -e "\e[0;35m`date +%T` \e[0;45m is current time \e[0m" |
خروجی فرمان فوق به صورت زیر است :
نتیجهای که از این فرمان خواستم بگیرم استفاده از فرامین دیگر بود. همانطور که شاهد بودید توانستیم خروجی فرمان date را تغییر دهیم.
۴. ۸۸ رنگ و ۲۵۶ رنگ
برای شما ۱۶ رنگ مثال زدم. عمدتا سیستمهای جدید همگی ۲۵۶ رنگ را پشتیبانی میکنند. و عده کمی از ۸۸ رنگ پشتیبانی میکنند. خواهشا به مدارک ویکیپدیا رجوع کنید.
۵. تکه کد C
هیچ فرقی نمیکند. فقط شما باید هوشمندانه رفتار کنید و یکسری API بنویسید که کار با رنگها را ساده کنید.
به مثال زیر توجه کنید:
1 2 3 4 5 |
#include <stdio.h> int main(){ printf("\033[0;35m Hello World!\n"); } |
خروجی برنامه فوق به صورت زیر میشود:
۶. نتیجهگیری
اگر قصد کار با escape sequence را دارید که با نامهای دیگری نیز خوانده میشوند، در ابتدا بنا به نیاز خود تحقیق کنید.
-
Terminal های مورد نظر را مورد بررسی قرار دهید.
-
بدانید از کدام کدها و در کدام Terminal استفاده میکنید.
-
چند رنگ بودن یکی از مطالب مهم است.
-
یکی از مطالبی که اصلاً به آن اشاره نکردم صفحهکلید، حرکت در صفحه و سایر مصادیق بود. اگر چنین چیزهایی را مد نظر دارید، حتماً جستجوی خود را گسترش دهید.
-
در ابتدا حتماً یک کتابخانه بنویسید.
نمیدانم چه نوع استفادهای از escape sequence ها دارید. ولی تا حدی این مطلب شروعی بود تا در هر زبانی بتوانید از آنها استفاده نمایید.
میتوانید از دستورات زیر برای بهینه کردن PS1 بهره ببرید:
uptime
date
sar
top -b
cat /proc/meminfo
cat /proc/cpuinfo
vmstat
iostat => ترجیح نمیدم.
و خیلی از متغیرهای کلیدی شل مورد استفاده……