استفاده از Bash Shell در اوبونتو
بخش مهمی از یادگیری کار با اوبونتو و به طور کلی توزیعهای لینوکس، شامل کسب مهارت در کار با محیط Shell است.
در حالی که محیطهای دسکتاپ گرافیکی مانند GNOME همراه با لینوکس یک رابط کاربرپسند برای سیستمعامل فراهم میکنند، در عمل محیط شل قابلیتها، انعطافپذیری و اتوماسیون بسیار بیشتری را نسبت به ابزارهای گرافیکی دسکتاپ فراهم مینماید. محیط Shell همچنین ابزاری برای تعامل با سیستمعامل زمانی که محیط دسکتاپ در دسترس نیست فراهم میکند. یک اتفاق رایج هنگام کار با یک سیستمعامل مبتنی بر سرور مانند اوبونتو یا یک سیستم آسیبدیده که بهطور کامل بوت نمیشود.
بنابراین، هدف این درس، ارائه یک نمای کلی از محیط Shell پیشفرض در اوبونتو (به ویژه پوسته Bash) است.
Shell چیست؟
Shell یک محیط مفسر فرمان تعاملی است که در آن فرمانها ممکن است در یک اعلان تایپ شوند یا در یک فایل به شکل یک اسکریپت وارد شده و اجرا شوند. منشاء Shell را میتوان به روزهای اولیه سیستمعامل یونیکس ردیابی کرد. در واقع، در روزهای اولیه لینوکس قبل از معرفی دسکتاپهای گرافیکی، پوسته تنها راه تعامل کاربر با سیستمعامل بود.
انواع محیطهای Shell در طول سالها توسعه یافتهاند. اولین پوستهای که بهطور گسترده مورد استفاده قرار گرفت، پوستهBourne بود که توسط استفان بورن در آزمایشگاه بل نوشته شد.
با این حال، یکی دیگر از ساختههای اولیه، پوسته C بود که برخی از شباهتهای نحوی را با زبان برنامهنویسی C به اشتراک میگذاشت و پیشرفتهای قابلیت استفاده مانند ویرایش خط فرمان و تاریخچه را معرفی کرد.
پوسته Korn (که توسط دیوید کورن در آزمایشگاه های بل توسعه داده شده است) بر اساس ویژگیهای ارائه شده توسط پوسته Bourne و پوسته C است.
Shell پیشفرض در اوبونتو پوسته Bash است (سرنام عبارتBourne Again Shell). این پوسته که زندگی خود را به عنوان یک نسخه متنباز پوسته Bourne آغاز کرد، برای پروژه گنو توسط برایان فاکس توسعه یافت و بر اساس ویژگیهایی است که توسط پوسته Bourne و پوسته C ارائه شده است.
دسترسی به Shell
از داخل محیط دسکتاپ GNOME، با انتخاب گزینه Activities در نوار بالا و وارد کردن Terminal در نوار جستجو و کلیک کردن بر روی آیکون Terminal میتوان به اعلان Shell از پنجره ترمینال دسترسی پیدا کرد.
هنگام بوت کردن یک سیستم مبتنی بر سرور که در آن یک محیط دسکتاپ نصب نشده است، Shell بلافاصله پس از تکمیل فرآیند ورود کاربر در ترمینال کنسول فیزیکی از راه دور وارد میشود.
وارد کردن فرمان در اعلان (Prompt)
فرمانها در خط فرمان شل به سادگی با تایپ فرمان مربوطه و فشار دادن کلید Enter وارد میشوند. در حالی که برخی از فرمانها وظایف را به صورت بیصدا انجام میدهند، اکثر آنها نوعی خروجی را نشان میدهند. به عنوان مثال، از فرمان ls میتوان برای نمایش فایلها و دایرکتوریها در دایرکتوری کاری فعلی استفاده کرد:
1 2 |
$ ls Desktop Documents Downloads Music Pictures Public Templates Videos |
فرمانهای موجود یا در خود پوسته تعبیه شدهاند یا در سیستمفایل فیزیکی قرار دارند. مکان موجود در سیستمفایل یک فرمان ممکن است با استفاده از یک فرمان شناسایی شود. به عنوان مثال، برای اینکه بفهمید فایل اجرایی ls در کجای سیستمفایل قرار دارد:
1 2 |
$ which ls alias ls='ls --color=auto' /usr/bin/ls |
واضح است که فرمان ls در دایرکتوری /usr/bin قرار دارد. همچنین توجه داشته باشید که alias پیکربندی شده است، موضوعی که در ادامه به آن پرداخته خواهد شد. استفاده از فرمان which برای تعیین مکان مسیر فرمانها ساخته شده در Shell منجر به پیامی میشود که نشان میدهد فایل اجرایی یافت نمیشود. به عنوان مثال، تلاش برای یافتن مکان فرمان history (که در واقع به جای وجود یک فایل اجرایی در سیستمفایل در شل ساخته شده است) خروجی مشابه زیر را به همراه خواهد داشت:
1 2 3 |
$ which history /usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/ Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin) |
دریافت اطلاعات در مورد یک فرمان
بسیاری از فرمانهای موجود لینوکس میتوانند در ابتدا رمزآلود به نظر برسند. برای یافتن اطلاعات دقیق در مورد اینکه یک فرمان چه کاری انجام میدهد و نحوه استفاده از آن، از فرمان man استفاده کنید که نام فرمان را به عنوان آرگومان مشخص میکند. به عنوان مثال، برای کسب اطلاعات بیشتر در مورد فرمان pwd:
1 |
$ man pwd |
زمانی که فرمان بالا اجرا شد، توضیحات دقیق فرمان pwd نمایش داده میشود. بسیاری از فرمانها همچنین هنگام اجرا با گزینه -help command-line اطلاعات اضافی را ارائه میدهند:
1 |
$ wc --help |
ویرایش خط فرمان Bash
محیطهای شل اولیه هیچگونه قابلیت ویرایش خطی را ارائه نمیدادند.خوشبختانه Bash طیف گستردهی از گزینههای ویرایش خط فرمان را همانطور که در جدول زیر نشان داده شده است ارائه میدهد:
کلیدهای ترکیبی | عملکرد |
---|---|
Ctrl+b یا Left Arrow | مکاننما را یک موقعیت به عقب میبرد. |
Ctrl+f یا Right Arrow | مکاننما را یک موقعیت به جلو میبرد. |
Delete | کاراکتر تحت مکاننما را حذف میکند. |
Backspace | کاراکتر سمت چپ مکان نما را حذف میکند. |
Ctrl+_ | تغییر قبلی را Undo میکند. |
Ctrl+a | مکاننما را به ابتدای خط منتقل میکند. |
Ctrl+e | مکاننما را به انتهای خط منتقل میکند. |
Meta-f or Esc then f | مکاننما را یک کلمه به جلو میبرد. |
Meta-b or Esc then b | مکاننما را یک کلمه به عقب میبرد. |
Ctrl+l | صفحه را از همه چیز به جز فرمان فعلی پاک میکند. |
Ctrl+k | از موقعیت مکاننما تا انتها را حذف میکند. |
Meta-d or Esc then d | تا انتهای کلمه فعلی را حذف میکند. |
Meta-DEL or Esc then DEL | از ابتدا تا کلمه فعلی را حذف میکند. |
Ctrl+w | از موقعیت مکاننما به فضای سفید قبلی را حذف میکند. |
کار با تاریخچه شل
علاوه بر ویژگیهای ویرایش خط فرمان، پوسته Bash از تاریخچه خط فرمان نیز پشتیبانی میکند. لیستی از فرمانهایی که قبلا اجرا شده را میتوان با استفاده از فرمان history مشاهده کرد:
1 2 3 4 5 6 7 |
$ history 1 ps 2 ls 3 ls –l / 4 ls 5 man pwd 6 man apropos |
علاوه بر این، Ctrl+p (یا فلش رو به بالا) و Ctrl+n (یا فلش رو به پایین) ممکن است برای پیمایش به جلو و عقب در میان فرمانها وارد شده قبلی استفاده شود. وقتی فرمان history نمایش داده شد، کلید Enter را فشار دهید تا اجرا شود.
گزینه دیگر این است که کاراکتر «!» را وارد کنید و چند کاراکتر اول فرمان را وارد کنید و سپس کلید Enter را بفشارید.
Filename Shorthand
بسیاری از فرمانهای پوسته یک یا چند نام فایل را به عنوان آرگومان میگیرند. بهعنوان مثال، برای نمایش محتوای یک فایل متنی با نام list.txt، از فرمان cat به صورت زیر استفاده میشود:
1 |
$ cat list.txt |
به طور مشابه، محتوای چندین فایل متنی را میتوان با تعیین نام تمام فایلها به عنوان آرگومان نمایش داد:
1 |
$ cat list.txt list2.txt list3.txt list4.txt |
به جای تایپ کردن هر نام، میتوان از تطبیق الگو برای تعیین همه فایلهای دارای نام مطابق با معیارهای خاص استفاده کرد. به عنوان مثال، کاراکتر عام “*” را میتوان برای ساده کردن مثال بالا استفاده کرد:
1 |
$ cat *.txt |
فرمان بالا محتوای تمام فایلهایی که با پسوند txt ختم میشوند را نمایش میدهد. این میتواند بیشتر به هر نام فایلی که با لیست شروع میشود و به txt ختم میشود محدود شود:
1 |
$ cat list*.txt |
نام فایل (Filename) و تکمیل مسیر (Path Completion)
شل به جای تایپ کردن در یک نام یا مسیر کامل فایل، یا استفاده از تطبیق الگو برای کاهش میزان تایپ، ویژگی تکمیل نام فایل را فراهم میکند. برای استفاده از تکمیل نام فایل، کافی است چند کاراکتر اول فایل یا نام مسیر را وارد کنید و سپس کلید Esc را دوبار فشار دهید. سپس شل ،نام فایل را با اولین فایل یا نام مسیر در فهرستی که با کاراکترهایی که وارد کرده اید مطابقت دارد، تکمیل میکند. برای به دست آوردن لیستی از مطابقتهای احتمالی، پس از وارد کردن چند کاراکتر اول، Esc = را فشار دهید.
تغییر مسیر ورودی و خروجی
همانطور که قبلا ذکر شد، بسیاری از فرمانهای Shell هنگام اجرا اطلاعات خروجی را صادر می کنند. به طور پیش فرض این خروجی به فایل دستگاهی به نام stdout میرود که اساسا پنجره ترمینال یا کنسولی است که شل در آن اجرا میشود. برعکس، شل ورودی را از یک فایل دستگاه به نام stdin میگیرد که بهطور پیشفرض صفحه کلید است.
خروجی یک فرمان را میتوان از stdout به یک فایل فیزیکی در سیستمفایل با استفاده از کاراکتر «>» هدایت کرد. به عنوان مثال، برای تغییر مسیر خروجی از یک فرمان ls به فایلی به نام files.txt، فرمان زیر مورد نیاز است:
1 |
$ ls *.txt > files.txt |
پس از تکمیل، files.txt حاوی لیستی از فایلهای دایرکتوری فعلی خواهد بود. به طور مشابه، محتویات یک فایل ممکن است به جای stdin به فرمانی وارد شود. به عنوان مثال، برای تغییر مسیر محتویات یک فایل به عنوان ورودی به یک فرمان:
1 |
$ wc –l < files.txt |
فرمان فوق، تعداد خطوط موجود در فایل files.txt را نمایش میدهد.
توجه به این نکته مهم است که عملگر تغییر مسیر “>” یک فایل جدید ایجاد میکند یا یک فایل موجود را در هنگام استفاده کوتاه میکند. برای ضمیمه کردن فایل موجود، از عملگر “>>” استفاده کنید:
1 |
$ ls *.dat >> files.txt |
علاوه بر خروجی استاندارد، شل خروجی خطای استاندارد را با استفاده از stderr ارائه میدهد. در حالی که خروجی یک فرمان به stdout هدایت میشود، هر پیام خطایی که توسط فرمان ایجاد میشود به stderr هدایت میشود. این بدان معنی است که اگر stdout به یک فایل هدایت شود، پیام های خطا همچنان در ترمینال ظاهر میشود. این معمولاً رفتار مورد نظر است، اگرچه stderr نیز ممکن است در صورت تمایل با استفاده از عملگر “2>” هدایت شود:
1 |
$ ls dkjfnvkjdnf 2> errormsg |
پس از تکمیل فرمان، خطای گزارش این واقعیت که فایل با نام dkjfnvkjdnf یافت نشد، در فایل errormsg وجود خواهد داشت.
هر دو stderr و stdout ممکن است با استفاده از عملگر &> به یک فایل هدایت شوند:
1 |
$ ls /etc dkjfnvkjdnf &> alloutput |
پس از اتمام اجرا، فایل alloutput هم فهرستی از محتویات دایرکتوری etc و هم پیام خطای مرتبط با تلاش برای فهرست کردن یک فایل ناموجود را شامل میشود.
کار با Pipeها در Bash
علاوه بر تغییر مسیر ورودی/خروجی، Shell اجازه میدهد خروجی یک فرمان مستقیما به عنوان ورودی به فرمان دیگر ارسال شود. عملیات Piping با قرار دادن کاراکتر «|» بین دو یا چند فرمان در خط فرمان به دست میآید. به عنوان مثال، برای شمارش تعداد فرآیندهای در حال اجرا در یک سیستم، خروجی از فرمان ps را میتوان به فرمان wc انتقال داد:
1 |
$ ps –ef | wc –l |
هیچ محدودیتی برای تعداد عملیات Piping که میتوان در خط فرمان انجام داد وجود ندارد. به عنوان مثال، برای یافتن تعداد خطوط یک فایل حاوی نام Smith:
1 |
$ cat namesfile | grep Smith | wc –l |
پیکربندی نام مستعار
همانطور که در محیط Shell مهارت پیدا میکنید، احتمالا خواهید دید که اغلب فرمانهایی را با همان آرگومان ها صادر می کنید. به عنوان مثال، اغلب میتوانید از فرمان ls با گزینههای l و t استفاده کنید:
1 |
$ ls –lt |
برای کاهش میزان تایپ مربوط به صدور یک فرمان، میتوان نام مستعاری ایجاد کرد که به فرمان و آرگومان نگاشت میشود. به عنوان مثال، برای ایجاد نام مستعار به گونهای که با وارد کردن حرف l فرمان ls –lt اجرا شود، از فرمان زیر استفاده میشود:
1 |
$ alias l="ls –lt" |
با وارد کردن l در خط فرمان، فرمان اصلی اجرا میشود.
متغیرهای محیطی
متغیرهای محیطی شل ذخیرهسازی موقت دادهها و تنظیمات پیکربندی را فراهم میکنند. خود پوسته تعدادی متغیر محیطی را تنظیم میکند که ممکن است توسط کاربر تغییر کند تا رفتار شل را تغییر دهد. فهرستی از متغیرهای تعریف شده فعلی را میتوان با استفاده از فرمان env به دست آورد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ env SSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22 MODULES_RUN_QUARANTINE=LD_LIBRARY_PATH LANG=en_US.UTF-8 HISTCONTROL=ignoredups HOSTNAME=demo-pc.ebookfrenzy.com XDG_SESSION_ID=15 MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tcl USER=demo ENV=/usr/share/Modules/init/profile.sh SELINUX_ROLE_REQUESTED= PWD=/home/demo HOME=/home/demo SSH_CLIENT=192.168.0.19 61231 22 SELINUX_LEVEL_REQUESTED= . . . |
شاید مفیدترین متغیر محیطی PATH باشد. این متغیر، فهرست دایرکتوریهایی را که شل در آنها دستورات وارد شده در خط فرمان را جستجو میکند و ترتیب انجام این کار را مشخص میکند. متغیر محیطی PATH برای یک حساب کاربری در یک سیستم اوبونتو تازه نصب شده احتمالا به صورت زیر پیکربندی میشود:
1 2 |
$ echo $PATH /home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin |
متغیر مفید دیگر HOME است که فهرست اصلی کاربر فعلی را مشخص میکند. برای مثال، اگر میخواهید شل به دنبال فرمان در دایرکتوری اسکریپت واقع در فهرست اصلی شما باشد، متغیر PATH را به صورت زیر تغییر میدهید:
1 |
$ export PATH=$PATH:$HOME/scripts |
مقدار فعلی یک متغیر محیطی موجود ممکن است با استفاده از فرمان echo نمایش داده شود:
1 |
$ echo $PATH |
شما میتوانید متغیرهای محیطی خود را با استفاده از فرمان export ایجاد کنید. مثلا:
1 |
$ export DATAPATH=/data/files |
یک ترفند مفید برای تخصیص خروجی از یک فرمان به یک متغیر محیطی، شامل استفاده از نقلقولهای پشتی (`) یا back quotes در اطراف فرمان است. به عنوان مثال، برای اختصاص تاریخ و زمان فعلی به یک متغیر محیطی به نام NOW:
1 2 3 |
$ export NOW=`date` $ echo $NOW Tue Apr 2 13:48:40 EDT 2020 |
اگر تنظیمات متغیر محیطی یا نام مستعار وجود دارد که باید هر بار که وارد محیط پوسته میشوید پیکربندی شوند، ممکن است به فایلی در فهرست اصلی شما به نام bashrc. اضافه شوند. به عنوان مثال، فایل .bashrc زیر برای تنظیم متغیر محیطی DATAPATH و یک نام مستعار پیکربندی شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific environment PATH="$HOME/.local/bin:$HOME/bin:$PATH" export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature: # export SYSTEMD_PAGER= # User specific aliases and functions export DATAPATH=/data/files alias l="ls -lt" |
اسکریپتنویسی در Shell
تاکنون به طور انحصاری بر ماهیت تعاملی Bash تمرکز کردهایم. منظور از تعاملی، وارد کردن دستی فرمانها در اعلان و اجرای آنها است. در واقع، این تنها بخش کوچکی از توانایی Shell است. مسلما یکی از قدرتمندترین جنبههای شل، توانایی ایجاد اسکریپت است. اسکریپتهای Shell اساسا فایلهای متنی حاوی دنبالهای از عبارات هستند که میتوانند در محیط شل برای انجام وظایف اجرا شوند. علاوه بر توانایی اجرای فرمان، شل بسیاری از ساختارهای برنامهنویسی مانند حلقههای for و do و دستورات if را ارائه میکند که ممکن است به طور منطقی انتظار داشته باشید که در یک زبان برنامهنویسی پیدا کنید.
اولین گام در ایجاد یک اسکریپت، ایجاد یک فایل است (برای اهداف این مثال نام آن را simple.sh میگذاریم) و موارد زیر را به عنوان خط اول اضافه میکنیم:
1 |
#!/bin/sh |
#! “shebang” نامیده میشود و دنباله خاصی از کاراکترها است که نشان میدهد مسیر منتهی به مفسر مورد نیاز برای اجرای اسکریپت آیتم بعدی در خط است (در این مورد، فایل اجرایی sh واقع در /bin). اگر یکی از آنها مفسری باشد که میخواهید از آن استفاده کنید، این میتواند به همان اندازه، /bin/csh یا /bin/ksh باشد.
مرحله بعدی نوشتن یک اسکریپت ساده است:
1 2 3 4 5 |
#!/bin/sh for i in * do echo $i done |
تمام کاری که این اسکریپت انجام میدهد این است که در بین تمام فایلهای دایرکتوری فعلی تکرار میشود و نام هر فایل را نمایش میدهد. این ممکن است با ارسال نام اسکریپت به عنوان آرگومان به sh اجرا شود:
1 |
$ sh simple.sh |
برای قابل اجرا کردن فایل (در نتیجه نیاز به ارسال آن به فرمان sh) را می توان از chmod استفاده کرد:
1 |
$ chmod +x simple.sh |
هنگامی که بیت اجرا بر روی مجوزهای فایل تنظیم شد، ممکن است مستقیما اجرا شود. مثلا:
1 |
$ ./simple.sh |
خلاصه
در این درس ما گشتی کوتاه از محیط Bash Shell داشتهایم. در دنیای محیطهای دسکتاپ گرافیکی، بهراحتی میتوان فراموش کرد که قدرت واقعی و انعطافپذیری یک سیستم عامل اغلب تنها با رها کردن زیر رابط کاربری دسکتاپ کاربرپسند و استفاده از یک محیط شل قابل استفاده است. علاوه بر این، آشنایی با شل زمانی که برای مدیریت و نگهداری سیستمهای مبتنی بر سرور که دسکتاپ نصب نشدهاند یا هنگام تلاش برای تعمیر سیستمی که به حدی آسیب دیده است که رابط دسکتاپ یا Cockpit راهاندازی نمیشود، ضروری است.
منبع: answertopia.comدرباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید