متغیر محیطی PATH در لینوکس

متغیر محیطی PATH مسیر هایی رو ذخیره میکنه که فایل های executable دارن.مقدمهاولین باری که خودم با متغیر محیطی PATH رو به رو شدم موقع نصب Java بود. بعد ها وقتی که به سمت Ubuntu حرکت کردم بیشتر با این متغیر و کاربرد هاش آشنا شدم. متغیر محیطی PATH همون طوری که از اسمش بر میاد یک متغیر محیطی (Environment Variable) عه. مقدار PATH یک رشته است که از مسیر (Path) هایی که با : (اسم این علامت دو نقطه colon عه) از هم جدا شدن درست شده. در ادامه این مقاله بیشتر با این متغیر آشنا میشیم.مفهوم متغیر محیطیبرای درک بهتر متغیر محیطی PATH اول از همه باید با متغیر های محیطی آشنا بشیم. متغیر های محیطی (Environment variable) همون طوری که از اسمشون مشخصه به متغیر هایی اطلاق میشن که اطلاعاتی در خصوص محیط پردازش رو نگهداری میکنن. منظور از محیط در این جا هر فضایی هست که بشه درش عملیات رایانه ای انجام داد. برای مثال وقتی که یک نرم افزار رو روی ۲ تا کامپیوتر جدا نصب می کنیم، هر سیستم عاملی یک محیط برای اون نرم افزار حساب میشه و هر محیطی هم ویژگی های خاص خودش رو داره که این ویژگی ها در متغیر های محیطی ذخیره میشن. اصطلاح متغیر های محیطی کلی تر از این حرفاست. حتی روی یک رایانه هم که ۲ تا اکانت کاربری متفاوت داریم، هر کاربری متغیر های محیطی خودش رو داره. متغیر های محیطی مختص Unix یا Windows نیستن و در معماری نرم افزار هم ازشون استفاده میشه. مثلا وقتی که Laravel رو نصب می کنیم یک فایل به اسم env. داریم که متغیر های محیطی رو در خودش نگهداری میکنه.مثال اکانت کاربریفرض کن که روی یک سیستم عامل Ubuntu دو تا کاربر داریم. نام کاربری یکی bizhan و نام کاربری اون یکی sepehr عه. همون طوری که توضیح دادیم هر کدوم از این کاربر ها متغیر های محیطی خودشون رو دارن. یکی از این متغیر های محیطی USER نام داره که username کاربری که داره از سیستم استفاده میکنه رو در خودش نگهداری میکنه. وقتی که با اکانت کاربری bizhan از ترمینال استفاده کنیم و دستور زیر رو وارد کنیم مقدار bizhan برامون پرینت گرفته میشه:echo $USERولی وقتی که با اکانت کاربری sepehr از سیستم عامل استفاده کنیم و دقیقا همین کد بالا رو توی ترمینال اجرا کنیم مقداری که پرینت میشه sepehr عه.متغیر های محیطی در لینوکسحالا که با مفهوم کلی متغیر محیطی آشنا شدیم وقتشه که به صورت عملی با متغیر های محیطی ای که در سیستم عامل لینوکس باهاشون سر و کار داریم رو به رو بشیم. برای مشاهده همه متغیر های محیطی دستور env رو داخل terminal وارد می کنیم.envوقتی دستور بالا اجرا بشه، میبینی که همه متغیر های محیطی به صورت UPPERCASE نام گذاری شدن. مثلا متغیر محیطی HOME که آدرس مسیر خانه کاربر رو در خودش نگهداری میکنه. چند تا از متغیر های محیطی معروف لینوکس رو این زیر برات لیست کردم:PWD: آدرس مسیری که کاربر در حال حاضر توش هستHOME: آدرس پوشه خانه کاربر لاگین کردهUSER: نام کاربری کاربر لاگین کردهPATH: مسیر هایی که سیستم عامل در اون ها دنبال فایل های قابل اجرا می گردهتعریف متغیر محیطی در لینوکسحالا که این همه از متغیر های محیطی صحبت کردیم حیف نیست که متغیر محیطی خودمون رو تعریف نکنیم؟! با دستور export میشه متغیر محیطی مخصوص خودمون رو تعریف کنیم.export MY_ENV_VAR='bizhan.he1996'همون طوری که متوجه شدی برای تعریف متغیر محیطی نیازی به علامت $ نیست. علامت $ وقتی استفاده میشه که بخایم به مقدار یک متغیر دست پیدا کنیم. برای مثال بعد از اجرای کد بالا اگه دستور زیر رو اجرا کنم:echo MY_ENV_VARتنها چیزی که عایدم میشه عبارت MY_ENV_VAR هست. ولی اگه دستور زیر رو اجرا کنم مقدار متغیر MY_ENV_VAR که برابر با bizhan.he1996 بود برام پرینت گرفته میشه:echo $MY_ENV_VARهم چنین برای عوض کردن مقدار یک متغیر محیطی هم مجددا از همین دستور export استفاده میشه:export MY_ENV_VAR='new value'جهت حذف یک متغیر از دستور unset استفاده میشه:unset MY_ENV_VARهر کاری که با متغیر های محیطی تعریف شده انجام دادیم به محض این که terminal رو ببندیم و یک ترمینال جدید باز کنیم از بین خواهد رفت. به عبارتی عمر متغیر های محیطی که خودمون تعریف میکنیم یا تغییراتی که روی متغیر های محیطی خود لینوکس میدیم محدود به طول عمر همون یک terminal ای هست که باز کردیم. این جا سوال پیش میاد که پس اگه بخایم یک متغیر محیطی رو مادام العمر تغییر بدیم یا یک متغیر محیطی همیشگی برای خودمون تعریف کنیم باید چه کار کنیم؟!فایل bashrc.پاسخ سوال بالا در فایلی به نام bashrc. نهفته است که توی home directory موجوده (برای پرش به مسیر خانه فقط کافیه که cd رو داخل ترمینال اجرا کنی بدون هیچ اضافاتی). این فایل از اون جایی که اول اسمش یک dot هست hidden عه و برای مشاهده اش با دستور ls باید آپشن a- رو وارد کنیم:ls -aوقتی که پیداش کردیم با یک ویرایشگر متن مثل nano یا gedit می تونیم ویرایشش کنیم. gedit .bashrc در انتهای فایل bashrc. (بدون این که به بقیه چیزای فایل کار بگیریم) عبارت زیر رو اضافه میکنیم و در نهایت فایل رو ذخیره میکنیم، ترمینال رو می بندیم و یک ترمینال جدید باز میکنیم:export MY_ENV_VAR='bizhan.he1996'حالا که ترمینال جدید باز کردیم تست می کنیم که آیا متغیر محیطی مون تعریف شده یا نه:echo $MY_ENV_VARخاصیت مهم فایل bashrc. اینه که هر باری که یک terminal جدید باز میکنیم دستورات درون این فایل اجرا میشه. پس از این به بعد هر مرتبه که terminal رو باز کنیم خط بالا هم اجرا میشه و متغیر محیطی مون تعریف میشه. فایل bashrc. مخصوص non-login shell هاست. برای login shell ها فایل profile. اجرا میشه که این فایل هم داخل home directory‌ قرار داره. در حد این مقاله، با همون فایل bashrc. کار کنیم کافیه.متغیر محیطی PATHحالا که هم با مفهوم متغیر محیطی و هم با متغیر های محیطی در لینوکس آشنا شدیم وقتشه که بریم سر اصل مطلب. متغیر محیطی PATH در لینوکس مسیر هایی (directory) هایی رو در خودش ذخیره میکنه که سیستم عامل باید در اون مسیر ها دنبال فایل executable بگرده. منظور از فایل executable فایلی هست که خودش قابل اجراست و نیازی به compiler هایی مثل gcc نداره. البته اجرا کردن این فایل های قابل اجرا مشروط بر اینه که اجازه (permission) اجرا کردن اون فایل به کاربری که قصد اجراش رو داره داده شده باشه. بذار با یک مثال بریم جلو. فرض کن که قصد داریم دستور مخصوص خودمون رو درست کنیم. یعنی همون جوری که از دستور هایی مثل ls و cd یک عمره داریم استفاده میکنیم یک دستور هم برای خودمون درست کنیم. مثلا فرض کن اسم دستور مون bizhan باشه. برای این کار قدم به قدم:فایلی به نام bizhan.sh توی مسیر خانه درست می کنیم. این طوری:touch bizhan.shدرون این فایل (که به زبان Bash هست) این کد رو قرار میدیم:echo 'My Name is Bizhan'فایل رو ذخیره میکنیم و می بندیم. حالا برای این که تست کنیم این فایل درست کار میکنه یا نه به دستور bash میدیمش:bash bizhan.shمشاهده میکنیم که عبارت My name is Bizhan رو برامون پرینت کرد. در گام بعدی برای این که این فایل رو قابل اجرا کنیم (یعنی بدون نیاز به دستور bash به عبارت My name is Bizhan برسیم) باید permission اجرا شدن رو به کاربر بدیم. این طوری:chmod u+x bizhan.shحالا اگه توی ترمینال و در آدرس خانه عبارت زیر رو وارد کنیم عبارت My name is Bizhan برامون پرینت میشه:./bizhan.shبه عبارتی فایل bizhan.sh رو بدون نیاز به bash اجرا کردیم، مستقیما. ولی راهکاری هست که حتی از این هم مستقیم تر اجرا کنه این فایل رو. پسوند sh. فایل رو پاک میکنیم (یعنی اسم فایل بشه bizhan خالی). این جاست که متغیر PATH میاد وسط. اگه یادت باشه گفته بودیم متغیر محیطی PATH آدرس مسیر هایی رو نگه داری میکنه که درش فایل های executable وجود دارن. برای اضافه کردن home directory به PATH داخل فایل bashrc. میریم و عبارت زیر رو در انتهاش اضافه میکنیم، ذخیره میکنیم و می بندیم:export PATH=~:$PATHحالا از این به بعد هر بار که ترمینالو باز کنیم خط بالا اجرا میشه و مقدار متغیر PATH رو عوض میکنه. پس از این به بعد توی هر مسیری که دستور bizhan رو وارد کنیم عبارت My name is Bizhan پرینت خواهد شد چون که فایل bizhan تو مسیر خانه قرار داشت که مسیر خانه هم به متغیر PATH اضافه شده بود. مسیر هایی که توی متغیر PATH ذخیره شدن جهت فایل های executable اسکن میشن و فایل bizhan هم اگه یادت باشه executable کرده بودیم.نتیجه گیریببخشید اگه طولانی شد. سعی کردم با مثال و ریز توضیح بدم که قابل درک باشه. در نهایت خیلی خوشحال میشم اگه نظرت در مورد این مقاله رو به صورت یک کامنت زیر خودش بهم بگی.