بلاگ شخصی امین

اینجاییم که باهم یاد بگیریم

1 October 2025

قسمت چهارم آموزش لینوکس - Shell and Terminal

by amin Ghorbani

کار در خط فرمان

دو تا مفهوم در اینجا وجود دارد که خیلی خوب و مهمه که باید تفاوتشون رو باهم درک کنیم:

  1. Shell
  2. Terminal Emulator وقتی صحبت از Terminal Emulator میکنیم منظورمون پوسته ای است که به ما اجازه میدهد از Shell استفاده و دستورات خود را اجرا کنیم. ما انواع مختلفی Shell و Terminal Emulator داریم. برای اینکه Shell خود را ببینیم کافیه ببینیم به کدام نوع از انواع Shell اشاره میکند:

نمایی از Bash یه راه دیگه هم اینه که متغیر محلی SHELL$ را چک کنید:

echo $SHELL

خروجی متغیر SHELL

یادتونه که گفتیم فایل های اجرایی لینوکس توی /bin/ هستند :)

انواع shell وجود دارد مانند :

خب حالا وقتی شما یه دستوری را تایپ میکنید تا اجراش کنید دوحالت دارد:

  1. دستوراتی که برای خود Shell است:
    1. ls
    2. pwd
    3. cd
  2. دستوراتی که باید بره در سیستم بگرده و فایل اجراییش رو پیدا کنه:
    1. ping
    2. curl برای اینکه این را تشخیص دهید کافیست از دستور type بگیرید
type cd

نمونه خروجی type cd

type ping

نمونه خروجی type ping

یک سری دستورات در لینوکس هستند که خیلی ساده هستند احتمالا همه ما هم بلدیم شبیه cd, pwd, ls و از این دست دستورات. داشتم فکر میکردم که اینا رو اینجا درباره شون بنویسم یا رد شم و برم تصمیم گرفتم برای اینکه بحث ناقص نباشه کوتاه و مختصر بگم … پیشنهاد هم میکنم شما هم بخونید

دستور cd

دستور cd دستور تغییر Directory است. ببین شما در محیط ترمینال خودتون یه سری دستور دارید که فرقی نمیکنه کجا بزنید یعنی مسیر ترمینال چه در tmp باشد چه bin وقتی میزنی ping کارش رو میکنه اما بعضی از دستورات هستند که این موضوع درشون مهم میشه مثلا فرض کنید میخواهید یه فایل پکیج را که در مسیر زیر است نصب کنیم

/home/amin/a.rpm

خب شما باید به پوشه home/amin/ بروید بعد بزنید a.rpm نصب شه برای این منظور دستوری به اسم cd وجود دارد که میتوانید با آن تعیین کنید دستورات شما در کدام Directory اجرا شود. مثلا با دستور زیر میتوانید به پوشه بالا بروید:

cd /home/amin

اینجا فرقی نداره مسیر فعلی شما کجاست، شما دقیق گفتید که به کجا میخواهید برید.

شما میتونید به دو شکل به مسیردهی دلخواهتون را انجام بدید:

cd /home/amin
cd amin/docs

حالا فرض کنید از پوشه docs به پوشه home/amin/course/ بروید :

cd ../course

در اینجا .. یعنی یه پوشه به عقب برگرد و بعدش گفتیم بره تو course

دستور pwd

خب حالا زیاد بین پوشه ها جابه جا شدیم با دستور pwd میتونید به دست بیارید که دقیقا الان تو کدوم پوشه اید

pwd

دستور uname

شما گاهی میخواهید بفهمید سیستم عاملتون چیه، چه نسخه ای هست، ورژن کرنلش چیه و حتی پردازنده اتون رو بفهمید چند بیتی است همه این اطلاعات با دستور زیر به دست می آید

uname -a

خروجی uname

یه نکته مهم اینجا هست شما هر دستوری رو که بخواهید بزنید و نیاز داشته باشید سوییچ هاش رو به یادتون بیارید به راحتی با man میتونید اینکار رو کنید

man uname

خروجی man uname

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

مثل همه زبان های برنامه نویسی و اسکریپت نویسی شما میتوانید در محیط شل خود متغیر تعریف کنید:

var="Hello World!"
echo $var

خروجی تعریف متغیر خود Shell تعداد زیادی متغیر داره که بهشون Environment Variable میگوییم شما با دستور زیر لیست همه رو میبینید:

env

خروجی env شما با یه سری دستوراتمیتونید اطلاعات خوبی در بیارید مثلا فرض کن من میخوام بدونم وقتی ping میزنم چی اجرا میشه اینجا کافیه بزنم

which ping

خروجی which ping

این اتفاق با کمک PATH که در env تعریف شده میاد، اما این PATH چیه؟ در حقیقت لیست پوشه هایی که SHELL در آن ها باید دنبال دستورات و برنامه های کاربردی بگردد است.

متغیر PATH

یکی دیگر از متغیرهای محلی تعریف شده HISTFILE است که ادرس BASH_HISTORY رو در خودش داره… شاید براتون سوال شه BASH_HISTORY چیه؟ این فایل فایلی است که هر وقت شما یک دستور را در SHELL اجرا میکنید به تهش اضافه میشه و لاگ میافته

متغیر HISTFILE

اما این عکس بالا رو با دقت نگاه کنید هر USER در سیستم لینوکسی BASH HISTROY خودش رو داره این خیلی هم منطقیه …. خب معمولا این فایل خیلی بزرگه اگر دنبال یه دستور هستم که بخشیش یادمه و قبلا اجرا ککردم میتونم در آن ctrl + R رو بزنم و بخشی از دستور رو بنویسم

دستور export

شما وقتی یه متغیری را تعریف میکنید در محیط شل به صورت پیش فرض اگر برید برنامه دیگری را در این شل اجرا کنید به ان متغیر دسترسی ندارد برای اینکه برنامه های دیگه تون هم بهش دسترسی داشته باشد باید آن را export کنید

بررسی PATH

حالا خوبه یه مقدار بریم ببینیم این متغیر PATH دقیقا چیه؟ گفتیم لیست پوشه هایی که SHELL در آن ها باید دنبال دستورات و برنامه های کاربردی بگردد است. فرض کنید من یه دستوری را در TERMINAL خودم مینویسم، SHELL اولین کاری که میکند این است که بررسی میکنه این دستور آیا در دستورات داخلیش وجود دارد یا خیر اگر بود اجرا میکنه اگر نبود میره سراغ مسیرهایی که داخل PATH هست یا نه … این بررسی به ترتیب اتفاق میافته مثلا ماشین زیر رو در نظر بگیرید:

نمونه PATH در لینوکس

شما اگر در این ماشین یه دستوری را بزنید ترتیبی که shell دنبالش میگرده به شکل زیر است:

  1. دستورات داخلی
  2. مسیر sbin/
  3. مسیر usr/sbin/
  4. مسیر usr/local/sbin/
  5. مسیر root/bin/
  6. مسیر usr/local/bin/
  7. مسیر usr/bin/
  8. مسیر bin/
  9. مسیرusr/bin/X11/
  10. مسیر usr/games/ اگر پیدا نشه ERORR اتفاق میافته.

حالا اگر بخوایم مسیر خودمون را هم به این مقادیر اضافه کنیم با دستور زیر میتوانیم این کار را انجام بدیم:

export PATH=$PATH:/home/amin/binariesFolder

دستور which که قبلا گفتیم میاد دنبال دستوری که بهش دادید در این مسیرهای موجود در PATH میگردد و میگه اگر این دستور رو بزنی من از کجا چه فایلی را اجرا میکنم. به یه چیزی دقت کنید شما وقتی دستور خود را میزنید فقط و فقط ابتدا دستورات داخلی بعد هم مسیرهای داخل PATH رو چک میکنه برای اجراش حتی اگر در مسیر اون فایل SHELL باز کرده باشید. اما خب حالا فرض کنید من برنامه ای به اسم myapp دارم که میخوام اجراش کنم، مسیرش هم در PATH نیست الانم SHELL در همون پوشه حاوی فایل بازه چیکار کنم؟

./myapp

اگرم shell تو مسیرش نباشه میتونم ادرس absolute یا relative فایل رو بدم

tags: Bash - shell - terminal - linux - PATH