آموزش بش (یونیکس شل) +‌ مفاهیم سیستم عامل گنو/لینوکس

سلام
بلاخره تصمیم گرفتم یه آموزش کامل و در عین حال ساده برای Bash و خط فرمان (Command Line) بنویسم تا دوستانی که حوصله یا وقت کافی برای یادگیری ندارند کارشون راحت بشه. با تشکر از دوستمون @nim4 که پیشنهاد انجام این کار رو به من داد.
سعی کردم تمام نکات ضروری و مهم رو بنویسم و مواردی که به نظرم کم اهمیت بودند رو نادیده بگیرم. شما با استفاده از این آموزش بش رو خیلی خوب خواهید آموخت.

این تاپیک به صورت wiki ارائه خواهد شد و شما قادر به ویرایش متن خواهید بود. پیشاپیش از همکاری شما سپاس گزاریم.

Bash زبان مورد استفاده در Shell سیستم های شبه یونیکس مثل GNU/Linux و Mac OS و یک پروژه نرم افزاری آزاد است که به وسیله آقای برایان فاکس توسعه داده شد.

در این آموزش قصد داریم به جای gui از قدرت command بهره ببریم. برای انجام دستورات کافیه Terminal رو باز کنید معمولا کلید کنترلی پیش فرض CTRL + ALT + T هست و بعد دستورات رو تایپ کنید.
خیلی از کارهایی که ما هر روز در نرم افزارهای مختلف انجام میدیم می تونیم به ساده ترین شکل ممکن در ترمینال انجام بدیم و اصلا نیازی به دانلود و نصب نرم افزارهای گرافیکی نیست.

مثلا با دستور date میشه تاریخ و با دستور cal میشه یه تقویم رو توی Terminal باز کنید.
با df می تونید فضای آزاد هارد دیسک و با free فضای آزاد مموری (RAM) رو بدست بیارید.
برای خروج از محیط ترمینال کافیه کلمه exit رو بنویسید و البته میشه از CTRL + D استفاده کنید.


حرکت در file system ها:
اولین چیزی که باید بلد باشیم حرکت در بین دایرکتوری هاست.
pwd (مخفف print working directory) مسیر دایرکتوری ای که در اون قرار دارید رو نمایش میده.
cd (مخفف change directory) با استفاده از این دستور میشه بین مسیرهای دایرکتوری ها و فایل های مختلف جابه جا بشیم.
ls (مخفف List directory) محتویات مسیری که در اون قرار دارید رو به صورت فهرست نمایش میده.
همچنین با نصب tree و بعدش دستور tree میتونید تمام دایرکتوری ها و فایل های مسیری که در اون قرار دارید رو مشاهده کنید

sudo apt install tree

برای تمرین یک دایرکتوری مثلا usr رو باز می کنیم (فراموش نکنید forward slash بزارید)
cd /usr
حالا وارد پوشه usr شدیم باز وارد کردن دستور lsمیشه محتویات فایل رو ببینیم.
حالا فولدرهای دیگه مثل bin, lib, share, src , … رو باید ببینیم.
مجددا می تونیم با ورود دستور cd و بعد فاصله و در نهایت نام مسیر وارد دایرکتوری مورد نظر بشیم. مثلا:
cd bin
حالا اگه باز هم ls بگیرید میتونید فایل های موجود در پوشهbin رو ببینید.

با استفاده از دستور file میشه اطلاعاتی در مورد نوع اون فایل بدست بیارید.
ساختار کلیش به این شکله:

file filename

مثال

file example.py
file example.png

کلمه file کلمه کلیدی هست و filename می تونه هر چیزی باشه به عنوان مثال اگه من برای یه فایل py.که مربوط به زبان پایتون هست این دستور رو بزنم با عبارتPython script, ASCII text executable مواجه خواهم شد. این کار رو می تونید برای فایل های سیستمی - تصاویر - ویدئو یا هرچیز دیگه انجام بدید.


مشاهده فایل های متنی با استفاده از دستور less:
برای باز کردن فایل های متنی می تونید از دستور less استفاده کنید. مثل سایر دستورات کافیه:
less filename رو بنویسید تا فایل رو بتونید باز کنید.
less یه برنامه خیلی ساده برای مشاهده فایل های متنی ست که توی شل باز میشه انتظار نداشته باشید چیزی مثل vim باشه! خب وقتش رسیده تا بریم کار کردن با اون رو یاد بگیریم :slight_smile: ضمنا تعدادی از کلیدهاش شبیه ویم هست.
نکته) به بزرگی یا کوچکی حروف حتما توجه کنید.

کلید b یا دکمه Page Up: به سمت بالا اسکرول می کنید. (صفحه صفحه به سمت بالا حرکت می کنید)
کلید space یا Page Down: به سمت پایین اسکرول می کنید.
کلید k یا مکان نمای بالا: خط به خط به سمت بالا حرکت می کنید.
کلید j یا مکان نمای پایین: خط به خط به سمت پایین حرکت می کنید.
کلید G: رفتن به انتهای صفحه
1G یا g: رفتن به ابتدای صفحه
myword/ : برای جست و جوی کلمه مورد نظرتون اول / (فوروارد اسلش) قرار بدید و بعد کلمه دلخواهتون رو بنویسید.
h: صفحه help را راهنما رو براتون باز می کنه
q: از برنامه less خارج خواهید شد

بررسی دقیق فایل سیستم های سیستم عامل گنو/لینوکس:

تصویر بالا ممکنه کمی ترسناک به نظر برسه, نگران نباشید :hugs: چون قراره جز به جز همشون رو به ساده ترین شکل ممکن بررسی کنیم. خب شروع کنیم:

/ : بله درسته اسلش :slight_smile: این مسیر در واقع دایرکتوری روت و به عبارتی پدر و پدر جد سایر دایرکتوری هاست. همه موارد بعدی در این مسیر قرار گرفتند.
bin/ : مجموعه ای از دستورات باینری (یا همون کد ماشین و یا همون معروف صفر و یک خودمون :wink:) در این مسیر قرار گرفتند که سیستم این کدها رو می خونه و بعد باعث عملیات بوت و در نهایت اجرای سیستم عامل میشه. علاوه بر این دستورات مهمی مثل viz., cat, du, df, tar, rpm, wc, history در این قسمت قرار دارند.

boot/ : یک پوشه بسیار مهم که کرنل لینوکس اینجا قرار گرفته و همینطور موارد دیگه ای مثل boot loader, vmlinuz, grub. همینطور یک سری فایل هایی که به عملیات بوت شدن سیستم کمک می کنند. خلاصه دایرکتوری مهمیه دیگه…

dev/ : مخفف کلمه device هست. یکی از نکات بسیار جالب در مورد گنو/لینوکس اینه که این سیستم عامل درایورهای کلیه سخت افزارها رو داره! یعنی همگی توی کرنل تعبیه شدن و مثل ویندوز نیست که باید نرم افزار جانبی نصب کرد! بنابراین اگه موبایلتون, مودم یا هر چیز دیگه ای که وصل می کنید انتظار میره که کرنل اون رو بشناسه. پس اینجا مخزنی برای نگه داری درایورهای سخت افزاری شماست.

etc/ : تنظیمات نرم افزارها و عملیات های startup, shutdown, start, stop اینجا قرار گرفته. می تونید حدس بزنید etc مخفف چیه؟ :hugs: مخفف et cetera یا همون ((و غیره)) خودمون!

home/ : از اسمش معلومه دیگه! اینجا خونه شماست! Desktop, Downloads, Documents, Pictures, Videos و … اینجا قرار گرفته… خب ولش کنیم چیز مهمی نیست :hugs::sweat_smile:

lib/ : که مخفف library هست شامل ماژول های کرنل و یه سری کتابخونه هاست که برای بوت شدن سیستم و اجرای دستورات روت مورد نیازه… الان حتما میگیرید که خب همشون برای بوت شدن مورد نیازه! خب این دایرکتوری ها با هم در ارتباط هستند و توی یه سری کارها با هم تعامل دارند اگه مشکلی در این زمینه دارید می تونید به Linus Torvalds ایمیل بزنید!

lost+found/ : این دایرکتوری که در طول مراحل نصب لینوکس, نصب میشه در واقع برای ریکاوری فایل های سیستمی به کار میره… من قبلا ویندوز داشتم هر دفعه برق قطع میشد ویندوزم سکته میزد و جابه جا تموم میکرد و دیگه بالا نمیومد :triumph: این دایرکتوری برای اینه که زمانی که برق خونتون قطع شد گنو/لینوکس بتونه فایل هایی که در اثر آسیب دیدند رو ترمیم کنه. البته اگه آسیب دیده باشن!

media/ : گنو/لینوکس در زمینه وسایل قابل حمل مثل USB, CD/DVD ROM و چیزهای دیگه ای مثل هارد دیسک و خلاصه هر وسیله جانبی که به سیستم وصل می کنید هم خلاقیت به خرج داده و یک دایرکتوری رو بهش اختصاص داده… پس اگه هارد دیسکتون مثل یه هارد اکسترنال رو به سیستم وصل کنید باید اون رو اینجا ببینید.

mnt/ : این هم شبیه media عمل میکرد البته مربوط به سیستم های قدیمی گنولینوکسی بود. که مخفف عبارت temporarily mounting drives هست.

opt/ : کلمه opt همون optional و به معنای اختیاریه… می تونید فایل های نصب برنامه هایی مثل Qt Creator یا Java و … رو اینجا قرار بدید.

proc/ : در اینجا می تونید اطلاعاتی درباره نرم افزارهای در حال اجرا کسب کنید. کلمه proc از processes گرفته شده و رویدادها و پروسه هایی که در حال اجرا هستند رو به شما نشون میده. این دایرکتوری در واقع یک فایل سیستم مجازیه. راستش این دایرکتوری یکم عجیبه… در واقع وجود نداره یا دیده نمیشه ولی می تونید جست و جوش کنید. اطلاعات چیزهایی مثل cpu, ram و … اینجا قرار داره…

root/ : وقتی که به عنوان یک کار root یا admin وارد سیستم میشید یک دایرکتوری home در اختیارتون قرار میگیره. پس home/ خونه کاربر عادی و root/ خونه کاربر روت هست :sunglasses: پس root/ یک home directory هست که در اختیار کاربر روت قرار میگیره.

sbin/ : یا system binaries شبیه bin/ هست و یه سری اطلاعات سیستمی در اون البته به صورت باینری قرار دارند. به عبارت دیگه sbin/ یه سری کدهای باینری رزرو شده برای system administrators هاست.

tmp/ : این دایرکتوری شامل فایل های temporary (موقت) هست. اگه بخوام ساده تر بگم این دایرکتوری شامل فایل هاییه که به موقتا لازمه حضور داشته باشن. می تونید یه سری از این فایل ها رو پاک کنید (به شرطی که می دونید دارید چی رو پاک می کنید!) بنابراین اگه فایل های مهم رو پاک کنید ممکنه به سیستم عاملتون آسیب بزنید.

usr/ : هر چیز مهمی که فکر می کنید اینجا قرار داره! سورس کد, آیکن ها, مستندات و … . برنامه ها و فایل هایی که بوسیله کاربر regular (غیر روت) مورد استفاده قرار میگیره اینجا قرار داره.

var/ : کلمه var رو که خیلی خوب میشناسید. var یا همون variable شامل اطلاعات logging یا ورود, mail و همینطور فایل های tmp میشه.

بسیار خب… این مرحله با موفقیت به پایان رسید :slight_smile:

دستکاری فایل ها و دایرکتوری ها:

mycat

وقتش شده کار با bash رو به صورت جدی شروع کنیم. قبل از هر کاری چند کامند (دستور) رو خدمتتون معرفی می کنم تا یه ذهنیتی داشته باشید.
cp -> برای کپی فایل ها و دایرکتوری ها مورد استفاده قرار میگیره.
mv -> برای حرکت/تغییر نام فایل ها و دایرکتوری ها استفاده میشه.
touch -> برای ساخت فایل مورد استفاده قرار میگیره
mkdir -> باعث ساخت دایرکتوری میشه
rm -> حذف فایل ها و دایرکتوری ها

از این کلمات نترسید! همشون رو یاد میگیریم…
خب قراره در یک پروژه این موارد رو بفهمیم.
یک مسیر رو برای خراب کاری هامون انتخاب کنیم :wink: مثلا پوشه Documents

اولین کاری که می خوایم انجام بدیم اینه که یک پوشه بسازیم. اسم پوشه رو میزاریم devheroes خب؟ چطوری انجام بدیم؟ من می خوام پوشه devheroes رو توی Documents ایجاد کنیم پس اولین گام ورود به پوشه Documents هست:

cd Documents

به همین سادگی وارد این پوشه شدیم. و اما چطوری یک folder بسازیم؟ :thinking: خب معلومه با mkdir:

mkdir devheroes

الان با استفاده از فایل منیجرتون وارد پوشه Documents بشید می تونید پوشه devheroes رو ببینید :slight_smile: خب نوبت به کار بعدی میرسه ما الان یک پوشه جدید ساختیم ولی هنوز واردش نشدیم چطوری وارد شیم؟ خیلی سخته :smiling_imp:
مثل همیشه cd میزاریم بعد اسم پوشه رو می نویسیم پس:

cd devheroes

و اما حالا می خوایم یه فایل بسازیم. یه فایل می تونه هر پسوندی داشته باشه html, py, rb, txt و … ما یه فایل txt می سازیم. اسمش رو هم مثلا بزاریم tutorial:

touch tutorial.txt

دیدید ساخته شد!

خب حالا بریم copy و paste کردن رو یاد بگیریم.
من می خوام یک کپی از فایل tutorial.txt رو در پوشه Downloads قرار بدم.
این کار خیلی ساده ست:
۱- کلمه cp رو می نویسم و بعد یک فاصله میزاریم (space میزنیم)
۲- آدرس مسیری که فایلتون قرار داره رو می نویسیم (اگه فایلتون رو مثل من توی Documents قرار دادید برای مسیر دادن باید اول home رو بنویسید و بعد اسم یوزرنیم سیستم عاملتون و بعد .Documents مثلا سیستم من اینجوریه (ببخشید من روی سیستمم اسم خودم رو گذاشتم و اینجا باید اون رو بنویسیم حمل بر خودخواهی نباشه :slight_smile: ) home/hadi/Documents در ادامه یک فاصله بزارید.
۳- آدرس فایل مقصد رو قرار بدید.
اما الان دستورشون رو می نویسیم:

cp /home/hadi/Documents/devheroes/tutorial.txt /home/hadi/Downloads

و اما حالا پوشه Downloads رو نگاه کنید می بینید یک کپی از tutorial.txt در اونجا قرار گرفته.

خب نوبت به cut کردن میرسه برای کات کردن دقیقا همین مراحل رو عین کپی کردن انجام میدید فقط به جای cp کلمه mv رو می نویسید به همین سادگی:

mv /home/hadi/Documents/devheroes/tutorial.txt /home/hadi/Downloads

و اما بریم remove کردن یا پاک کردن رو یاد بگیریم.
وارد پوشه devheroes بشید:

cd Documents/devheroes

کلمه rm رو بنوییسید و در نهایت اسم فایلی که قراره پاک کنید:

rm tutorial.txt

خب به همین سادگی :slight_smile: ما تونستیم کارهایی که به صورت روزمره با محیط گرافیکی انجام میدیم رو در ترمینال انجام بدیم.

حالا یه سوال؟ اگه بخوایم ده تا folder بسازیم و به صورت دستی به همشون اسم بدیم چی؟ کی حوصله داره آخه؟! توی محیط گرافیکی خیلی طول میکشه! خب راهش رو بهتون می کنم از این فرمول استفاده کنید:

mkdir dir1 New hello myFolder gnu bash programming software unix

ده تا folder درست کردم خیلی ساده و بی دردسر…

برای درست کردن فایل چی :thinking: خب کافیه به جای mkdir از touch استفاده کنید دیگه!

touch file myfile newFile vim emacs geany python tor gedit

و اما این موضوع رو همینجا تموم می کنیم فقط یک نکته خیلی خیلی خیلی مهم!

:skull_and_crossbones: :skull_and_crossbones: :skull_and_crossbones:

در استفاده از rm بسیار محتاط باشید!
**سیستم های شبه یونیکس مثل گنولینوکس دستور undelete ندارند! بنابراین وقتی از دستور rm استفاده می کنید سیستم عامل تصور می کنه شما یک کاربر با تجربه هستید و می دونید چی کار می کنید. دستور زیر

 rm *.html

تمام فایل های html یک دایرکتوری رو پاک می کنه ولییییییی اگه به اشتباه فقط یک فاصله بیشتر بعد از ستاره قرار بدید تمام فایل های html دایرکتوری ها رو پاک میکنه! یعنی این:

 rm * .html 

پس خیلی مراقب باشید!**

:skull_and_crossbones: :skull_and_crossbones: :skull_and_crossbones:

برای چاپ یک متن ساده از دستور echo استفاده می کنیم. دستور echo در زبان php هم برای چاپ یک متن استفاده میشه. البته اینجا نیازی به دابل یا سینگل کوتیشن نداریم:

echo hello bash

shell امکان انجام محاسبات ریاضی رو هم در اختیارتون قرار میده. بنابراین دیگه نیازی به ماشین حساب گرافیکی ندارید خیلی راحت میشه محاسباتتون رو به این شکل انجام بدید :slight_smile: من خیلی وقته از ماشین حساب های گرافیکی استفاده نمی کنم!
برای انجام محاسبات ریاضی اول کلمه echo رو بنویسید و بعد فاصله بزارید و بلافاصله یک پرانتز باز و بسته قرار برید و درون اون پرانتزها مجددا یک پرانتز باز و بسته بنویسید و عملیات ریاضی مورد نظرتون رو درون اون انجام بدید. مثلا دستور زیر عدد ۲ رو با ۳ جمع می کنه:

echo $((2 + 3))

در ادامه باید بگم می تونید از
عملگر + یا جمع
عملگر - یا تفریق
عملگر * یا ضرب
عملگر / یا تقسیم
عملگر ٪ یا باقیمانده
عملگر ** یا توان
استفاده کنید.

اما اگه بخوام به محاسبات قبلی یه ضربدر ۲ هم اضافه کنم تا ۱۰ چاپ بشه باید چی کار کنم؟ خیلی ساده ست!:
فقط کافیه یه $ دیگه به خاطر اضافه شدن عدد ۲ اضافه کنیم:

echo $(($((2 + 3)) * 2))

حتی می تونیم حلقه تعریف کنیم مثلا اعداد یک تا صد رو چاپ کنیم برای اینکار کافیه یه آکولاد باز و بسته ایجاد کنید و نقطه شروع تا پایان رو تعریف کنید و در حتما بینشون دو تا نقطه بزارید:


echo {1..100}

حتی می تونید قبل از اعداد یه متن هم همراهشون چاپ کنید کافیه چسبیده به bracket متن مورد نظرتون رو بنویسید مثلا دستور زی:thinking:ر متن Number رو به همراه اعداد ۱ تا ۱۰۰ نمایش میده:

echo Number_{1..100}

حتی می شه الفبای انگلیسی رو هم از ابتدا تا انتها نمایش داد!:

echo {A..Z}

اما حالا شاید بگید چاپ اعداد ۱ تا ۱۰۰ توی shell چه فایده ای داره!؟ :thinking:

مثلا میشه ۱۰۰ تا فولدر بسازید!

به عنوان مثال وارد پوشه Documents بشید:

cd Documents

و بعد ۱۰۰ تا folder میسازیم!

mkdir {1..100}

برای مشاهده فهرستی از آخرین دستوراتی که تایپ کردید کافیه کلمه history رو بنویسید.

کلمه clear هم صفحه نمایشگر رو پاک می کنه.
یه راه دیگه برای پاک کردن صفحه نمایش CTRL + L هست خوبیش اینه که حتی اگه توی پایتون باشین یا جای دیگه ای که clear کار نکنه بازم این کلید ترکیبی کار میکنه

دستورات حرکتی مکان نما:

CTRL + a -> مکان نما را به ابتدای خط می برد (دکمه home هم همین کارو میکنه)
CTRL + e -> مکان نما را به انتهای خط می برد (دکمه end هم همین کارو میکنه)
CTRL + f -> مکان نما کلمه به کلمه رو به جلو حرکت می کند
CTRL + b -> مکان نما کلمه به کلمه رو به عقب حرکت می کند
ALT + f -> پرش به انتهای کلمه بعد
ALT + b -> پرش به انتهای کلمه قبل
CTRL + d -> حذف کلمات
همین دستورات مهم ترین ها بودند.

چند منبع خوب برای یادگیری bash:

The linux command line

Unix Tutorial

Introduction to Linux: A Hands-on Guide

Bash guide for beginners

18 پسندیده

یه سوال داشتم توی محیط بش اگه بخوایم متغیری رو تنظیم کنیم که کامندی رو اجرا کنه به چه صورتی میشه ؟

مثلاً تنها با نوشتن Foo کامند python bar.py رو اجرا کنه ؟

حل شد

In addition to the backticks, you can use $(), which I find easier to read, and allows for nesting.

OUTPUT="$(ls -1)"
echo "${OUTPUT}"

Quoting (") does matter to preserve multi-line values.
1 پسندیده
alias Foo="python bar.py"
6 پسندیده

از دستور echo کجا میشه استفاده کرد؟
ینی صرفا جهت نمایش یه متنه؟
کجا از این دستور استفاده میشه؟

1 پسندیده

توی console یا Terminal… بله برای نمایش متنه…

2 پسندیده

در چه جاهای دیگری کاربرد داره؟

2 پسندیده

کاربرد اصلیش برای نمایش متنه ، میتونی این شکلی چند تا از کاربرد هاشو ببینی :
"echo "something

STR=“Hello World!”
echo $STR 2

2 پسندیده

من بازم نفهمیدم
سوال من اینه
ایا دستورecho صرفا جهت چاپ متنه؟

1 پسندیده

بله. کاربردش مثل print تو زبان های برنامه نویسیه. و عموما وقتی با sh یا هر شل دیگه ای سکریپت می نویسین به کار میاد

5 پسندیده

دوستانی که قصد دارن دید و درک عمیقی به معماری و کار با سیستم عامل لینوکس و یونیکس بیس ها پیدا کنن سعی کنید حداقل یه مدتی با توزیع gentoo کار کنید از نصب این توزیع گرفته تا مدیریتش خیلی عالی باعث می شه به این خروجی برسید البته این شخصا تجربه خودمه

4 پسندیده

بله برای چاپ و نمایش متن به کار میره :slight_smile:

1 پسندیده

این دستور کاربرد زیادی داره . میشه یک رشته رو در ترمینال چاپ کرد به این صورت

echo salam be hame

میشه محتویات یه متغیر رو چاپ کرد

echo   $PATH

میشه به صورت ترکیبی از این دستور و اپراتور ریداریکت استفاده کرد و متنی رو داخل یک فایل قرار داد

echo   this is test   >  test.txt

توی شل اسکریپت هم از echo زیاد استفاده میشه مثلا

#!/bin/bash

if [ $1 -eq 1 ]; then
	echo salam
else
	echo by
fi

توی کد بالا اگر ورودی ۱ بگیره توی ترمینال میگه salam و اگر هر چیزی غیر از اون باشه میگه by

3 پسندیده
‍alias Foo="python bar.py"

فقط این مورد رو به پاسخ دوست عزیزمون اضافه کنم . زمانیکه سیستم عامل reboot میشه این اسم مستعار که برای هدفتون در نظر گرفتین از بین میره . بهتر خط بالا رو در فایل زیر قرار بدین تا هر بار نیاز به تعریف نداشته باشین.

~/.bashrc

اگر در سشن جاری دستور مورد نظر رو در فایل بالا قرار دادین برای اینکه روی ترمینال اعمال بشه قبلش این دستور رو بزنید


source   ~/.bashrc
5 پسندیده

البته reboot نیست که باعث این موضوع میشه, وقتی در ترمینال alias تعریف کنیم فقط در همون instance که تعریف شده اعتبار داره.

echo 'alias psruby="ps aux|grep ruby"' >> ~/.bashrc
3 پسندیده

درسته فقط reboot نیست . اگر ترمینال هم بسته بشه از بین میره و حتما باید توی bashrc قرار بدیم :+1:

2 پسندیده

اگر از bash terminal استفاده کنید، من از zsh استفاده میکنم

2 پسندیده

ممنون

1 پسندیده