باقری
باقری
خواندن ۸ دقیقه·۹ ماه پیش

کار با خط فرمان (قسمت اول)

برای کار با خط فرمان، دستورات خود را در یک شل (پوسته) وارد می‌کنیم. در واقع شل، یک واسط کاربری نرم‌افزاری برای ارتباط با سیستم‌عامل است که البته باید در یک پنجره متنی اجرا شود. به این پنجره متنی ترمینال (و یا شبیه‌ساز ترمینال) می‌گویند. راه دیگر دسترسی به شل این است که به صورت متنی (text mode) به سیستم وارد شویم
از جمله ترمینال‌های متداول در محیط لینوکس می‌توان به موارد زیر اشاره نمود:

gnome-terminal, xfce-terminal, konsole, xterm, terminator.

که مورد اول، گزینه پیش‌فرض در توزیع ابونتو و مورد دوم، گزینه پیش‌فرض در توزیع مینت می باشد.

پس از اجرای ترمینال و یا ورود به سیستم در حالت متن، به صورت خودکار در پوسته پیش‌فرض قرار گرفته و می‌توانیم با نوشتن دستورات آن پوسته به سیستم‌عامل خود فرمان دهیم.
هر چند که bash یا Bourn Again Shell یکی از معروف‌ترین پوسته‌های موجود است، اما تنها گزینه موجود نیست و از برنامه‌های پوسته زیر هم می‌توان استفاده نمود:

dash, zsh, ksh, csh

برای آگاهی از نوع پوسته پیش‌فرض می‌توانیم محتوای متغیر محیطی SHELL$ را به صورت زیر مشاهده کنیم:

$ echo $SHELL

و حتی می‌توانیم با تغییر مقدار آن، پوسته پیش‌فرض را تغییر دهیم.
آزمایش: در ابتدا ویرایش‌گر gedit را در صورتی که نصب نبود، به صورت زیر نصب کنید

$ sudo apt update
$ sudo apt install gedit

سپس دستور زیر را اجرا کنید:

$ sudo gedit /etc/environment

آنگاه دستور زیر را برای تغییر متغیر SHELL به صورت سراسری و دائمی به انتهای این فایل اضافه نموده و تغییرات خود را ذخیره کنید:

SHELL="/bin/sh"

فایل sh در واقع یک پیوند نمادین (symbolic link) , چیزی شبیه به فایل‌های shortcut در ویندوز است که در واقع آدرس یک برنامه اجرایی را نشان می‌دهد. به همین دلیل است که با اجرای دستور زیر

$ readlink /bin/sh

نام برنامه‌ای که sh به آن اشاره دارد (مثلا dash) را بر روی صفحه نمایش مشاهده می‌نماییم.
به این ترتیب مقدار متغیر SHELL از bash به dash تغییر پیدا می‌کند که برای اطمینان از آن، پس از راه‌اندازی مجدد لینوکس، برنامه ترمینال قبلی را مجددا اجرا می‌کنیم تا تغییر نوع پوسته پیش‌فرض را در عمل مشاهده کنیم:

نوع پوسته اولیه (bash)
نوع پوسته اولیه (bash)


پوسته و دو نوع دستور

دستوراتی که در داخل پوسته اجرا می‌شوند بر دو نوع هستند:
دستورات توکار (داخلی) که پوسته آن‌ها را بدون نیاز به هر گونه برنامه خارجی می‌شناسد و اجرا می‌کند.

و دستورات خارجی که پوسته خود به تنهایی قادر به اجرای آن‌ها نیست و برای اجرای آن‌ها باید از برنامه‌های خارجی استفاده کند، مانند دستور ping یا vim و ...


$ type cd
cd is a shell built-in
$ type ls
ls is aliased to `ls --color=auto'
$ type ping
ping is /usr/bin/ping


شما در حال حاضر بسیاری از دستورات :) دایرکتوری را تغییر می دهد، از جمله (دایرکتوری فعلی) و (دایرکتوری والدین). cd...

شما می توانید به دایرکتوری ها به دو روش اشاره کنید:

  1. مسیرهای مطلق: مانند /home/jadi/lpic1/lesson3.1
  2. مسیرهای نسبی: مانند . در این مورد، ما در ابتدا اضافه نمی کنیم، بنابراین bash سعی خواهد کرد دایرکتوری را پیدا کند که در ان هستیم (محلی / نسبی)lpic1/lesson3.1/lpic1
کاراکترها به معنای دایرکتوری خانگی کاربر است که فرمان را صادر می کند~

همچنین امکان صدور بدون هیچ پارامتری وجود دارد. این شما را به دایرکتوری خانه خود منتقل می کند. بنابراین این سه فرمان همه برابر هستند:cd

کپی

cd cd ~ cd $HOME

چاپ پوشه کاری (جاری)

برای اینکه بدانیم در حال حاضر در کدام پوشه هستیم، از دستور ساده pwd (print working directory) استفاده می‌کنیم:

$ pwd

نام

اطلاعاتی در مورد سیستم به شما می دهد. سوئیچ های معمول عبارتند از:

گزینهتوضیحات-sنام هسته را چاپ کنید. این پیش فرض است اگر هیچ گزینه ای مشخص نشده باشد.-nنام گره یا نام میزبان را چاپ کنید.-rانتشار هسته را چاپ کنید. این گزینه اغلب با دستورات دست زدن به ماژول استفاده می شود.-vنسخه Kernel را چاپ کنید.-mنام سخت افزار دستگاه (CPU) را چاپ کنید.-oنام سیستم عامل را چاپ کنید.-aتمام اطلاعات بالا را چاپ کنید.

مثال:

کپی

[jadi@fedora lesson3.1]$ uname -a Linux fedora 5.14.0-60.fc35.aarch64 #1 SMP Mon Aug 30 16:30:42 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

راهنمای دستورات لینوکس

بیشتر دستورات مورد استفاده، یک کتابچه راهنمای جالب و کامل دارند که با استفاده از دستور man (manual) قابل دسترسی است. این به طور پیش فرض از پیجر استفاده می کند و شامل اسناد، سوئیچ ها، پارامترها، ... از دستورات و خدمات. manless

به عنوان مثال با اجرای دستور زیر کتاب‌چه راهنمای دستور yes را مشاهده می‌کنیم:

$ man yes

لطفا توجه داشته باشید که صفحات انسان در بخش های مختلف (کتاب ها) طبقه بندی می شوند. شما می توانید این را با خواندن کتابچه راهنمای مرد بررسی کنید:

کپی

$ man man $ man 5 passwd

`

Special characters and Quoting/Escaping

In the computer world, some characters do have special meanings. For example in bash, the character will expand to all files. In these cases, if you want to use this character without this expansion, you have to Quote it or Escape it. In many cases this is done via adding a character before it:*\

Copy

$ echo 2 \* 3 = 6 2 * 3 = 6

These are the character with special meanings that you need to quote if you are using them in your commands:

* ?[]'"\$;&()|^<>

Please note that there is a space character in the character list above.

As you can see, the has a specific meaning so if you want to use the back-slash itself (without its escaping usage), you have to quote your back-slash with another back-slash .\\\

In addition to escaping, you can use to create some special characters. For example, as you can not type a return character, you create it via (new line):\\n

Copy

jadi@funlife:~$ echo -e &quothello\nthere&quot hello there

Some other cases are:

Escape sequence Function\aAlert (bell)\bBackspace\cSuppress trailing newline (same function as -n option)\fForm feed (clear the screen on a video display)\nNew line\rCarriage return\tHorizontal tab

On bash you can use to break a command into more lines:\

Copy

$ echo You know slashes! But this \ is another \ usage You know slashes! But this is another usage

Shell environment variables

متغیرهای محیط شامل برخی از تنظیمات و اطلاعات در مورد پوسته است. به عنوان مثال، ویرایشگر پیش فرض شما در متغیر تنظیم شده است. شما می توانید مقدار یک متغیر پوسته مانند این را پرس و جو کنید:EDITOR

کپی

[jadi@fedora ~]$ echo $EDITOR /usr/bin/nano

امکان بررسی تمام متغیرهای env با استفاده از دستور or وجود دارد. setenv

اینها برخی از پرکاربردترین متغیرهای محیط bash هستند:

نامتابعکاربرنام کاربر وارد شدهمسیرفهرست فهرست راهنماها برای جستجوی فرمانها، روده بزرگ جدا شدهویرایشگرویرایشگر پیشفرضهیشفایلجایی که bash باید تاریخچه خود را ذخیره کند (به طور معمول) .bash_history)میزبانNAMEنام میزبان سیستمپلی استیشن 1سریع! با ان بازی کنیدUIDشناسه کاربر عددی کاربر وارد شدهخانهراهنمای خانگی کاربرPwdفهرست راهنمای کار جاریپوستهنام پوسته$شناسه فرایند (یا PID از پوسته bash در حال اجرا (یا دیگر) فرایندPPID هاشناسه فرایند فرایندی که این فرایند را اغاز کرده است (یعنی شناسه فرایند مادر)?کد خروج اخرین فرمان

هنگام تلاش برای دسترسی به مقدار، باید a را به ابتدای نام متغیر اضافه کنید.$

کپی

$ echo $USER $UID jadi 1000 $ echo $SHELL $HOME $PWD /bin/bash /home/jadi /home/jadi/lpic

برای تعریف یک EV جدید (متغیر محیط) یا تغییر یا حذف ان، می توانیم انجام دهیم:

کپی

$ MYMOOD=happy $ echo I am $MYMOOD I am happy $ MYMOOD=&quotEven Happier&quot # space has a specific meaning $ unset MM

اگر می خواهید برنامه های جدیدی که از این پوسته شروع می شوند به متغیری که تعریف کرده اید دسترسی داشته باشند، باید بعدا انها را تنظیم یا صادر کنید.export

کپی

$ export MYMOOD $ export YOURMOOD=&quotNot Confused&quot
Global bash configs are stored at and each user has her config at & & . If you need a permanent change, add your configs to these./etc/profile~/.profile~/.bash\_profile~/.bash\_logout

Path

When you issue a command, bash will run if it's an internal bash command. Otherwise, bash will go and check the variables one by one and will try to find them there. If not, it will give you an error. If you want to run something on a specific path, you have to exclusively describe the location:PATH

Copy

$ echo $PATH /home/jadi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

But what happens if I try to run ? Let's check with , , and commands:tarwhichtypewhereis

Copy

jadi@funlife:~$ which tar /bin/tar jadi@funlife:~$ type tar tar is /bin/tar jadi@funlife:~$ whereis tar tar: /usr/lib/tar /bin/tar /usr/include/tar.h /usr/share/man/man1/tar.1.gz

یک مثال خنک تر در فدورا است:ping

کپی

[jadi@fedora ~]$ whereis ping ping: /usr/bin/ping /usr/sbin/ping /usr/share/man/man8/ping.8.gz [jadi@fedora ~]$ which ping /usr/bin/ping [jadi@fedora ~]$ /usr/sbin/ping 4.2.2.4 PING 4.2.2.4 (4.2.2.4) 56(84) bytes of data. 64 bytes from 4.2.2.4: icmp_seq=1 ttl=50 time=160 ms
به همین دلیل است که وقتی می خواهید بگویید "this_program را در این دایرکتوری اجرا کنید" شما "./this_program" را صادر می کنید. شما به طور انحصاری به bash می گویید که پرونده کجاست. در لینوکس، دایرکتوری فعلی (.) به طور پیش فرض بخشی از PATH نیست.

تاریخچهی فرمانها

Bash تاریخ خود را ذخیره می کند. شما می توانید ان را ببینید و محتویات ان را اجرا کنید یا فرمان را اجرا کنید. شما همچنین می توانید از کلیدهای زیر (ترکیبی) برای دسترسی به دستورات قبلی خود استفاده کنید:~/.bash_historycathistory

کلید (ترکیبی)استفادهبالا و پایین arrowحرکت در تاریخCtrl+Rجستجوی عقبCtrl+Oفرمانی که با Ctrl+R پیدا کردید را اجرا کنید!!اجرای اخرین فرمان!10اجرای فرمان شمارهای ۱۰!پیامکجستجو به عقب برای متن، و اجرای اولین فرمان یافت شده

اگر می خواهید تاریخچه خود را پاک کنید، شماره 'HISTSIZE=0

اجرای پوسته و خروج از آن

برای اجرای سریع پوسته می‌توانیم از کلیدهای Ctrl+Alt+T و برای بستن آن از دستور زیر استفاده کنیم (و یا کلیدهای ctrl+d را بفشاریم)

exit

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

سیستم عاملواسط کاربری
عضو هیئت علمی دانشگاه، عاشق تفکر، گفتگو و حل مسئله
شاید از این پست‌ها خوشتان بیاید