متغیرهای محیطی (Environment Variables) یکی از بنیادیترین مفاهیم در سیستمعاملهای شبهیونیکس هستند. این متغیرها مقادیری هستند که در اختیار تمام فرایندهای در حال اجرا قرار میگیرند و نحوه رفتار سیستمعامل، شل و برنامههای مختلف را تعیین میکنند.
در این درس، با چهار متغیر محیطی حیاتی (PATH، HOME، SHELL، USER) و نحوه تعریف و ارثبری آنها با دستور export آشنا میشوید.
تفاوت متغیر شل (Shell Variable) و متغیر محیطی (Environment Variable)
پیش از بررسی متغیرهای خاص، درک این تفاوت اساسی ضروری است:
| نوع متغیر | تعریف | دسترسی |
|---|---|---|
| متغیر شل | متغیری که فقط در همان شل جاری تعریف شده است. | فقط برای خود شل جاری قابل دسترسی است. |
| متغیر محیطی | متغیری که بهعنوان بخشی از محیط (Environment) به شل جاری و تمام زیرفرایندهای آن به ارث میرسد. | در شل جاری و تمام فرایندهای فرزند (subshells) قابل دسترسی است. |
دستور export پل تبدیل متغیر شل به متغیر محیطی است.
چهار متغیر محیطی حیاتی
۱. PATH
مهمترین متغیر محیطی است. PATH یک لیست از دایرکتوریها (با جداکننده :) است که شل هنگام وارد کردن یک دستور، بهترتیب در آنها جستجو میکند تا فایل اجرایی مورد نظر را پیدا کند.
مشاهده مقدار فعلی:
echo $PATH
خروجی نمونه:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
افزودن یک دایرکتوری به PATH (موقت):
export PATH="/my/custom/bin:$PATH"
نکته حرفهای: قراردادن
$PATHدر انتها ($PATH:/new/dir) اولویت جستجو را به دایرکتوریهای سیستمی میدهد. قراردادن در ابتدا (/new/dir:$PATH) باعث میشود دستورات شما بر دستورات سیستمی ارجحیت داشته باشند. این روش برای اوورراید کردن ابزارها (مثل استفاده از نسخه محلیpython) کاربرد دارد.
هشدار امنیتی:
هرگز دایرکتوری جاری (.) را در PATH قرار ندهید، مخصوصاً در ابتدای آن. این کار یک آسیبپذیری امنیتی جدی ایجاد میکند؛ زیرا مهاجم میتواند فایلهای مخربی با نام دستورات معروف در دایرکتوریهای در دسترس قرار دهد.
۲. HOME
این متغیر مسیر دایرکتوری خانه کاربر جاری را مشخص میکند. شل از این متغیر برای تفسیر علامت ~ استفاده میکند.
مشاهده مقدار:
echo $HOME
خروجی نمونه:
/home/username
کاربردها:
-
دستور
cdبدون آرگومان، کاربر را به$HOMEمیبرد. -
بسیاری از برنامهها (مانند
ssh،git) فایلهای پیکربندی خود را در$HOME/.configیا$HOME/.sshذخیره میکنند.
۳. SHELL
این متغیر مسیر کامل شل پیشفرض کاربر جاری را نشان میدهد.
مشاهده مقدار:
echo $SHELL
خروجی نمونه:
/bin/bash
توجه داشته باشید که SHELL نشاندهنده شل پیشفرض کاربر است (تعریف شده در /etc/passwd)، نه لزوماً شل در حال اجرا. برای مشاهده شل فعلی، از متغیر $0 یا دستور ps -p $$ استفاده کنید.
۴. USER (یا LOGNAME)
این متغیر نام کاربری کاربر جاری را ذخیره میکند.
مشاهده مقدار:
echo $USER
خروجی نمونه:
alireza
اسکریپتها از این متغیر برای شخصیسازی مسیرها یا رفتار بر اساس کاربر استفاده میکنند (مثلاً cd /home/$USER/projects).
دستور export و مفهوم ارثبری
دستور export یک متغیر شل را به یک متغیر محیطی تبدیل میکند تا فرایندهای فرزند (subshells) نیز به آن دسترسی داشته باشند.
نحوه استفاده
# تعریف متغیر شل (دسترسی فقط در همین شل) MY_VAR="Hello" # تبدیل به متغیر محیطی (دسترسی در فرزندان) export MY_VAR # یا ترکیب هر دو در یک خط export ANOTHER_VAR="World"
نمایش عملی تفاوت
سناریو ۱: بدون export
TEST="only here" bash # وارد یک subshell میشویم echo $TEST # خروجی: (خالی - متغیر در دسترس نیست) exit # خروج از subshell
سناریو ۲: با export
export TEST="everywhere" bash echo $TEST # خروجی: everywhere exit
حذف یک متغیر محیطی
برای حذف کامل یک متغیر محیطی از دستور unset استفاده میشود:
unset MY_VAR
نمایش همه متغیرهای محیطی
برای مشاهده لیست کامل متغیرهای محیطی تعریفشده در شل جاری، از دستورات زیر استفاده کنید:
| دستور | توضیح |
|---|---|
env | نمایش همه متغیرهای محیطی |
printenv | نمایش همه متغیرهای محیطی (با قالببندی بهتر) |
printenv PATH | نمایش مقدار یک متغیر خاص |
set | نمایش همه متغیرها (شل + محیط) |
پایدارسازی متغیرهای محیطی (Persistent)
متغیرهایی که با export در خط فرمان تعریف میشوند، تنها تا پایان جلسه کاری (session) معتبرند. برای پایدار کردن آنها:
-
برای تمام کاربران: فایل
/etc/environmentیا/etc/profile(نیاز به دسترسی root). -
برای کاربر جاری: فایل
~/.bashrc(برای شلهای غیرورودی) یا~/.bash_profile(برای شلهای ورودی).
مثال افزودن یک مسیر سفارشی به PATH بهصورت دائمی در ~/.bashrc:
export PATH="$HOME/.local/bin:$PATH"
پس از ذخیره فایل، برای اعمال تغییرات بدون نیاز به خروج از شل، از دستور زیر استفاده کنید:
source ~/.bashrc # یا معادل آن: . ~/.bashrc
نکات تکمیلی و اشتباهات رایج
-
فاصله (Space) ممنوع: در تعریف متغیرها، حتماً بین نام متغیر، علامت
=و مقدار، هیچ فاصلهای نگذارید. (MY_VAR=valueصحیح است،MY_VAR = valueخطا میدهد). -
استفاده از نقل قول: اگر مقدار شامل فاصله یا کاراکترهای خاص است، آن را درون گیومه (
" ") قرار دهید:export GREETING="Hello World". -
حساسیت به حروف بزرگ و کوچک: نام متغیرها به شدت Case-Sensitive هستند.
pathباPATHکاملاً متفاوت است. متغیرهای سیستمی استاندارد معمولاً با حروف بزرگ نوشته میشوند. -
اولویت
PATH: هنگامی که یک دستور را اجرا میکنید، شل دایرکتوریهایPATHرا به همان ترتیبی که تعریف شدهاند جستجو میکند و اولین مورد پیدا شده را اجرا میکند. برای مشاهده مسیر کامل یک دستور خاص ازwhichیاtypeاستفاده کنید:which python3 type -a python3 # نمایش تمام مکانهای یافتشده