قسمت چهارم آموزش لینوکس - Shell and Terminal
by amin Ghorbani
کار در خط فرمان
دو تا مفهوم در اینجا وجود دارد که خیلی خوب و مهمه که باید تفاوتشون رو باهم درک کنیم:
- Shell
- Terminal Emulator وقتی صحبت از Terminal Emulator میکنیم منظورمون پوسته ای است که به ما اجازه میدهد از Shell استفاده و دستورات خود را اجرا کنیم. ما انواع مختلفی Shell و Terminal Emulator داریم. برای اینکه Shell خود را ببینیم کافیه ببینیم به کدام نوع از انواع Shell اشاره میکند:
یه راه دیگه هم اینه که متغیر محلی SHELL$ را چک کنید:
echo $SHELL

یادتونه که گفتیم فایل های اجرایی لینوکس توی /bin/ هستند :)
انواع shell وجود دارد مانند :
- bash
- zsh
- dash
- ksh
- csh و انواع دیگری از shellها که وجود دارد. در حقیت اون صفحه معمولا سیاهی :) که شما تو لینوکس باز میکنید و دستورات رو مینویسید داخلش میشه Terminal Emulator و پوسته ای است برای اینکه دستورات به shell برود و اجرا شود.
خب حالا وقتی شما یه دستوری را تایپ میکنید تا اجراش کنید دوحالت دارد:
- دستوراتی که برای خود Shell است:
- ls
- pwd
- cd
- دستوراتی که باید بره در سیستم بگرده و فایل اجراییش رو پیدا کنه:
- ping
- curl برای اینکه این را تشخیص دهید کافیست از دستور type بگیرید
type cd

type ping

یک سری دستورات در لینوکس هستند که خیلی ساده هستند احتمالا همه ما هم بلدیم شبیه cd, pwd, ls و از این دست دستورات. داشتم فکر میکردم که اینا رو اینجا درباره شون بنویسم یا رد شم و برم تصمیم گرفتم برای اینکه بحث ناقص نباشه کوتاه و مختصر بگم … پیشنهاد هم میکنم شما هم بخونید
دستور cd
دستور cd دستور تغییر Directory است. ببین شما در محیط ترمینال خودتون یه سری دستور دارید که فرقی نمیکنه کجا بزنید یعنی مسیر ترمینال چه در tmp باشد چه bin وقتی میزنی ping کارش رو میکنه اما بعضی از دستورات هستند که این موضوع درشون مهم میشه مثلا فرض کنید میخواهید یه فایل پکیج را که در مسیر زیر است نصب کنیم
/home/amin/a.rpm
خب شما باید به پوشه home/amin/ بروید بعد بزنید a.rpm نصب شه برای این منظور دستوری به اسم cd وجود دارد که میتوانید با آن تعیین کنید دستورات شما در کدام Directory اجرا شود. مثلا با دستور زیر میتوانید به پوشه بالا بروید:
cd /home/amin
اینجا فرقی نداره مسیر فعلی شما کجاست، شما دقیق گفتید که به کجا میخواهید برید.
شما میتونید به دو شکل به مسیردهی دلخواهتون را انجام بدید:
- Absolute Path: اینجا حالتی است که شما مسیر دقیق جایی که میخواهید بروید ذکر میکنید اما این مسیر دهی رو از کجا باید بدیم از پوشه root سیستم مثلا وقتی مخواید پوشه amin در مسیر home خودتون رو ببینید اینجوری مسیر میدید:
cd /home/amin
- Relative Path در این نوع مسیر دهی شما از جایی که هستید ادرس میدید یعنی فرض کنید در پوشه home هستید و میخواهید به پوشه home/amin/doc/ بروید در اینجا به صورت زیر آدرس دهی رو انجام میدید :
cd amin/docs
حالا فرض کنید از پوشه docs به پوشه home/amin/course/ بروید :
cd ../course
در اینجا .. یعنی یه پوشه به عقب برگرد و بعدش گفتیم بره تو course
دستور pwd
خب حالا زیاد بین پوشه ها جابه جا شدیم با دستور pwd میتونید به دست بیارید که دقیقا الان تو کدوم پوشه اید
pwd
دستور uname
شما گاهی میخواهید بفهمید سیستم عاملتون چیه، چه نسخه ای هست، ورژن کرنلش چیه و حتی پردازنده اتون رو بفهمید چند بیتی است همه این اطلاعات با دستور زیر به دست می آید
uname -a

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

متغیرهای محیطی
مثل همه زبان های برنامه نویسی و اسکریپت نویسی شما میتوانید در محیط شل خود متغیر تعریف کنید:
var="Hello World!"
echo $var
خود Shell تعداد زیادی متغیر داره که بهشون Environment Variable میگوییم شما با دستور زیر لیست همه رو میبینید:
env
شما با یه سری دستوراتمیتونید اطلاعات خوبی در بیارید مثلا فرض کن من میخوام بدونم وقتی ping میزنم چی اجرا میشه اینجا کافیه بزنم
which ping

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

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

اما این عکس بالا رو با دقت نگاه کنید هر USER در سیستم لینوکسی BASH HISTROY خودش رو داره این خیلی هم منطقیه …. خب معمولا این فایل خیلی بزرگه اگر دنبال یه دستور هستم که بخشیش یادمه و قبلا اجرا ککردم میتونم در آن ctrl + R رو بزنم و بخشی از دستور رو بنویسم
دستور export
شما وقتی یه متغیری را تعریف میکنید در محیط شل به صورت پیش فرض اگر برید برنامه دیگری را در این شل اجرا کنید به ان متغیر دسترسی ندارد برای اینکه برنامه های دیگه تون هم بهش دسترسی داشته باشد باید آن را export کنید
بررسی PATH
حالا خوبه یه مقدار بریم ببینیم این متغیر PATH دقیقا چیه؟ گفتیم لیست پوشه هایی که SHELL در آن ها باید دنبال دستورات و برنامه های کاربردی بگردد است. فرض کنید من یه دستوری را در TERMINAL خودم مینویسم، SHELL اولین کاری که میکند این است که بررسی میکنه این دستور آیا در دستورات داخلیش وجود دارد یا خیر اگر بود اجرا میکنه اگر نبود میره سراغ مسیرهایی که داخل PATH هست یا نه … این بررسی به ترتیب اتفاق میافته مثلا ماشین زیر رو در نظر بگیرید:

شما اگر در این ماشین یه دستوری را بزنید ترتیبی که shell دنبالش میگرده به شکل زیر است:
- دستورات داخلی
- مسیر sbin/
- مسیر usr/sbin/
- مسیر usr/local/sbin/
- مسیر root/bin/
- مسیر usr/local/bin/
- مسیر usr/bin/
- مسیر bin/
- مسیرusr/bin/X11/
- مسیر 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