در سیستم‌های مبتنی بر لینوکس و یونیکس، متغیرهای محیطی مجموعه‌ای از مقادیری هستند که بصورت پویا نامگذاری می‌شوند. آن‌ها در داخل سیستم ذخیره شده و توسط برنامه‌های اجرا شده در shell یا subshell استفاده می‌شوند. به عبارت دیگر، متغیر محیطی، یک متغیر با یک نام و یک مقدار مرتبط است.

 

متغیرهای محیطی به شما امکان می‌دهند تا نحوه عملکرد سیستم و رفتار برنامه‌های کاربردی روی سیستم را به‌صورت دلخواه تنظیم کنید. به‌عنوان‌مثال، متغیر محیطی می‌تواند اطلاعات مربوط به ویرایشگر متن یا مرورگر پیش فرض، مسیر فایل‌های اجرایی و تنظیمات طرح بندی صفحه کلید را ذخیره کند.

 

این مطلب نیز ممکن است برای شما مفید باشد: تنظیم متغیرهای محیطی جاوا در لینوکس

 

در این آموزش، نحوه خواندن و تنظیم متغیرهای محیطی و shell (پوسته) شرح داده شده است.

 

متغیرهای محیطی و متغیرهای پوسته

متغیرها دارای فرمت زیر هستند:

KEY=value
KEY="Some other value"
KEY=value1:value2

 

نام متغیرها به حروف بزرگ و کوچک حساس هستند. طبق قرارداد، متغیرهای محیطی باید دارای نام‌های با حروف بزرگ باشند.

هنگام اختصاص مقادیر چندگانه به متغیر، آنها باید توسط کاراکتر ":" جدا شوند.

قبل و بعد از علامت = هیچ فاصله‌ای نباید وجود داشته باشد.

 

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

متغیرهای محیطی، متغیرهایی هستند که در سطح سیستم در دسترس هستند و به کلیه فرآیندهای فرزند و پوسته‌ها به ارث می‌رسند.

متغیرهای پوسته، متغیرهایی هستند که فقط برای پوسته فعلی اعمال می‌شوند. هر پوسته مانند zsh و bash دارای مجموعه‌ای از متغیرهای پوسته داخلی است.

 

دستوراتی وجود دارد که به شما امکان می‌دهند متغیرهای محیطی را در لینوکس لیست کرده و تنظیم نمایید:

env: این دستور، به شما امکان می‌دهد، برنامه دیگری را در یک محیطی دلخواه اجرا کنید؛ بدون اینکه برنامه فعلی را تغییر دهید. زمانی که دستور بدون ورودی اجرا شود، لیستی از متغیرهای محیطی فعلی را چاپ می‌کند.

printenv: این دستور، تمام متغیرها یا متغیرهای مشخص شده محیطی را چاپ می‌کند.

set: این دستور، متغیرهای پوسته را تنظیم می‌نماید. زمانی که از این دستور بدون هیچ آرگمانی استفاده می‌شود، لیستی از کلیه متغیرها از جمله متغیرهای محیطی و پوسته و توابع پوسته را چاپ می‌کند.

unset: این دستور، متغیرهای پوسته و محیطی را حذف می‌نماید.

export: این دستور، متغیرهای محیطی را تنظیم می‌کند.

 

نمایش متغیرهای محیطی

پرکاربردترین دستور برای نمایش متغیرهای محیطی، دستور printenv است. اگر نام متغیر به‌عنوان یک آرگومان برای دستور ارسال شود، تنها مقدار آن متغیر نمایش داده می‌شود. اگر هیچ آرگمانی مشخص نشده باشد، printenv لیستی از تمام متغیرهای محیطی را بصورت یک متغیر در هر خط چاپ می‌کند.

به‌عنوان‌مثال، برای نمایش مقدار متغیر محیطی HOME، شما باید دستور زیر را اجرا نمایید:

$ printenv HOME

خروجی، مسیر فعلی را که کاربر به آن وارد شده است، چاپ می‌کند:

Output:
/home/linuxize

 

همچنین می‌توانید بیش از یک آرگومان را برای دستور printenv ارسال نمایید:

$ printenv LANG PWD
Output:
en_US
/home/linuxize

اگر دستور printenv یا env را بدون هیچگونه آرگمانی اجرا کنید، لیستی از تمام متغیرهای محیطی به شما نشان داده می‌شود:

$ printenv

خروجی چیزی شبیه به این خواهد بود:

Output:
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35;...
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=en_US
S_COLORS=auto
XDG_SESSION_ID=5
USER=linuxize
PWD=/home/linuxize
HOME=/home/linuxize
SSH_CLIENT=192.168.121.1 34422 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/linuxize
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LANGUAGE=en_US:
LOGNAME=linuxize
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

 

در ادامه، برخی از رایج‌ترین متغیرهای محیطی ذکر شده است:

USER: متغیری است که کاربری که اکنون به سیستم وارد شده است را نشان می‌دهد.

Home: متغیری است که دایرکتوری اصلی کاربر فعلی را نمایش می‌دهد.

EDITOR: این متغیر، ویرایشگر فایل پیش فرض استفاده شده را نشان می‌دهد. این ویرایشگر، همان ویرایشگری است که هنگام تایپ edit در ترمینال شما استفاده می‌شود.

SHELL: این متغیر، مسیر پوسته کاربر فعلی، مانند bash یا zsh را نشان می‌دهد.

LOGNAME: متغیری است که نام کاربر فعلی را نمایش می‌دهد.

PATH: این متغیر، لیستی از دایرکتوری‌هایی را نشان می‌دهد که هنگام اجرای دستورات جستجو می‌شوند. هنگامی‌که شما یک دستور را اجرا می‌کنید؛ سیستم، آن دایرکتوری‌ها را به ترتیب این لیست جستجو کرده و از اولین دایرکتوری قابل اجرای یافت شده استفاده می‌نماید.

LANG: این متغیر، تنظیمات محلی فعلی را نمایش می‌دهد.

TERM: متغیری است که شبیه سازی ترمینال فعلی را نشان می‌دهد.

MAIL: این متغیر، مکانی را نشان می‌دهد که mail کاربر فعلی در آن ذخیره شده است.

 

دستورات printenv و env، تنها متغیرهای محیطی را چاپ می‌کنند. اگر می‌خواهید لیستی از تمام متغیرها؛ از جمله متغیرهای محیطی و متغیرهای پوسته و همچنین توابع پوسته را بدست آورید، می‌توانید از دستور set استفاده نمایید:

$ set
Output:
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

این دستور، لیست بزرگی از کلیه متغیرها را نمایش می‌دهد؛ بنابراین بهتر است مانند زیر، خروجی را به دستور less ارسال نمایید.

$ set | less

شما همچنین می‌توانید از دستور echo برای چاپ متغیر پوسته استفاده کنید. به‌عنوان‌مثال، برای چاپ مقدار متغیر BASH_VERSION، باید دستور زیر را اجرا نمایید:

$ echo $BASH_VERSION
Output:
4.4.19(1)-release

 

تنظیم متغیرهای محیطی

برای بهتر نشان دادن تفاوت بین متغیرهای محیطی و متغیرهای پوسته، ابتدا با تنظیم متغیرهای Shell شروع کرده و سپس به متغیرهای محیطی می‌پردازیم.

برای ایجاد یک متغیر پوسته جدید با نام MY_VAR و مقدار Linuxize، دستور زیر را تایپ کنید:

$ MY_VAR='Linuxize'

برای اطمینان از اینکه این متغیر به درستی تنظیم شده است؛ یا به صورت زیر، از دستور echo استفاده کنید و یا خروجی دستور set را با استفاده از دستور grep، بصورت set | grep MY_VAR فیلتر نمایید.

$ echo $MY_VAR
Output:
Linuxize

از دستور printenv، برای بررسی اینکه این متغیر، یک متغیر محیطی است یا خیر استفاده نمایید:

$ printenv MY_VAR

با اجرای دستور بالا مشاهده خواهید کرد که خروجی خالی است. بدین معنی که این متغیر، یک متغیر محیطی نیست.

 

شما می‌توانید متغیر را در یک sub-shell نیز چاپ کنید که در این صورت یک خروجی خالی دریافت خواهید کرد.

$ bash -c 'echo $MY_VAR'

از دستور export، برای تنظیم متغیرهای محیطی استفاده می‌شود.

برای ایجاد یک متغیر محیطی، کافی است متغیر پوسته را به‌عنوان یک متغیر محیطی صادر کنید:

$ export MY_VAR

شما می‌توانید با اجرای دستور زیر، آن را بررسی نمایید:

$ printenv MY_VAR
Output:
Linuxize

اگر بخواهید متغیر را در sub-shell چاپ کنید، با استفاده از دستور زیر، می‌توانید نام متغیر چاپ شده را در ترمینال خود مشاهده نمایید:

$ bash -c 'echo $MY_VAR'
Output:
Linuxize

همچنین می‌توانید متغیرهای محیطی را بصورت زیر در یک خط تنظیم کنید:

$ export MY_NEW_VAR="My New Var"

متغیرهای محیطی ایجاد شده از این طریق، تنها در نشست فعلی در دسترس هستند. بنابراین، اگر پوسته جدیدی باز کنید یا از سیستم خارج شوید، تمام متغیرها از بین می‌روند.

 

متغیرهای محیطی پایدار

برای پایدار کردن متغیرهای محیطی، باید آن متغیرها را در فایل‌های پیکربندی bash تعریف کنید. در اکثر توزیع‌های لینوکس هنگام شروع نشست جدید، متغیرهای محیطی از فایل‌های زیر خوانده می‌شوند:

etc/environment/: از این فایل، برای تنظیم متغیرهای محیطی در سطح سیستم استفاده کنید. متغیرهای این فایل به شکل زیر تنظیم می‌شوند:

$ FOO=bar
$ VAR_TEST="Test Var"

 

 

etc/profile/: متغیرهای تنظیم شده در این فایل، هر زمان که دستور ورود به سیستم وارد شود، بارگذاری می‌شوند. هنگام مقداردهی متغیرهای محیطی در این فایل، باید از دستور export استفاده کنید:

$ export JAVA_HOME="/path/to/java/home"
$ export PATH=$PATH:$JAVA_HOME/bin

 

 

پوسته، به ازای هر کاربر فایل‌های تنظیمات خاصی را تعیین می‌نماید. به‌عنوان‌مثال، اگر از Bash استفاده می‌کنید، می‌توانید متغیرها را در bashrc./~ تعیین نمایید:

$ export PATH="$HOME/bin:$PATH"

 

برای بارگذاری متغیرهای محیطی جدید در نشست پوسته فعلی از دستور source استفاده کنید:

$ source ~/.bashrc

 

 

منبع:

linuxize