انسان یک گونه نقاد ، هنرمند و هوشمند است ! به همین خاطر است که پرسشگری میکند!
یادگیری bash و ورود به اکو سیستم لینوکس، فصل اول
مدتی هست که دارم bash یاد میگیرم، یه جورایی عاشق این اکوسیستم شدم، اکوسیستمِ لینوکس و فایل سیستمش و مخصوصا محیط CLI یا ( Command Line Interface ) لینوکس. به هر حال از اونجایی که عاشق یادگیری با استفاده از کتاب ها هستم سعی کردم که یک کتاب خوب پیدا کنم. و در نهایت کتاب The Linux Command line A Complete Introduction by William Shotts رو انتخاب کردم. توی این پست خلاصۀ فصلِ اولِ این کتاب رو میبینید بعلاوۀ بخش هایی، که شاید از باقی کتاب ها در این خلاصه گنجانده باشم، امیدوارم که این خلاصه در آینده هم به من و هم به دیگران که شما باشید کمک کنه، من فَرِهان هستم و خیلی خوشبختم بزنید بریم واسه خلاصه.
شِل یا (Shell) چیست؟
اولین سوالی که در اول کتاب پرسیده شده همینه ، شل چیه؟ وقتی از command line یا محیط خطِ فرمان صحبت میکنیم در حقیقت داریم راجع به shell حرف میزنیم، shell یا پوسته؛ برنامه ای هست که دستورات رو از کیبورد و در نتیجه از ما میگیره و اون ها رو به سیستم عامل پاس میده تا در نهایت این دستورات توسط سیستم عامل اجرا بشوند. [تصویر پایین محیط خطِ فرمان (Command Line Interface) را نمایش می دهد.]
تقریبا تمام توزیع های لینوکس یک shell از پروژۀ GNU به اسمِ bash رو عرضه میکنند. bash مخفف کلمات Bourne-again shell هست و با دانستن این که فردی به نام Steve Bourne شِل اصلی یونیکس رو نوشت و اسمش رو گذاشت sh میفهمیم که bash در واقع جایگزین پیشرفته تری برای sh هست.
شبیه ساز ترمینال یا Terminal Emulator
خب این تیکه از جذاب ترین بخش های این فصل بود (حداقل برای من). وقتی که از محیط و رابط گرافیکی یا همون GUI استفاده میکنیم دسترسی ای به CLI یا همون Command Line Interface نداریم و برای دسترسی به شِل در چنین محیطی، از چیزی به اسم terminal emulator یا شبیه ساز ترمینال استفاده میکنیم تا با shell ارتباط بگیریم. اگر به منوی دستکتاپمون نگاه کنیم به احتمال زیاد یک ترمینال پیدا میکنیم مثلا KDE از konsole استفاده میکنه و GNOME از gnome-terminal که در نهایت به همشون به طور خلاصه ترمینال میگیم.
ترمینال های زیادی هم اون بیرون هستند؛ ولی همشون در اصل یک کار، و آن هم امکان دسترسی به شل رو برای ما برقرار میکنند. همون کاری که CLI برای ما انجام میده (منتها این یکی در محیط GUI).
شروع کار با ترمینال (شبیه ساز ترمینال)
حالا یه ترمینال باز میکنیم، برای این کار کافیه در منوی دسکتاپمون عبارت terminal رو جستجو کنیم و سپس اون رو اجرا کنیم. پس از بالا آمدن برنامه باید همچین ساختاری رو ببینیم :
[me@linuxbox ~]$
به این ساختار shell prompt میگویند. من از قبل و از کتاب vim book میدانستم که دالِر ساین " $ " پرامپتِ مربوط به سیستم های یونیکسی هست و از کتاب Bash Guide for Beginners میدانستم که زمانی که shell prompt نمایان بشه و شلِ مورد استفادۀ ما bash باشه یعنی terminal، و در نهایت shell؛ در حالت bash interactive behavior هستند که در حقیقت یعنی شلِ ما یا در اینجا همان bash آمادۀ دریافت ورودی از کابر هست و به عبارتی ورودی و خروجی shell به ترمینال متصل شده.
شِل پرامپت (Shell Prompt) ممکن است برای هر سیستم یا هر فردی متفاوت جلوه کند و شکل دیگری داشته باشد. این موضوع به این دلیل است که شکل شِل پرامپت یا به فارسی وضعیت شِل به سیستم عامل، توزیع لینوکسی ای که داریم و یا فایل تنظیمات بَشِ کاربر بستگی دارد.
اما به طور عمومی، به این شکل دیده میشود :
username@machinename current-directory $
- username نام کاربری ، یوزری هست که با آن به سیستم ورود کردیم.
- machinename نام خودِ سیستم .
- current-directory پوشه یا درایوی که در حال حاضر در آنجا هستیم.
- $ پرامپتِ مربوط به سیستم های یونیکسی در حالت shell interactive behavior هست.
اگر آخرین کارکترِ شِل پرامپتِ ما به جای دالر ساین " $ " هشتگ " # " بود. این به این معناست که آن سشسن (session) از ترمینالی که باز کردیم ویژگی های superuser دارد.
که این یعنی:
- یا به صورت کاربرِ root لاگین کردیم
- یا ترمینالی رو انتخاب کردیم که ویژگی های superuser یا (administrative) دارد.
اگر کمی دقت کرده باشید میبینید که تصویری که از Command Line Interface در اول پست گذاشتم دارای # در آخر شِل پرامپتش هست. اما چرا؟ قبل از این که جواب رو ببینید سعی کنید خودتون از روی تصویر کشفش کنید.
جواب : همونطور که در تصویر میبینید. شِل پرامپتِ کاربر به این شکل هست :
[root@localhost ~]#
این به این معناست که یوزرنیمِ کاربر، root میباشد. بالا گفتم که اگر با root لاگین کرده باشیم به جای دالِر ساین " $ " هشتگ " # " خواهیم داشت.
نکته : در برخی از کتاب ها و یا وبسایت ها مثل red hat به ساختار بالا به جای shell prompt میگن Linux command prompt.
خب با فرض این که همه چیز خوب پیش رفته و شما شِل پرامپت رو میبینید و شِل شما یا در اینجا بَش آمادۀ دریافت دستورات ورودی از طریق کیبورد شماست؛ با این فرض میریم جلو.
خب از اینجا کتاب، من رو با نحوۀ نوشتنِ دستورات و همینطور دریافت خروجی یا بهتره بگم جوابِ بَش به دستوراتم آشنا کرد. سپس دوتا از ویژگی های جذاب bash رو برام روشن کرد یکی command history و دیگری cursor movement که پوسته یا شِلِ sh این ویژگی ها رو نداره. ولی bash داره. خب بریم برای این قسمت.
قبل از این که دستوری وارد کنیم بزارید ببینیم که اگر یک مشت چرت و پرت بنویسیم چه اتفاقی میوفته؟
[me@linuxbox ~]$ hjkshfshoauhew
خب از اونجایی که این چیزی که وارد کردیم به قول خودِ کتاب gibberish یا بی معنی هست، شِل بهمون میگه که، دستوری که وارد کردید وجود نداره (command not found) و این یعنی برای شِل این دستور بی معنی هستش. و از طرفی به ما شانس دوباره ای برای ورود دستور یا command بعدی میده. گیف زیر رو مشاهده کنید.
خب همونطور که دز گیفِ بالا میبینیم من دستور چرتی رو وارد کردم و همچین جوابی گرفتم :
hjkshfshoauhew: command not found
[me@linuxbox ~]$
و بعد از اون دوباره بَش به من اجازه داد تا دستور دیگری وارد کنم و چون این بار دستور بی معنی نبود، جواب داد.
یک بار دیگه به جملۀ قبل من نگاه کنید گفتم "بَش جواب داد"، سوالی که به وجود می آید این هست که اگر داخل ترمینال مینویسیم، پس چرا بَش جواب میده و نه ترمینال؟ چون این دقیقا همون چیزی هست که bash interactive behavior داره میگه. در واقع این که ورودی و خروجی بَش به ترمینال متصله و ترمینال واسطه ای بین ما و بَش هست. در حیقت شما اینجا دارید به وضوح این رفتار رو دیدید.
تاریخچۀ دستورات یا Command History چیست؟
در bash برخلاف sh ویژگی ای وجود دارد تحت عنوان history expansion که من این رو در کتاب Bash Guide for Beginners خواندم که درنهایت این ویژگی منجر به command History میشه حالا یعنی چی؟ نمیخوام زیاد وارد بحث تخصصی و این که دقیقا کدوم فایل ادیت یا ویرایش میشه بشوم.
فقط در همین حد برای الان کافیه که بدونیم، command history و history expansion به ما این امکان رو میدهند که دستورات قبلی ای که وارد کردیم رو با کلید های جهت بالا و پایین بتوانیم دوباره بدون نیاز به بازنویسی داشته باشیم و ازشون استفاده کنیم. در حقیقت زمانی که در بَش، دستوری را وارد میکنیم history expansion لیست دستوراتِ از قبل وارد شده رو آپدیت میکنه و زمانی که کلید های جهت بالا و پایین رو میفشاریم میتوانیم به دستورات قبلی خیلی سریع تر و بدون نیاز به بازنویسی دسترسی پیدا کنیم و اینجوری ویرایش اون دستورات مثلا اضافه کردن آپشن ها و آرگومان ها خیلی سریع تر و بهتر خواهد شد.
جابهجایی Cursor یا Cursor Movement
این ویژگی هم در bash برخلاف sh وجود داره. با این ویژگی میتوانیم خیلی سریع و فقط با استفاده از کیبورد و کلید های جهت چپ و راست cursor رو جابهجا کنیم و درنهایت ویرایش یک دستور برای ما به شدت ساده و سریع میشه.
این دو ویژگی رو در 16 ثانیه ببینید :
بعد از این که کتاب، این ویژگی ها رو معرفی کرد. نوبت رسید به چند دستور واقعی :
- date
- cal
- df
- free
دستور date و cal
کتاب برای نشان دادن دستورات واقعی از این دو دستور شروع کرد که دستور date تاریخ و زمان امروز رو به شما نمایش میدهد مثلا اگر امروز (سه شنبه 13 فوریه (2) 2024 ساعت 14:57) واردش کنیم همچین خروجی ای میگیریم.
دستور cal به نوعی به دستور date ربط داره، cal مخفف کلمۀ calendar به معنای تقویم هست. پس در نتیجه این دستور تقویمِ ماهی که درش هستیم رو در محیط ترمینال نمایش میده و روزی که درش هستیم رو هایلایت میکنه به این صورت :
همینطور که میبینید روز 13 هم که امروز باشه رو هایلایت کرده.
بیرون از بحثِ کتاب یک چیزی بگم، من موقع خواندن این بخش از کتاب برام سوال شد که آیا میشه cal ماه های دیگه یا تقویمِ سال های دیگه رو نمایش بده؟ و در نهایت به این رسیدم که بله میشه. کافیه دستور رو به شکل زیر به کار ببریم :
[me@linuxbox ~]$ cal [[MONTH] YEAR]
دلیلی که MONTH و YEAR رو توی کروشه گذاشتیم به این خاطره که اختیاری هستند یعنی میتونیم ننویسیم اگر بنویسیم میتوانیم مشخص کنیم که تقویم چه ماهی و از چه سالی رو نشونمون بده مثلا من الان تقویم ماه ژانویۀ سالِ 2002 رو در عکسِ پایین به صورت خروجی دریافت و با استفاده از دستور cal دریافت کردم :
دستور df و free
این دو دستور هم برای دستگرمی مثل دستورات date و cal توسط کتاب به صورت خیلی جزئی و ساده معرفی شدن.
برای دیدن مقدار فضای خالی در دیسک درایو هامون از دستور df که مخفف disk filesystem هست در بَش استفاده میکنیم. که همچین خروجی ای میگیریم :
همونطور که میبینید دیسک درایو هامو در بخش فایل سیستم نشون داده و مقدار فضای استفاده شده (used)، مقدار فضای دردسترس (available) و درصد فضای استفاده شده (%use) رو هم نشان داده.
اما Mounted on در تصویر بالا یعنی چی؟ برای این که این رو بفهمیم باید اول معنای mounting رو براتون باز کنم. mounting تنها راهی هست که میتونیم یک فایلْ سیستم مثل درایو ، دستگاهی مثل USB، یا یک فایل خاص رو برای سیستم و کاربر که خودِ ما باشیم قابل دسترس و درنهایت قابل استفاده کنیم. به عبارتی ما با دستور MOUNT در لینوکس یک فایلْ سیستم رو به یک دایرکتوری متصل میکنیم و اینجوری اون فایل سیستم برای سیستم و کاربر قابل استفاده میشه. ، مثلا درایو \:E در تصویر بالا به دایرکتوری mnt/e/ متصل شده و در این دایرکتوری برای سیستم و کاربر که من باشم قابل دسترس و در نهایت قابل استفاده هست.
دستور free
برای دیدن مقدار فضای خالی memory از دستور free استفاده میکنیم که خروجی به شکل زیر خواهد بود.
پس از چند تا دستور نوبت به اتمام فصل اول رسید اما قبل از اون بهتر بود که بدونیم چطوری باید این سِشِنی (session) که در ترمینال ایجاد کردیم رو به اتمام برسونیم برای این کار کافیه دستور exit
[me@linuxbox ~]$ exit
رو بزنیم این دستور باعث میشه که سشن کنونی خاتمه پیدا بکنه.
به پایان آمد این دفتر، حکایت همچنان باقیست
خب، این مطلب و این مقاله و البته خلاصۀ فصل اولِ کتابِ The Linux Command line به اتمام رسید، از این که با من بودید و خلاصۀ این فصل رو خواندید به شدت خرسندم. در این مقاله من سعی کردم علاوه بر خلاصۀ فصل اول، اطلاعاتی از دیگر کتاب ها هم به شما بدم و حتی گهگاهاً بیشتر از مطالب خودِ فصل؛ برای بهتر کردن کیفیت این مقاله بنویسم. امیدوارم که این مقاله بتونه لبخند رو به لب های شما بیاره، من فَرِهان هستم و ممنونم که این مطلب رو خوندید. در آخر اگر دوست داشتید میتوانید من رو در شبکه های مجازی زیر ببینید :
مطلبی دیگر از این انتشارات
ارسال ایمیل برای laravel در لوکال هاست (smtp server)
مطلبی دیگر از این انتشارات
کلاس Nested در مقایسه با کلاس Inner در کاتلین
مطلبی دیگر از این انتشارات
مقایسه Dispatchers.Default و Dispatchers.IO در کاتلین کوروتین (kotlin Coroutine)