یک مفهوم بسیار مهم در یونیکس و سیستم های شبیه یونیکس مثل لینوکس وجود دارد که تحت عنوان environment یا محیط شناخته میشود و بواسطه آن متغیرهای محیطی تعریف میشوند. بعضی از آنها توسط سیستم و بعضی از آنها توسط شما ایجاد میشوند.
یک متغیر کاراکتری از نوع رشته می باشد که ما به آن مقداری را تخصیص میدهیم. این مقدار میتواند عدد، متن، نام فایل هر دیوایس، یا نوع داده های دیگری باشد. برای مثال ما متغیر TEST را به صورت زیر تعریف میکنیم:
1 2 3 |
blog@Arshatech:~$ TEST="Unix Programming" blog@Arshatech:~$ echo $TEST Unix Programming |
وقتی شما به سیستم لینوکس خود لاگین میکنید شل برای شما محیطهای مختلفی را فراهم میکند. برای این کار شل فایلهای زیر را میخواند:
- etc/profile/
- profile
این پروسه مراحل زیر را دنبال میکند:
- شل ابتدا بررسی میکند که آیا فایل etc/profile/ وجود دارد یا خیر.
- اگر آن فایل وجود داشت شل آن را میخواند و در صورتی که این فایل وجود نداشت شل خطایی را چاپ نمیکند.
- در این مرحله شل چک میکند که آیا فایل profile. در دایرکتوری home وجود دارد یا خیر. دایرکتوری home دایرکتوری می باشد که به محض باز شدن ترمینال شما کار را از آنجا آغاز خواهید کرد.
- اگر این فایل وجود داشت شل آن را میخواند و در غیر این صورت شل آن را نادیده گرفته و خطایی چاپ نمیکند.
به محض اینکه این دو فایل خوانده شد شل برای شما محیط prompt را نمایش میدهد:
1 |
blog@Arshatech:~$ |
blog نام کاربری و Arshatech نام هاست شما میباشد.
اینجا محیطی ست که شما بعد از اندکی کار با اون حتما حس خیلی خوبی از آزادی کار با کامپیوتر خواهید داشت و میتوانید تمامی دستورات خود را آنجا به اجرا در بیاورید.
نکته قابل توجه اینکه شما در این محیط میتوانید انواع شل ها را اعم از bash و ksh و… به اجرا در بیاورید.
فایل etc/profile/ در لینوکس توسط ادمین نگه داری میشود.
اما فایل profile. در لینوکس کاملا تحت کنترل شماست و شما میتوانید تنظیمات شخصی خود را روی آن انجام دهید. حداقل تنظیماتی که شما میتوانید روی آن انجام دهید به صورت زیر می باشد:
- نوع ترمینالی که از آن استفاده میکنید.
- لیست دایرکتوری ها در جایی که دستورات وجود دارند.
- لیست متغیرهایی که شما میبینید یا حس میکنید که روی ترمینال شما اثر میگذارند.
شما میتوانید فایل profile. را در دایرکتوری خانه خود از طریق دستور vim باز کنید و محتویات آن متغیرهایی که وجود دارند را ببینید.
تعیین نوع ترمینال
معمولا نوع ترمینال توسط login و getty به صورت خودکار تنظیم میشود. گاهی پروسه حدس نیز در این موارد خود نوع ترمینال شما را تعیین میکند.
اگر ترمینال شما به صورت نادرست انتخاب شده باشد خروجی دستورات شما ممکن است عجیب و نادرست به نظر برسد و حتی ممکن است شما اصلا نتوانید از شل استفاده کنید.
برای اینکه این مشکلات ظاهر نشود خیلی از کاربران نوع ترمینال خود را به پایین تر سطح مثل زیر میبرند:
1 |
blog@Arshatech:~$ TERM=vt100 |
البته روی سیستم من که از اوبونتو استفاده میکنم مقدار متغیر زیر xterm است.
1 2 |
blog@Arshatech:~$ echo $TERM xterm |
تعیین PATH
وقتی شما هر دستوری را در ترمینال خود وارد میکنید شل مجبور است تا قبل از به اجرا درآوردن آن موقعیت و مکان آن دستور را شناسایی کند تا قابلیت اجرا شدن داشته باشد.
متغیر PATH موقعیت و مکان دستور را مشخص میکند. معمولا مقدار آن به صورت زیر است:
1 |
PATH=/bin:/usr/bin |
اما اگر شما میخواهید مقدار این متغیر در سیستم خودتون رو ببینید به صورت زیر عمل کنید:
1 2 |
blog@Arshatech:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games |
مثلا اگر شما عبارتی را در ترمینال خود تایپ کنید که در مسیرهای مشخص شده وجود نداشته باشد خروجی زیر را به شما میدهد:
1 2 |
blog@Arshatech:~$ this_is_test this_is_test: command not found |
متغیرهای PS1 و PS2
کاراکترهایی که شل به عنوان دستور نمایش میدهد در متغیری به نام PS1 ذخیره میشود. شما میتوانید این متغیر را به هر صورتی که میخواهید تغییر دهید. به محض اینکه شما این مقدار را تغییر دهید تغییرات اعمال خواهند شد:
1 2 3 4 |
blog@Arshatech:~$ PS1='=>' => => => |
همانطور که میبینید تغییرات بلافاصله اعمال میشود و از آن زمان به بعد prompt شما به صورت <= تغییر خواهد کرد.
شما میتوانید این مقدار را کاملا به صورت سفارشی برای ماشین لینوکس خود تغییر دهید. بعنوان مثال اگر به صورت زیر عمل کنید قبل از $ اطلاعات نام کاربری و دایرکتوری موجود را به شما نشان خواهد داد:
1 2 |
blog@Arshatech:~$ PS1="[\u@\h \w]\$ " [blog@Arshatech /home/blog]$ |
خروجی آن به ترتیب نام یوزر – نام ماشین – و دایرکتوری که هرلحظه در آن هستید خواهد بود.
مقادیری که شما میتوانید به متغیر PS1 در لینوکس اختصاص دهید را در ادامه توضیح خواهم داد:
- t\: زمان که به فرمت HH:MM:SS می باشد.
- d\: تاریخ که به فرمت روز ماه و سال می باشد.
- n\: خط جدید
- s\: محیط شل حاضر را بیان میکند.
- W\: دایرکتوری که در آن مشغول به کار هستید را نمایش میدهد.
- w\: مسیر کامل دایرکتوری که در آن مشغول به کار هستید را نمایش میدهد.
- u\: نام کاربری را نمایش میدهد.
- h\: بیانگر hostname ماشینیست که با آن کار میکنید.
- #\: شماره دستوری که از آن استفاده میکنید را نمایش میدهد که با هر دستور جدید مقدار آن افزایش می یابد.
- $\: اگر UID برابر با ۰ باشد (که بیانگر لاگین شدن شما با یوزر root است) prompt را با شماره کاراکتر مشخص میکند در غیر این صورت از خود کاراکتر $ استفاده میشود.
شما میتوانید تغییرات لازم رابه هر صورتی که مایل هستید انجام دهید و برای خودکار کردن و فعال کردن آن برای همیشه کافیست مقادبر را درون فایل profile. قرار دهید.
وقتی شما دستوری را در لینوکس میخواهید ناتمام اجرا کنید شل منتظر میماند تا شما آن را کامل کنید و علامت آن نیز به صورت پیش فرض < می باشد. اما شما میتوانید این مقدار را در متغیر PS2 تغییر دهید. به عنوان مثال:
1 2 3 4 |
blog@Arshatech:~$ echo "this is a > test" this is a test |
حال میخواهیم مقدار این متغیر را تغییر داده و عبارت بالا را مجددا چاپ کنیم:
1 2 3 4 5 |
blog@Arshatech:~$ PS2="secondary prompt -> " $echo "this is a secondary prompt -> test" this is a test |
متغیرهای محیط
در ادامه به بررسی بخشی از متغیرهای محیط میپردازم:
- DISPLAY: شامل شناسه ها برای نمایش برنامه هاییست که X11 باید به صورت پیش فرض از آنها استفاده کند.
- HOME: مشخص کننده دایرکتوری خانه یوزریست که با آن کار میکنید.
- IFS: خلاصه ای از Internal Field Separator است که میتوان بوسیله آن کلماتی را جداسازی کرد که معمولا در bash scripting مورد استفاده قرار میگیرد.
- LANG: زبان سیستم محلی پیش فرض را نشان میدهد. همچنین از LC_ALL برای لغو کردن آن استفاده میشود.
- LD_LIBRARY_PATH: در خیلی از سیستم های مبتنی بر یونیکس یک لینک کننده داینامیک وجود دارد که شامل جداکننده ای با کاراکتر : می باشد که لیستی از دایرکتوری های داینامیک لینک شده که shared object هایی که هنگام ساخته شدن پروسه ها بعد از اجرا هستند را در دایرکتوری های دیگر جستجو میکند.
- PATH: مسیر جستجو برای اجرای دستورها را مشخص میکند. که هر مسیر با : از مسیر دیگر جدا شده است.
- PWD: متغیری ست که موقعیت شما را در دایرکتوری که در آن هستید نشان میدهد.
- RAND: اعداد تصادفی بین ۰ تا ۳۲۷۶۷ را در هر درخواست نمایش میدهد.
- SHLVL: این متغیر نشان میدهد که آیا دستور built-in در نشست جاری تمام شده است یا خیر.
- TERM: نشان دهنده نوع ترمینال می باشد.
- TZ: بیانگر Time Zone می باشد که میتواند مقادیری چون GMT یا AST و… را بگیرد.
- UID: نشان دهنده آی دی یوزر می باشد.