محیط (Environment) در خط فرمان لینوکس

همانطور که قبلاً اشاره کردیم، شل (Shell) یک بدنه از اطلاعات را در طی نشست شل (Shell) با نام محیط (Environment) نگهداری میکند. دادههایی که در داخل محیط ذخیره شده است به وسیله برنامهها به منظور تعیین واقعیتهای پیکربندی استفاده میشوند.
در حالی که بیشتر برنامهها به مقادیری که در داخل محیط ذخیره میشوند نگاه میکنند تا رفتار خود را تطبیق دهند. با دانستن این موضوع، ما میتوانیم از محیط به منظور شخصیسازی محیط شل (Shell) استفاده کنیم.
چه چیز در داخل محیط لینوکس ذخیره شده است؟
شل (Shell) دو نوع اساسی از داده را در داخل محیط (Environment) ذخیره میکند. هر چند که در بش (Bash) انواع تا حد زیادی غیرقابل تشخیص هستند. این دو نوع شامل متغیرهای محیط (Environment Variables) و متغیرهای شل (Shell Variables) هستند. متغیرهای شل (Shell) بیتهایی از داده هستند که در بش (Bash) قرار گرفتهاند و مابقی، متغیرهای محیط هستند.
علاوه بر متغیرها، شل (Shell) همچنین دادههای برنامهریزی با نامهای Aliases و Shell Functions را ذخیره میکند. به یاد دارید Aliasها و توابع را توضیح دادهایم. در ادامه با محیط (Environment) در لینوکس بیشتر آشنا خواهیم شد.
بررسی محیط (Environment)
به منظور مشاهده اینکه چه چیزی در محیط (Environment) ذخیره شده است، ما میتوانیم از فرمانهای set یا printenv استفاده کنیم. فرمان set هر دو نوع متغیرهای محیط و شل را به شما نشان خواهد داد در حالی که فرمان printenv فقط متغیرهای محیط را نشان میدهد. از آنجایی که لیست محتویات محیط نسبتاً طولانی است، بهتر است که با کمک less آنها را نمایش دهیم:
1 |
[me@linuxbox ~]$ printenv | less |
نتیجه به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
KDE_MULTIHEAD=false SSH_AGENT_PID=6666 HOSTNAME=linuxbox GPG_AGENT_INFO=/tmp/gpg-PdOt7g/S.gpg-agent:6689:1 SHELL=/bin/bash TERM=xterm XDG_MENU_PREFIX=kde- HISTSIZE=1000 XDG_SESSION_COOKIE=6d7b05c65846c3eaf3101b0046bd2b00-1208521990.996705-11770561 99 GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/share/confi g/gtkrc-2.0 GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/config/gtkrc GS_LIB=/home/me/.fonts WINDOWID=29360136 QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt-3.3/include KDE_FULL_SESSION=true USER=me LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33 ;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe: |
آنچه ما میبینیم لیستی از متغیرهای محیط و مقادیر آنها میباشد. برای مثال متغیری با نام USER را میبینیم که در این مورد خاص دارای مقدار me که کاربر فعلی است را به خود اختصاص داده است. فرمان printenv نیز میتواند یک متغیر خاص را لیست کند:
1 2 |
[me@linuxbox ~]$ printenv USER me |
زمانی که فرمان set بدون گزینه و آرگومان به کار میرود، متغیرهای شل (Shell) و محیط هر تابع دیگر تعریف شده را نشان میدهد.
1 |
[me@linuxbox ~]$ set | less |
بر خلاف فرمان printenv خروجی آن بر اساس حروف الفبا دستهبندی شده است. همچنین ممکن است که محتوای یک متغیر را به صورت جداگانه با فرمان echo نمایش دهیم:
1 2 |
[me@linuxbox ~]$ echo $HOME /home/me |
یکی از عناصر محیط که هیچکدام از فرمانهای set و printenv آن را نشان نمیدهد alias ها هستند. برای مشاهده آنها فرمان alias را بدون هیچ آرگومانی وارد میکنیم:
1 2 3 4 5 6 |
[me@linuxbox ~]$ alias alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --showtilde' |
برخی از متغیرهای جذاب
محیط حاوی برخی از متغیرها میباشد و بر اساس نوع محیطی که در آن قرار گرفتهاید ممکن است متفاوت باشد. برخی از این متغیرها در جدول زیر به همراه توضیح کامل آورده شدهاند. اگر برخی از این فرمانها برای شما موجود نبود نگران نباشید چون که بر اساس توزیعهای مختلف آنها تفاوت دارند.
محیط چگونه برقرار شده است
زمانی که ما به سیستم Login میکنیم، برنامه Bash آغاز شده و برخی از اسکریپتهای پیکربندی را با نام startup files اجرا میکند که محیط پیشفرض (Environment) که بین کاربران به اشتراک گذاشته است را تعریف میکند. این کار با بارگذاری فایلهای استارتآپ پوشه home که محیط شخصی کاربر ما را تعریف میکند، ادامه مییابد.
شلهای لاگین و بدون لاگین (Login, Non-login)
دو نوع نشست شل (Shell) وجود دارد. نشست لاگین شل (Login Shell Session) و نشست بدون لاگین (Non-login Shell Session) یک نشست لاگین شل، نشستی است که در آن از ما درخواست نام کاربری و رمز عبور میشود. برای مثال زمانی که ما یک نشست کنسول مجازی را آغاز میکنیم یک نشست لاگین شل را آغاز کردهایم. یک نشست بدون لاگین شل، معمولاً زمانی رخ میدهد که ما یک نشست ترمینال را در رابط گرافیکی، باز میکنیم. لاگین شل (Login Shell) فایلهای استارتآپ (Start Up) همانگونه که در جدول زیر میبینید میخواند:
فایل | محتویات |
---|---|
/etc/profile | یک اسکریپت پیکربندی سراسری که بر روی همه کاربران اعمال میشود |
~/.bash_profile | یک فایل استارتاپ شخصی کاربر. میتوان آن را برای گسترش یا نادیده گرفتن تنطیمات در اسکریپت پیکربندی سراسری استفاده کرد. |
~/.bash_login | اگر ~/.bash_profile پیدا نشود، بش سعی میکند تا این اسکریپت را بخواند. |
~/.profile | اگر که هیچکدام از این دو ~/.bash یا ~/.bash_login یافت نشد، بش تلاش میکند تا این فایل را بخواند. این فایل در توزیعهای مبتنی بر دبیان مثل اوبونتو پیشفرض است. |
نشستهای بدون لاگین شل (Non-login Shell Session) فایلهای استارتآپ را همانگونه که در جدول زیر نمایش داده شدهاند میخواند:
فایل | محتویات فایل |
---|---|
/etc/bash.bashrc | یک اسکریپت پیکربندی سراسری که بر روی همه کاربران اعمال میگردد. |
~/.bashrc | یک فایل استارتاپ شخصی کاربر. میتوان برای گسترش یا نادیده گرفتن تنظیمات در اسکریپت پیکربندی سراسری استفاده کرد. |
علاوه بر خواندن فایلهای استارتآپ بالا، شلهای بدون لاگین محیط خود را از پروسه والد به ارث میبرند که معمولاً یک لاگین شل (Login Shell) است. به سیستم خود نگاهی بیندازید و ببینید که کدامیک از این فایلهای استارتآپ را دارید.
به یاد داشته باشید که اکثر اسامی فایلهایی که در بالا لیست شده است با یک نقطه شروع میشود؛ به این معنی که این فایلها مخفی هستند و برای نمایش آنها بایستی از گزینه –a به همراه ls استفاده کنید.
فایل ~/.bashrc احتمالاً مهمترین فایل استارتآپ از نقطه نظر کاربران عادی است. به این دلیل که تقریباً همیشه خوانده میشود. شلهای بدون لاگین (Non-login Shells) به صورت پیشفرض آن را میخواند و بیشتر فایلها برای لاگین شلها به شیوهای نوشته شدهاند تا ~/.bashrc را بخوانند.
فایل استارت آپ (Startup File)
اگر نگاهی به درون یک فایل عادی .bash_profile (که از یک توزیع CentOS4 گرفته شده) بیندازیم، مشابه تصویر زیر را مشاهده میکنیم:
1 2 3 4 5 6 7 8 |
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH |
خطوطی که با علامت # داخل فایل شروع میشوند توضیح (Comment) هستند و این خطوط توسط شل (Shell) خوانده نمیشود. این خطوط به منظور خواناتر شدن توسط انسان قرار داده شدهاند.
1 2 3 |
if [ -f ~/.bashrc ]; then . ~/.bashrc fi |
اولین کد جالب در خط چهار اتفاق میافتد:
1 2 |
If the file "~/.bashrc" exists, then read the "~/.bashrc" file. |
که if compound command یا فرمان شرطی ترکیبی نامیده میشود که در دروس اسکریپتنویسی آن را به تفصیل توضیح خواهیم داد ولی برای درک موضوع آن را برای شما ترجمه میکنیم. این خط یعنی اینکه اگر فایل ~/.bashrc موجود باشد، فایل ~/.bashrc را بخوان.
اتفاق بعدی که در فایل استارتآپ ما رخ میدهد به متغیر PATH مرتبط است.
تعجب نمیکنید که شل (Shell) از کجا فرمانهای ما را هنگامی که آنها را در خط فرمان وارد میکنیم پیدا میکند؟! برای مثال زمانی که ما ls را وارد میکنیم، آیا شل (Shell) کل سیستم ما را برای پیدا کردن /bin/ls میگردد؟ خیر، به جای آن شل (Shell) لیستی از پوشههایی که حاوی متغیرهای PATH هستند را جستجو میکند و در نتیجه ls را به راحتی پیدا میکند.
متغیرهای PATH اغلب (نه همیشه اوقات، بسته به نوع توزیعی که از آن استفاده میکنیم) توسط فایل استارتآپ در مسیر /etc/profile با استفاده از کد زیر تنظیم میشود:
1 |
PATH=$PATH:$HOME/bin |
PATH به منظور اضافه کردن دایرکتوری $HOME/bin به آخر لیست تغییر داده شده است. این یک ثال از بسط پارامتری است، که در دروس قبلی آن را تغییر دادیم.
1 2 3 4 5 6 |
[me@linuxbox ~]$ foo="This is some" [me@linuxbox ~]$ echo $foo This is some [me@linuxbox ~]$ foo=$foo" text." [me@linuxbox ~]$ echo $foo This is some text. |
با اضافه کردن رشته $HOME/bin به انتهای محتویات متغیر PATH دایرکتوری $HOME/bin هنگامی که یک فرمان وارد میشود، به انتهای لیست پوشهها اضافه میشود.
به این معنی که زمانی که میخواهیم پوشهای را در داخل دایرکتوری home خود برای ذخیره برنامههای شخصی ایجاد کنیم، شل (Shell) آماده تطبیق دادن است. همه کاری که باید کرد این است که آن را bin نامگذاری کنیم و بقیه مهیاست.
1 |
export PATH |
فرمان export به شل (Shell) میگوید که محتویات PATH را برای پروسههای فرزند فراهم کن.
تغییر محیط (Modifying the Environment)
از آنجایی که ما میدانیم که فایلهای استارتآپ کجا هستند و چه محتویاتی دارند، میتوانیم آنها را تغییر داده تا محیط خود را شخصیسازی کنیم.
چه فایلهایی را بایستی تغییر دهیم؟
به عنوان یک قانون کلی، برای اضافه کردن دایرکتوریها به PATH خود و یا تعریف متغیرهای جدید محیطی، این تغییرات را در .bash_profile (و یا معادل آن بسته به نوع توزیع لینوکس – برای مثال .profile در توزیع اوبونتو) قرار دهید.
برای کارهای دیگر، تغییرات را در داخل .bashrc قرار دهید. تغییرات خود را به فایلها در دایرکتوری home خودتان محدود کنید، مگر آن که مدیر سیستم باشید و میخواهید تغییرات پیشفرض را برای همه کاربران تغییر دهید. ممکن است که فایلهایی مثل profile موجود در /etc را تغییر دهید و در بسیاری موارد این تغییر معقول است ولی برای شروع بهتر است این تغییرات را ایجاد نکنید.
منبع: لینوکسسیزن نوشته فرشید نوتاش حقیقت