تا الان ما سعی کردم یکسری از موارد پایه شروع کار با لینوکس رو به شما بگیم که میتونید از “آموش Lpic1” به همه آموزش های دوره Lpic1 دسترسی داشته باشید. حالا قرار است در این پست به معرفی و کار با خط فرمان لینوکس و مواردی مانند bash , echo , pwd , set , history , uname و چیزهای دیگه آشنا شوید.
خط فرمان
Shell چیست؟
در تعریف کلی Shell یک رابط دستوری بین کاربر و هسته سیستم عامل می باشد و در واقع Shell یک قطعه نرم افزاریست که به کاربر اجازه دسترسی مستقیم به سیستم عامل را میدهد.
دستورات در کامپیوتر به صورت 0 و 1 شناخته می شوند، اما اگر ما بخواهیم برای ارتباط با کامپیوتر و اعلام دستورات به آن از کد 0 و 1 یا زبان اسمبلی استفاده کنیم بسیار دشوار خواهد بود. در نتیجه Shell ها به وجود آمده اند که با دریافت دستوراتی مشخص آن ها را برای کامپیوتر ترجمه نمایند.
Shell ها یا به صورت رابط خط دستور (Command-line Interface (CLI و یا به صورت رابط گرافیکی (Graphical User Interface (GUI می باشند.
در سیستم عامل ویندوز Shell مورد استفاده Command Prompt یا همان CMD می باشد و در سیستم عامل Linux ، انواع Shell های مختلفی به نام های Bash و CSH و K Shell و … وجود دارند. همچنین سیستم عامل Unix ، (یونیکس) نیز از سیستم عامل هایی است که بر مینای دستورات Shell کار می کنند.
تمامی عملیاتی که در سیستم عامل ها تعریف شده و انجام پذیر می باشند را می توان در Shell ها به صورت دستوراتی مشخص به سیستم عامل اعلام کرد. در سیستم عامل ویندوز به علت وجود UI معمولا کاربران از دستورات استفاده نمی کنند ولی در سیستم عامل های تحت لینوکس در صورت نصب مینیمال رابط گرافیکی ندارد و کاربران آن بیشتر با دستورات در ارتباط هستند، اما باید توجه کنید که Shell هسته انجام دهنده دستورات نیست بلکه رابطی بین کاربر و هسته سیستم می باشد و دستورات را به هسته منتقل می نماید.
Kernel یا هسته در واقع مرکز مدیریت یک سیستم عامل است که تمامی دستورات برای اجرا شدن از طریق این مرکز مدیریت صادر می شوند. تمامی اجزای سیستم عامل وابسته به این هسته است Kernel بصورت لایه بندی شده کار می کند و هر چقدر به درون این لایه بیشتر وارد شویم به منابع و دسترسی های بیشتری دسترسی پیدا خواهیم کرد اما نکته اینجاست که این لایه ها یا پوسته ها را ما به عنوان Shell یا پوسته می شناسیم. Shell ها در واقع رابط کاربری ما برای دستور دادن به کرنل سیستم عامل هستند و شما از طریق این رابط ها می توانید با سیستم عامل ارتباط برقرار کنید.
Bash (بش) چیست؟
بَش (Bash) یک پوسته یونیکس است که به صورت آزاد توسط برایان فاکس (Brian Fox) برای پروژهٔ گنو و برای جایگزینی پوسته بورن نوشته شده است. این پوسته اولین بار در سال 1989 ارائه شده و تا الآن در بسیاری از نسخههای لینوکس و سیستم عامل مک به عنوان پوسته ورود توزیع شده است.
بَش یک پردازندهٔ فرمان است که معمولاً در یک پنجرهٔ متنی اجرا میشود، جایی که کاربر فرمانهایی را تایپ میکند. بَش همینطور میتواند فرمانهای خود را از یک فایل دریافت کند. مثل همهٔ پوستههای یونیکس از این ویژگیها پشتیبانی میکند: بسط اسم فایلها، پایپها، «سند همینجا»، جایگزینی فرمان، ساختارهای کنترلی. بَش کلمات اساسی، قواعد دستوری، و بقیهٔ ویژگیهای اساسی را از پوستهٔ بورن کپی کرده است. ویژگیهای دیگری مثل تاریخ از پوستهٔ سی و پوستهٔ کورن کپی شدهاست. بَش منطبق با استاندارد پازیکس است اما با تعدادی افزونه و بسط استاندارد پازیکس.
نام بَش سرنام Bourne-again shell است که یک بازی با کلمات و ایهام است به این ترتیب که هم اشاره به پوستهٔ بورن میکند و هم به کلمهٔ born again اشاره دارد که به معنی «دوباره متولد شده» است.
در Bash سه مفهوم مهم داریم که به صورت زیر می باشد:
در شرایط معمولی هر برنامه لینوکس شامل ۳ جریان یا stream می باشد.
- stdin: منظور از آن Standard input یا ورودی استاندارد می باشد که در فایل تشریحی مقدار ۰ به آن تخصیص می یابد که به آن STDIN نیز گفته میشود. هر سیستم یونیکس یا لینوکس مقدار پیش فرض ورودی را از STDIN میخواند.
- stdout: منظور از آن Standard Output یا خروجی استاندارد می باشد که در فایل تشریحی مقدار ۱ به آن تخصیص می یاید که به آن STDOUT نیز گقته میشود. هر سیستم یونیکس یا لینوکس مقدار پیشفرض خروجی استاندارد را در STDOUT می نویسد.
- stderr: منظور از آن Standard Error یا خطای استاندارد می باشد که در فایل تشریحی مقدار ۲ به آن تخصیص می یابد که به آن STDERR نیز گفته میشود. هر سیستم یونیکس یا لینوکس پیام پیشفرش خطا را در STDERR می نویسد.
بعدا با مفهوم و مثال هایی بهتر توضیح می دهیم که این سه حالت چه کاربردی دارد.
نکته ای که در کار با هر بشی باید بدانید فرق بین کاربر معمولی و روت است، زمانی که خط فرمان شما $ است یعنی شما با یک کاربری بجز روت وارد شده اید ولی وقتی علامت # باشد یعنی شما با کاربر روت و بالاترین سطح دسترسی وارد خط فرمان شده اید.
user@nextadmin:~$
root@nextadmin:~#
برای این که بدانید با چه یوزری لاگین کرده اید می توانید از دستور whoami استفاده کنید.
بش یک فایل دارد به ادرس /etc/profile که تمام تنظیمات اولیه در آن قرار دارد و هر کاربر هم در صفحه home خود یک profile./~ دارد که بعد اجاری تنظیمات اولیه خود بش تنظیمات کاربر اجرا می شود.
همچنین فایلی به اسم bash_profile./~ نیز داریم که آن هم به بش اضافه می شود.
یک فایل هم به نام bash_logout./~ داریم که در زمان logout اجرا می شود.
آموزش دستورات Bash
دستور echo: یک دستور ساده است که هر ورودی بهش بدید همان را برای شما نمایش می دهد مانند زیر:
$ echo Hello lpic
Hello lpic
نکته در اینجا هست اگر شما در متن از # استفاده کنید که یک کارکتر خاص است و برای نوشتن توضیحات (comments) مورد استفاده قرار می گیرد و در دستور شما اجرا نمی شود.
$ echo Hello lpic #just a simple hi
Hello lpic
کارکترها و کلید های خاص در بش
Tab ↹: دو کاربرد اصلی دارد، اگر چند کارکتر اول دستورمان را بنویسیم و یک تب بزنیم دستور را برای ما کامل می کند و اگر دوبار تب را بزنیم تمام دستوراتی که ممکن است در ادامه داشته باشیم را نمایش می دهد.
↵ Enter: شما هر زمان در خط فرمان ↵ Enter کنید به خط جدید منتقل می شوید.
در بش و مخصوصا برنامه نویسی ما یکسری کاراکتر خاص داریم که بعضی از آن ها را در زیر آورده ایم:
Escape sequence Function | |
---|---|
\a | Alert (bell) |
\b | Backspace |
\c | Suppress trailing newline (same function as -n option) |
\f | Form feed (clear the screen on a video display) |
\n | New line |
\r | Carriage return |
\t | Horizontal tab |
هرجا در بش بخواهیم از یک کاراکتر خاص مثل & یا ; استفاده کنیم که منظورمان عملگر خاصی نیست باید پشت آن \ قرار دهیم.
زمانی که در بش متنی را مینویسید و فقط برای خوانایی بیشتر میخواهید از سر خط ادامه دهید کافیه جلوی متن یک \ قرار دهید و سپس ↵ Enter کنید.
$ echo but this \
is another \
usage
دقیقا برابر است با:
$ echo but this is another usage
لیست کاراکترهای خاص در Bash
کاراکتر | کاربرد |
# | برای کامنتگذاری استفاده میشود به غیر از مواقعی که بهصورت #\ و یا !# در ابتدای یک اسکریپت استفاده شود. |
\ | در انتهای یک خط استفاده میشود تا ادامهٔ اسکریپت به خط بعد را اعلام کند. |
; | هر دستوری که پس از این علامت قرار گیرد، بهعنوان یک دستور جدید تلقی خواهد شد. یعنی دستور اول را اجرا کن و سپس دستور دوم را اجرا کن |
$ | هر چیزی که پس از این علامت قرار گیرد (مثلاً sname$) بهعنوان یک متغیر شناخته میشود. |
| | یعنی خروجی دستور اول را به ورودی دستور دوم بده |
&& | یعنی دستور اول را اجرا کن اگر بدون خطا اجرا شد دستور دوم را هم اجرا کن |
|| | یعنی اگر دستور اول اجرا نشد برود دستور دوم را اجرا کند نکته ای که دارد این است که اگر دستور اول اجرا شد دیگر دستور دوم را اجرا نمی کند |
$ echo line 1;echo line 2; echo line 3
line 1
line 2
line 3
$ echo line 1&&echo line 2&&echo line 3
line 1
line 2
line 3
$ echo line 1||echo line 2; echo line 3
line 1
line 3
خروج از bash
Ctrl+d ارسال یک نشانگر EOF که باعث بسته شدن خط فرمان فعلی میشود (معادل دستور exit
). (تنها در زمانی این اتفاق میافتد که متنی در خط فعلی موجود نباشد) عملا با این روش از بش خارج می شویم.
دستور exec نیز باعث می شود اول دستور ما اجرا شود و بعد از اجرا بش را می بندد برای مثال در زیر بعد از اجرا دستور ls بش بسته می شود.
$ exec ls
تمام این موارد کاربرد اصلی خود در زمان نوشتن یک اسکریپت در بش نشان می دهد.
متغیرهای محیطی در بش
تمام متغیر ها با $ قبل از آن باید اجرا شود حتی خود متغیر $
Name | Function |
---|---|
USER | یوزر لاگین شده را نمایش می دهد |
UID | ای دی یوزر لاگین شده را نمایش می دهد |
HOME | مسیر خانه کاربر |
PWD | جایی که هستین را نمایش می دهد |
SHELL | نام شل که لاگین کردید |
$ | پروسس ای دی کاربر لاگین شده را نمایش میدهد |
PPID | پروسس ای دی بالا دستی را نمایش می دهد |
? | اخرین دستور با چی خارج شده است، هر چیزی بجز صفر یعنی اشتباه خارج شده است |
$ echo $USER $UID
user 1000
$SHELL $HOME $PWD
/bin/bash /home/user /home/user/lpic
$ (exit 0);echo $?;(exit 4);echo $?
0
4
$ echo $$ $PPID
2559 2558
برای اضافه کردن یک متغیر به بش به صورت زیر عمل می کنیم:
user@funlife:~$ MYMOOD=happy
user@funlife:~$ echo I am $MYMOOD
I am happy
برای این که باقی ابزار ها هم به متغیر ما دسترسی داشته باشند باید از دستور export استفاده کنیم:
user@funlife:~$ export MYMOOD=happy
دستور env تمام متغیرهای موجود رو نمایش می دهد.
دستور unset هم متغیر تعریف شده را پاک می کند.
با دستور set می توانید کمی تغییرات در شل ایجاد کرد، برای مثال اگر –$
بزنیم تنظیمات فعلی رو نمایش می دهد که himBH
است.
$ echo $-
himBH
در حالت پیشفرض اگر یک متغیر الکی بنویسیم بدون جواب نمایش داده می شود:
$ echo $VAR1
ولی اگه set -u استفاده کنیم به ما در صورت نبود یک متغیر پیغام نمایش می دهد:
$ set -u;echo $-
himuBH
$ echo $VAR1
-bash: VAR1: unbound variable
$ VAR1=v1;echo $VAR1
v1
$ unset VAR1;echo $VAR1
-bash: VAR1: unbound variable
دستور uname
یکی از دستورات کاربردی ادمین لینوکس دستور uname است که اگر خالی وارد کنیم به ما نوع سیستم عامل را نمایش می دهد و یا با سوئیچ a- اطلاعات معماری و کرنل سیستم را نمایش می دهد.
Option | Description |
---|---|
-s | Print the kernel name. This is the default if no option is specified. |
-n | Print the nodename or hostname. |
-r | Print the release of the kernel. This option is often used with module-handling commands. |
-v | Print the version of the kernel. |
-m | Print the machine’s hardware (CPU) name. |
-o | Print the operating system name. |
-a | Print all of the above information. |
$ uname -a
Linux funlife 3.16.0-28-generic #38-Ubuntu SMP Fri Dec 12 17:37:40 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
دستور history و جستجو
یکی از کاربردی ترین دستورها در لینوکس دستور history است که حدودا 500 دستور آخری که در سیستم لینوکسی شما وارد شده است را نمایش می دهد، و یا مثلا اگر بخواهیم 20 دستور آخر را نمایش دهد می توانیم بنویسیم history 20
اگر شما !! استفاده کتید آخرین دستور شما را اول می نویسد و سپس اجرا می کند.
اگر یک ! بزارید و بعد یک string به آن بدهید مثل echo! یعنی اخرین دستوری اولش echo داشت را اجرا کند.
اگر یک ! قرار دهیم و داخل دوتا ?? یک string قرار دهیم ?string? مثل ?echo?! اخرین دستوری که داخلش (هرجایش) echo دارد را اجرا می کند.
Ctrl+r: جستجوی آخرین فرمانی که دارای کارکتر (های) مشخصی باشد. زدن دوبارهٔ این کلید در هنگام جستجو، به فرمان قبلیتر رجوع میکند.
تمام این اطلاعات در فایلی به اسم bash_history. در فلدر home کاربر ذخیره می شود که با echo $HISTFILE محل آن را نمایش می دهد.
Paths در لینوکس
تمام دستوراتی که در لینوکس میزنیم اول میرن از چند دایرکتوری جستجو می شود و اگر در آن جا بود اجرا می شود، تمام این مسیر ها را می توان با دستور زیر دید:
user@funlife:~$ echo $PATH
که خروجی شبیه به این دارد:
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
و با دستور which هم میتوان مسیر اجرای یک دستور مثل tar یا ls و یا هر چیز دیگری را دید:
user@funlife:~$ which tar
/bin/tar
و یا با دستور whereis می گویم از دستور مثلا tar کجا ها داری:
user@funlife:~$ whereis tar
tar: /usr/lib/tar /bin/tar /usr/include/tar.h /usr/share/man/man1/tar.1.gz
همچنین دستور type رو هم داریم که شبیه به قبلیا کار می کند:
user@funlife:~$ type tar
tar is /bin/tar
حالا شما یک نرم افزار اجرایی دارید که ممکن است خودتان نوشته باشید یا دانلود کرده باشید و در هیچ کدام از مسیر های Paths هم نیست پس اجرا نمی شود و باید یکی از کار های زیر را انجام دهید.
راه اول این است که مسیر فایل خود را به Paths اضافه کنید، برای این کار ما اول می گویم تمام PATH$ را بنویس و بعد یک : بزار و بعد مسیر جدید را اضافه کن:
PATH=$PATH:/tmp/mybon
راه دوم نوشتن کامل ادرس فایل اجرایی هستش:
/tmp/mybon/test.sh
راه سوم استفاده از . و .. است که همیشه یک نقطه . یعنی همان جایی که هستم و دو نقطه .. یعنی یک قبل تر:
user@funlife:/tmp/mybon/~$ ./test.sh
دستور cd برای جا به جایی در مسیرها و دایرکتوری ها استفاده می شود که اگر به صورت خالی زده شود می رود به فلدر home کاربر و اگر با یک نقطه . زده شود یعنی همان جا و اگر با دو نقطه زده شود یعنی یکی برو عقب.
دستور pwd نیز محلی که الان شما در آن قرار دارید را نمایش می دهد.
اگر چیزی داخل () اجرا شود مثل این می ماند که یک شل جدید باز کنیم دستور را اجرا کنیم و دوباره شل را ببندیم.
دستور man در لینوکس دستوری است که میتوان Manual هر دستور لینوکس را نمایش می دهد که در پست “آشنایی با دستور man در لینوکس” درباره آن صحبت کردیم.
دستور apropos مانند سئویچ k- در man عمل می کند که تمام دستوراتی که داخلش چیزی که ما میخوایم رو داره نمایش می دهد، در مثال زیر ما هر دستوری route داشت را آوردیم:
$ apropos route
ip-mroute (8) - multicast routing cache management
ip-route (8) - routing table management
route (8) - show / manipulate the IP routing table
routef (8) - flush routes
routel (8) - list routes with pretty output format
sensible-mda (8) - a generic local MDA router for Debian systems
tor (1) - The second-generation onion router
torrc (5) - The second-generation onion router
traceroute6 (8) - traces path to a network host
traceroute6.iputils (8) - traces path to a network host
میانبرهای صفحهکلید در BASH
Tab ↹: تکمیل خودکار از جایی که مکاننما وجود دارد.
Ctrl+a : انتقال مکاننما به ابتدای خط (معادل کلید Home)
Ctrl+e : انتقال مکاننما به انتهای خط (معادل کلید End)
Ctrl+p: فراخوانی فرمان قبلی (معادل کلید ↑)
Ctrl+n: فراخوانی فرمان بعدی (معادل کلید ↓)
Ctrl+r: جستجوی آخرین فرمانی که دارای کارکتر (های) مشخصی باشد. زدن دوبارهٔ این کلید در هنگام جستجو، به فرمان قبلیتر رجوع میکند.
Ctrl+o: اجرای فرمانی که در جستجو یافته شد.
Ctrl+l: پاک کردن محتویات صفحهنمایش (معادل فرمان clear
).
Ctrl+u: پاک کردن محتویاتی از خط که قبل از مکاننما وجود دارند و کپی کردن آنها درون بریدهدان.
Ctrl+k: پاک کردن محتویاتی از خط که بعد از مکاننما وجود دارند و کپی کردن آنها درون بریدهدان.
Ctrl+w: پاک کردن کلمهٔ قبل از مکاننما و کپی کردن آن درون بریدهدان.
Ctrl+y: چسباندن محتویات بریدهدان از جایی که مکاننما وجود دارد.
Ctrl+d: ارسال یک نشانگر EOF که باعث بسته شدن خط فرمان فعلی میشود (معادل دستور exit
). (تنها در زمانی این اتفاق میافتد که متنی در خط فعلی موجود نباشد)
Ctrl+c: ارسال یک سیگنال از نوع SIGINT به پروسهٔ فعلی، که باعث پایان اجرا و بسته شدن آن میشود.
Ctrl+z: ارسال یک سیگنال از نوع SIGTSTP به پروسهٔ فعلی، به باعث به تعلیق درآمدن آن میشود؛ که برای برگشت دادن آن میتوان از دستور fg process-name-or-job-id
استفاده کرد.
Ctrl+x Ctrl+e: ویرایش خط فعلی در ادیتوری که توسط متغیر EDITOR$ تعریف شدهاست.
Alt+f: حرکت به جلو به اندازهٔ یک واژه.
Alt+b: حرکت به عقب به اندازهٔ یک واژه.
Alt+Del: برش کلمهٔ واقع در قبل از مکاننما
Alt+d: برش کلمهٔ واقع در بعد از مکاننما
Alt+u: تبدیل تمام حروف کوچک به بزرگ، واقع در بعد از مکاننما تا انتهای کلمهٔ فعلی
Alt+l: تبدیل تمام حروف بزرگ به کوچک، واقع در بعد از مکاننما تا انتهای کلمهٔ فعلی
Alt+c: تبدیل حرف واقع در زیر مکاننما از کوچک به بزرگ و رفتن به انتهای کلمهٔ فعلی
Alt+r: انصراف تغییرات و برگرداندن محتویات خط فعلی به همان شکلی که در تاریخچهٔ خط فرمان موجود بود.
خیلی عالی و کامل بود ممنون