نحوه تنظیم و خواندن متغیرهای محیطی و shell در سرور مجازی Ubuntu
۸ بهمن ۱۴۰۳
هنگامی که با سرور مجازی خود از طریق یک shell session کار میکنید، اطلاعات زیادی وجود دارد که شِل شما، آنها را جمعآوری میکند تا رفتار خود و میزان دسترسیاش به منابع را تعیین کند. برخی از این تنظیمات درون configuration settings قرار دارند و برخی دیگر توسط ورودی کاربر تعیین میشوند.
یکی از روشهایی که شل تمامی این تنظیمات و جزئیات را دنبال میکند، از طریق بخشی است که environment (محیط) نامیده میشود. environment منطقهای است که شل، هر بار که یک session (جلسه) را شروع میکند، میسازد. محیط، شامل مفهومی تحت عنوان variableها (متغیرها) است که خصوصیات یک سیستم را تعریف میکنند.
در این راهنما، نحوه تعامل با environment و نحوه خواندن یا نحوه تنظیم متغیرهای محیطی و متغیرهای شل (hell variables) به صورت تعاملی و از طریق configuration files را بررسی خواهیم کرد.
فقط کافی است که یک ترمینال جدید در سرور مجازی لینوکس خود، باز کنید و راهنما را دنبال کنید؛ در صورتی که با سرور مجازی (VPS) آشنایی ندارید، توصیه میشود در ابتدا مقاله زیر را مطالعه کنید:
SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
در ادامه، بخوانید:
- متغیرهای محیطی چگونه کار میکنند؟
- نحوه مشاهده متغیرهای محیطی و متغیرهای شل
- نحوه تنظیم متغیرهای محیطی و متغیرهای شل
- نحوه تنزیل و حذف متغیرها
- نحوه تنظیم متغیرهای محیطی در هنگام ورود (Login)
متغیرهای محیطی چگونه کار میکنند؟
هر بار که یک ترمینال جدید باز میکنید، یک پروسه اجرا میشود که وظیفه آن، جمعآوری اطلاعاتی است که باید برای فرایندهای مربوط به شِل و فرایندهای مربوط به فرزند آن، در دسترس باشد. این دادهها از فایلها و تنظیمات مختلف سیستم، به دست میآیند.
محیط (Environment)، یک واسطه فراهم میکند که از طریق آن، فرایند شِل میتواند پیکربندیهای مختلف را، دریافت یا تنظیم کند و در نتیجه، این تنظیمات را به فرایندهای فرزند خود منتقل کند.
محیط به صورت رشتههایی پیادهسازی شده است که نشاندهنده جفتهای کلید-مقدار هستند. اگر هر کلید، شامل چندین مقدار باشد، معمولاً این مقادیر با استفاده از کاراکتر دو نقطه (:)، از هم جدا میشوند. هر جفت کلید-مقدار، معمولاً به شکل زیر خواهد بود:
KEY=value1:value2:...
اگر که یک مقدار، شامل space باشد، باید کل آن داخل " "
تعریف شود:
KEY="value with spaces"
در این رشتهها، کلیدها، نام متغیر هستند. این متغیرها میتوانند متغیرهای محیطی یا متغیرهای شل باشند.
متغیرهای محیطی (Environmental Variables) متغیرهایی هستند که برای شِل کنونیتان، تعریف میشوند و توسط هر شِل یا فرایند فرزند به ارث برده میشوند. متغیرهای محیطی برای ارسال اطلاعات به فرایندهایی که از شِل راهاندازی میشوند، استفاده میشوند.
متغیرهای شِل (Shell Variables) متغیرهایی هستند که به طور اختصاصی در داخل شِلی که آنها را تنظیم یا تعریف کرده است، موجودند. این متغیرها اغلب برای پیگیری دادههای موقتی مانند دایرکتوری کاری جاری (Current Working Directory) استفاده میشوند.
متغیرها معمولاً با حروف بزرگ تعریف میشوند تا به راحتی در دستورات و جاهای دیگر، شناسایی شوند.
نحوه مشاهده متغیرهای محیطی و متغیرهای شل
هر شل، فقط متغیرهای خود را میبیند. ما میتوانیم به این متغیرها به چند روش مختلف، دسترسی پیدا کنیم. میتوانیم لیستی از تمام متغیرهای محیطی خود را با استفاده از دستورات env
یا printenv
مشاهده کنیم. در حالت پیشفرض، این دستورات دقیقاً مانند یکدیگر عمل میکنند
printenv
محیط شِل شما ممکن است متغیرهای بیشتری یا کمتری تنظیم کرده باشد و مقادیر متفاوتی نسبت به خروجی زیر داشته باشد:
SHELL=/bin/bash
TERM=xterm
USER=demouser
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:...
MAIL=/var/mail/demouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/demouser
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/demouser
LOGNAME=demouser
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv
خروجی دستورات printenv و env معمولاً مشابه است. تفاوت بین این دو دستور تنها در عملکرد خاصتر آنهاست. به عنوان مثال، با دستور printenv
میتوانید مقادیر متغیرهای مشخص شده را ببینید:
printenv PATH
خروجی:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
از طرف دیگر، دستور env
به شما این امکان را میدهد که محیطی که برنامهها در آن اجرا میشوند را تغییر دهید؛ مثلاً:
env VAR1="value" command_to_run command_options
همانطور که قبلاً یاد گرفتیم، فرایندهای فرزند معمولاً متغیرهای محیطی فرایند والد را به ارث میبرند، این قابلیت، به شما این امکان را میدهد که مقادیر هر متغیر را بازنویسی کنید یا متغیرهای اضافی را برای فرایند فرزند اضافه کنید.
طبق خروجی دستور printenv
، تعدادی متغیر محیطی از طریق فایلها و فرایندهای سیستم، بدون ورودی ما، تنظیم شدهاند. اینها، متغیرهای محیطی را نشان میدهند، اما چگونه میتوانیم متغیرهای شِل (Shell Variables) را مشاهده کنیم؟
دستور set برای این کار استفاده میشود. اگر بدون پارامترهای اضافی دستور set را وارد کنیم، فهرستی از تمام متغیرهای شِل، متغیرهای محیطی، متغیرهای محلی و توابع شِل را مشاهده خواهیم کرد:
set
خروجی:
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
. . .
خروجی دستور فوق، معمولاً یک فهرست بزرگ است. احتمالاً بهتر است دستور فوق را با دستور less
اجرا کنید تا خروجی تمیزتری داشته باشید:
set | less
مقدار اطلاعات اضافی که دریافت میکنیم ممکن است کمی زیاد باشد. برای مثال، ما احتمالاً نیازی به دانستن تمام توابع تعریفشده bash، نداریم.
ما میتوانیم خروجی را با مشخص کردن این که دستور set باید در حالت POSIX عمل کند پاکسازی کنیم. با این کار، توابع شِل در خروجی، چاپ نخواهد شد:
(set -o posix; set)
دستور فوق، فهرستی از تمام متغیرهای محیطی و متغیرهای تعریف شده در شِل را نمایش خواهد داد. ما میتوانیم خروجی این دستور را با خروجی دستورات env
یا printenv
مقایسه کنیم تا فهرستی شامل متغیرهای شِل بدست آوریم:
comm -23 <(set -o posix; set | sort) <(env | sort)
خروجی دستور فوق، احتمالاً هنوز شامل چند متغیر محیطی خواهد بود، زیرا دستور set
، مقادیر هر متغیر را در داخل " "
چاپ میکند، در حالی که دستورات printenv
و env
مقادیر رشتهها را بدون " "
، چاپ میکند.
معرفی متغیرهای محیطی و متغیرهای شِل رایج
برخی از متغیرهای محیطی و متغیرهای شِل، بسیار مفید هستند و اغلب از آنها در عملیاتهای مختلف، استفاده میشود. در ادامه، به معرفی برخی از متغیرهای محیطی رایجی که با آنها روبرو خواهید شد، پرداختهشده است:
متغیرهای محیطی رایج
SHELL
: شِلی که دستورات شما را اجرا خواهد کرد. در بیشتر موارد، مقدار پیشفرض این متغیر، bash خواهد بود، اما میتوان گزینههای دیگری را نیز تنظیم کرد.TERM
: نوع ترمینال (Terminal) شبیهسازیشده هنگام اجرای شِل. این متغیر بیشتر در شرایط سختافزاری خاص کاربرد دارد.USER
: نام کاربری که در حال حاضر وارد سیستم شده است.PWD
: دایرکتوری کاری (Current Working Directory) فعلی.OLDPWD
: دایرکتوری کاری قبلی که برای بازگشت به آن از دستورcd -
استفاده میشود.LS_COLORS
: کدهای رنگیای که برای نمایش رنگها در خروجی دستورls
تعریف شدهاند و به شناسایی سریعتر انواع فایلها کمک میکنند.MAIL
: مسیر صندوق پستی (Mailbox) کاربر فعلی.PATH
: لیستی از دایرکتوریهایی که سیستم هنگام جستجوی دستورات، در آنها جستجو میکند.LANG
: تنظیمات زبان و محلیسازی (Localization) شامل کدگذاری کاراکترها.HOME
: دایرکتوری خانه (Home Directory) کاربر فعلی._
: آخرین دستور اجرایی قبلی.
متغیرهای شِل رایج
BASHOPTS
: لیستی از گزینههایی که هنگام اجرای bash استفاده شدهاند و برای تنظیم محیط شِل کاربرد دارند.BASH_VERSION
: نسخه bash که بهصورت خوانا برای انسان ارائه شده است.BASH_VERSINFO
: نسخه bash بهصورت خروجی قابلپردازش توسط ماشین.COLUMNS
: تعداد ستونهایی که برای نمایش خروجی روی صفحه استفاده میشود.DIRSTACK
: لیستی از دایرکتوریها که با دستوراتpushd
وpopd
مدیریت میشوند.HISTFILESIZE
: تعداد خطوط تاریخچه دستورات ذخیرهشده در فایل.HISTSIZE
: تعداد خطوط تاریخچه دستورات ذخیرهشده در حافظه.HOSTNAME
: نام میزبان (Hostname) فعلی کامپیوتر.IFS
: جداکننده فیلد داخلی (Internal Field Separator) که برای جداسازی ورودی در خط فرمان استفاده میشود. مقدار پیشفرض آن فاصله (Space) است.PS1
: تعریف اصلی پیام فرمان (Primary Command Prompt) که ظاهر پیام اولیه شِل را مشخص میکند.PS2
برای اعلانهای ثانویه در خطوط چندگانه دستورات استفاده میشود.SHELLOPTS
: گزینههای شِل که با دستور set قابل تنظیم هستند.UID
: شناسه کاربر (User ID) فعلی.
نحوه تنظیم متغیرهای محیطی و متغیرهای شل
برای درک بهتر تفاوت بین متغیرهای شِل و متغیرهای محیطی و آشنایی با نحوه تنظیم این متغیرها، میتوانیم یک آزمایش ساده انجام دهیم.
نحوه ایجاد متغیرهای شل
برای تعریف یک متغیر شِل در session فعلی، کافی است یک نام و مقدار برای آن تعیین کنیم. بر اساس قواعد از پیشتعریفشده، نام متغیر را به حروف بزرگ و مقدار آن را به صورت رشتهای تنظیم میکنیم:
TEST_VAR='Hello World!'
در دستور فوق، از ' '
استفاده شده، زیرا مقدار متغیر، شامل یک space (فاصله) است. و به جای استفاده از " "
، از ' '
استفاده شده است؛ چون علامت تعجب (!) در شِل bash، یک کاراکتر خاص محسوب میشود که در غیر این صورت، تاریخچه bash گسترش مییابد.
اکنون یک متغیر شِل داریم که تنها در session فعلی، موجود است و به فرآیندهای فرزند (Child Processes)، منتقل نمیشود. برای مشاهده این متغیر میتوانیم از دستور زیر استفاده کنیم:
set | grep TEST_VAR
خروجی:
TEST_VAR='Hello World!'
متغیر فوق، یک متغیر محیطی نیست. برای بررسی این موضوع میتوان از دستور printenv
استفاده کرد:
printenv | grep TEST_VAR
با اجرای دستور فوق، هیچ خروجی نمایش داده نمیشود، زیرا TEST_VAR
یک متغیر محیطی نیست.
برای دسترسی به مقدار یک متغیر، از علامت دلار $
قبل از نام متغیر استفاده میکنیم:
echo $TEST_VAR
خروجی:
Hello World!
در نظر داشته باشید که متغیرهای شِل به فرآیندهای فرزند منتقل نمیشوند؛ برای مشاهده این موضوع، یک شِل فرزند ایجاد میکنیم:
bash
echo $TEST_VAR
با اجرای دستور فوق، هیچ خروجیای نمایش داده نمیشود زیرا متغیر TEST_VAR
به شِل فرزند منتقل نشده است. برای بازگشت به شِل اصلی، دستور زیر را وارد کنید:
exit
نحوه ایجاد متغیرهای محیطی
برای تبدیل یک متغیر شِل به متغیر محیطی، از دستور export
استفاده میکنیم:
export TEST_VAR
اکنون TEST_VAR به یک متغیر محیطی تبدیل شده است. این موضوع را میتوان با دستور زیر بررسی کرد:
printenv | grep TEST_VAR
خروجی:
TEST_VAR=Hello World!
اگر دوباره، شِل فرزند ایجاد کنیم و مقدار متغیر را بررسی کنیم:
bash
echo $TEST_VAR
خروجی باید مشابه زیر باشد:
Hello World!
همچنین، میتوان متغیرهای محیطی را مستقیماً با دستور export
تعریف کرد:
export NEW_VAR="Testing export"
برای بررسی، دستور زیر را اجرا کنید:
printenv | grep NEW_VAR
خروجی:
NEW_VAR=Testing export
حالا بیایید به شِل اصلی بازگردیم:
exit
بیایید بررسی کنیم که متغیر جدید در دسترس هست یا نه:
echo $NEW_VAR
در خروجی، هیچ مقداری باز نمیگردد، زیرا متغیرهای محیطی، فقط به فرآیندهای فرزند منتقل میشوند. محیط شِل فرزند با خروج، از بین میرود، و متغیر NEW_VAR
در شِل اصلی، در دسترس نخواهد بود. این رفتار در بیشتر موارد مفید است و از تأثیر برنامهها بر محیط شِل والد، جلوگیری میکند.
نحوه تنزیل و حذف متغیرها
برای تبدیل متغیر محیطی به یک متغیر شِل، از دستور زیر استفاده میکنیم:
export -n TEST_VAR
اکنون این متغیر دیگر یک متغیر محیطی نیست و اگر که دستور زیر را اجرا کنید:
printenv | grep TEST_VAR
انتظار میرود که خروجی خاصی به شما نمایش داده نشود. با این حال، هنوز بهعنوان یک متغیر شِل موجود است:
set | grep TEST_VAR
خروجی:
TEST_VAR='Hello World!'
برای حذف کامل یک متغیر (چه شِل و چه محیطی)، از دستور unset
استفاده میکنیم:
unset TEST_VAR
برای اطمینان از حذف شدن متغیر، دستور زیر را اجرا کنید:
echo $TEST_VAR
در خروجی، هیچ مقداری نمایش داده نمیشود؛ زیرا متغیر حذف شده است.
نحوه تنظیم متغیرهای محیطی در هنگام ورود (Login)
بسیاری از برنامهها از متغیرهای محیطی برای تعیین نحوه عملکرد خود استفاده میکنند. تنظیم این متغیرها در هر جلسه شِل ممکن است وقتگیر باشد. بنابراین، نیاز داریم که متغیرهای مهم بهطور خودکار در هنگام ورود تنظیم شوند.
تفاوت بین شِل Login و Non-Login و Interactive و Non-Interactive
شِل bash، فایلهای پیکربندی مختلفی را بسته به نحوه شروع session شِل، میخواند.
- شِل Login: یک session که با احراز هویت (مانند استفاده از SSH) آغاز میشود.
- شِل Non-Login: یک session که از درون یک session احراز هویت شده، مانند فراخوانی دستور
bash
، ایجاد میشود. - شِل Interactive: یک session که به یک ترمینال متصل است و امکان تعامل مستقیم دارد.
- شِل Non-Interactive: یک session که به ترمینال متصل نیست، مانند اجرای یک اسکریپت.
پیادهسازی متغیرهای محیطی
بیشتر توزیعهای لینوکس فایلهای پیکربندی Login را بهگونهای تنظیم کردهاند که فایلهای Non-Login را نیز بخوانند. بنابراین، میتوان متغیرهای محیطی را در فایل ~/.bashrc
تعریف کرد تا در همه جلسات (Login و Non-Login) اعمال شوند. فایل ~/.bashrc
را باز کنید:
nano ~/.bashrc
فایل ~/.bashrc
اغلب شامل دادههای زیادی است. بیشتر این تعاریف مربوط به تنظیم گزینههای bash هستند که ارتباطی با متغیرهای محیطی ندارند. شما میتوانید متغیرهای محیطی را مانند دستورات خط فرمان، بهصورت زیر تعریف کنید:
export VARNAME=value
هر متغیر محیطی جدید را میتوانید در هر جای فایل ~/.bashrc
اضافه کنید، به شرطی که در وسط یک دستور دیگر یا حلقه قرار نگیرد. پس از اعمال تغییرات، فایل را ذخیره کرده و آن را ببندید.
در session شِل بعدی، متغیرهای محیطی شما خوانده شده و به محیط شِل اعمال خواهد شد. برای اعمال فوری تغییرات در جلسه جاری میتوانید دستور زیر را اجرا کنید:
source ~/.bashrc
اگر نیاز به تنظیم متغیرهای محیطی در سطح سیستم دارید، میتوانید آنها را به فایلهای زیر اضافه کنید:
/etc/profile
/etc/bash.bashrc
/etc/environment
این فایلها برای تنظیم متغیرهایی استفاده میشوند که برای تمام کاربران سیستم اعمال خواهند شد.
نتیجهگیری
متغیرهای محیطی و متغیرهای شِل همیشه در sessionهای شِل حضور دارند و ابزارهای بسیار مفیدی هستند. این متغیرها امکان انتقال تنظیمات از یک فرآیند والد به فرزندان آن را فراهم میکنند و به شما اجازه میدهند گزینههای پیکربندی را خارج از فایلها تعیین کنید.
این ویژگی در موقعیتهای خاص مزایای زیادی دارد. به عنوان مثال، برخی از مکانیسمهای استقرار (Deployment) از متغیرهای محیطی برای تنظیم اطلاعات احراز هویت استفاده میکنند. این روش به دلیل عدم نیاز به ذخیره این اطلاعات در فایلهایی که ممکن است توسط افراد غیرمجاز دیده شوند، بسیار ایمن است.
علاوه بر این، سناریوهای رایجتری نیز وجود دارند که نیازمند خواندن یا تغییر محیط سیستم هستند. ابزارها و تکنیکهایی که در این مطلب بررسی شدند، پایهای مناسب برای ایجاد تغییرات و استفاده صحیح از این متغیرها فراهم میکنند.
اگر که به دنبال یک سرور مجازی فوقالعاده برای توسعه برنامههای خود هستید؛ میتوانید از سرور مجازی ایران لیارا، استفاده کنید. سرور مجازی لینوکس لیارا یکی از بهترین گزینهها برای توسعهدهندگان و کسبوکارهایی است که به دنبال یک سرویس قدرتمند، مقیاسپذیر و مقرون به صرفه هستند.
این سرویس با بهرهگیری از جدیدترین تکنولوژیها و سختافزارهای پیشرفته، عملکرد عالی و سرعت بالای سرور را تضمین میکند. از دیگر ویژگیهای بارز سرور مجازی لینوکس لیارا میتوان به مدیریت آسان، مقیاسپذیری بالا، امنیت بالای دادهها و پشتیبانی ۲۴ ساعته اشاره کرد.
این سرویس به کاربران امکان میدهد تا در کمترین زمان ممکن، سرورهای مجازی خود را راهاندازی و مدیریت کنند و از منابع بهینه استفاده کنند. همچنین، با ارائه پنل کاربری ساده و پشتیبانی از انواع توزیعهای لینوکس، سرور مجازی لینوکس لیارا، گزینهای عالی برای استارتاپها، توسعهدهندگان و شرکتها به شمار میآید که به دنبال راهحلهای سریع و کارآمد هستند.
در نهایت، با انتخاب لیارا، شما میتوانید یک سرور مجازی قدرتمند با هزینههای مناسب، برای پروژههای خود داشته باشید و تجربهای بینظیر از عملکرد و پشتیبانی آن، دریافت کنید.
همچنین بخوانید: نحوه نصب Nginx در سرور مجازی اوبونتو Ubuntu