فصل ۵ – کار با دستورات (Working With Commands)
مقدمه
تا اینجا یاد گرفتهایم که چطور در سیستم فایل حرکت کنیم و فایلها و پوشهها را بسازیم،
جابهجا کنیم و حذف کنیم.
اکنون وقت آن رسیده که سراغ خود «دستورات» برویم تا بفهمیم وقتی نامی را در خط فرمان وارد میکنیم
دقیقاً چه چیزی اجرا میشود و چگونه میتوانیم اطلاعات بیشتری از آن به دست بیاوریم.
در این فصل موضوعات زیر را بررسی میکنیم:
- انواع مختلف دستورات در لینوکس
- تشخیص نوع دستور با
type - پیدا کردن محل قرارگیری فایل اجرایی با
type -pوwhich - استفاده از راهنمای درونبرنامهای (
--helpوhelp) - کار با صفحات راهنما (
man) و ساختار آنها - جستوجوی صفحات راهنما با
whatisوapropos - استفاده از مستندات
info - ساختن نامهای مستعار (
alias) - بهرهگیری از تاریخچهی دستورات (
history)
دستور چیست؟
وقتی در خط فرمان یک «نام» وارد میکنیم، شل باید تشخیص دهد که منظور ما چیست و چه چیزی باید اجرا شود.
در لینوکس چهار نوع اصلی از دستورات وجود دارد:
- برنامههای اجرایی (Executable Programs):
میتواند یک برنامهی کامپایلشده (مانند برنامههایی که با C یا C++ ساخته شدهاند)
یا یک اسکریپت باشد (اسکریپتهای شل، پایتون، پرل و غیره). - دستورات داخلی شل (Shell Builtins):
قابلیتهایی که جزئی از خود شل هستند، مانندcd،alias،historyو … . - توابع شل (Shell Functions):
مجموعهای از دستورات که با یک نام تعریف شدهاند و دقیقاً مانند یک دستور فراخوانی میشوند. - نامهای مستعار (Aliases):
نامهای جایگزینی که برای یک دستور یا دنبالهای از دستورات تعریف میکنیم تا کوتاهتر و راحتتر قابل استفاده باشند.
برای فهمیدن اینکه یک نام مشخص به کدام دسته تعلق دارد، از دستور type استفاده میکنیم.
تشخیص نوع دستور با type
دستور type مشخص میکند که یک نام چگونه تفسیر میشود:
type type
type ls
type cp
type mkdir
خروجی type چیزی شبیه این خواهد بود:
type is a shell builtin
ls is aliased to `ls --color=auto`
cp is /bin/cp
mkdir is /bin/mkdir
بنابراین میبینیم که type تشخیص میدهد آیا نام مورد نظر داخلی شل است،
یک alias است یا به فایل اجرایی مشخصی در سیستم اشاره میکند.
گزینههای مفید type عبارتند از:
type -t نام— فقط نوع را برمیگرداند (مثلاًbuiltin،file،alias).type -p نام— مسیر دقیق فایل اجرایی را نشان میدهد (در صورت وجود).type -a نام— همهی تطابقهای ممکن را فهرست میکند (در صورتی که alias، builtin و فایل اجرایی همنام داشته باشیم).
پیدا کردن برنامه با which
دستور which مسیر کامل فایلی را که هنگام اجرای یک نام به کار میرود چاپ میکند.
این دستور فهرست مسیرهای موجود در متغیر محیطی PATH را جستوجو میکند:
which python
which gcc
اگر دستور مورد نظر در مسیر جستوجو وجود نداشته باشد، which پیامی مبنی بر یافت نشدن آن چاپ میکند.
هرچند which پرکاربرد است، به خاطر داشته باشید که type -p در اکثر موارد همان کار را انجام میدهد
و علاوه بر آن میتواند alias یا builtin بودن یک نام را هم تشخیص دهد.
استفاده از راهنمای درونبرنامهای (help و --help)
بسیاری از دستورات – بهویژه دستورات داخلی شل – مستندات کوتاهی دارند که با help نمایش داده میشود:
help cd
help history
علاوه بر این، اکثر برنامهها با گزینهی --help خلاصهای از نحوهی استفاده و مهمترین گزینههای خود را نشان میدهند:
ls --help
grep --help
این متنهای کمکی معمولاً توضیح مختصری دربارهی هدف دستور، نگارش کلی آن و پرکاربردترین گزینهها ارائه میدهند.
برای مطالعهی دقیقتر باید به سراغ صفحات راهنما یا مستندات کاملتر برویم.
صفحات راهنما (man)
قدیمیترین و همچنان پرارجاعترین منبع برای یادگیری دربارهی دستورات، صفحات راهنما هستند که با دستور man نمایش داده میشوند:
man ls
man passwd
در محیط man از کلید Space برای رفتن به صفحهی بعد، از b برای برگشت به صفحهی قبل و از q برای خروج استفاده کنید.
کلید / امکان جستوجو در متن را فراهم میکند و کلید n برای رفتن به نتیجهی بعدی جستوجو کاربرد دارد.
هر صفحهی man معمولاً دارای بخشهای استاندارد زیر است:
- NAME – نام دستور و توضیح یک خطی آن.
- SYNOPSIS – نحوهی فراخوانی دستور (گزینهها و آرگومانها).
- DESCRIPTION – توضیح مفصل دربارهی عملکرد دستور و گزینهها.
- OPTIONS – شرح تکتک گزینهها (در برخی صفحات).
- EXAMPLES – نمونههایی از نحوهی استفاده (در صورت وجود).
- SEE ALSO – ارجاع به صفحات مرتبط دیگر.
صفحات راهنما بر اساس شمارهی بخش دستهبندی شدهاند. رایجترین بخشها عبارتاند از:
- دستورات اجرایی و برنامههای کاربری
- فراخوانیهای سیستمی هستهی لینوکس
- فراخوانیهای کتابخانهای C
- فایلهای ویژه، دستگاهها و درایورها
- فرمتهای فایل و قراردادها
- بازیها و تفریحات
- موارد متفرقه
- ابزارهای مدیریتی سیستم
اگر یک نام در چند بخش مختلف وجود داشته باشد، میتوانیم با نوشتن شمارهی بخش، صفحهی دقیق را مشخص کنیم:
man 5 passwd
در صورت نیاز به مشاهدهی نام تمام صفحات موجود برای یک دستور، از man -k (یا همان apropos) استفاده کنید.
نکته: فایلهای صفحات راهنما در مسیرهایی مانند
/usr/share/manذخیره میشوند و با استفاده از برنامهیlessنمایش داده میشوند.
اگر صفحهای باز نشد یا متن آن ناخوانا بود، بررسی کنید که بستههای مربوط بهmanدر سیستم نصب شده باشند.
جستوجو در مستندات با whatis و apropos
گاهی فقط ایدهای کلی از کاری که میخواهیم انجام دهیم در ذهن داریم ولی نام دستور را نمیدانیم.
دستورات whatis و apropos برای همین موقعیتها طراحی شدهاند:
whatis نام— توضیح یک خطی صفحهی راهنمای نامبرده را نمایش میدهد.apropos عبارت— تمام صفحات راهنما را بر اساس عبارت جستوجو میکند (معادلman -k عبارت).
whatis passwd
apropos network
برای آنکه نتایج کامل و بهروز باشند، پایگاه دادهی whatis باید ساخته شده باشد.
اگر نتیجهای نگرفتید، ممکن است لازم باشد (با دسترسی ریشه) دستور زیر را اجرا کنید:
sudo mandb
سیستم مستندات info
پروژهی GNU علاوه بر صفحات man، مجموعه مستندات مفصلتری را با قالب info منتشر میکند.
برای خواندن آنها از دستور info استفاده کنید:
info coreutils 'ls invocation'
محیط info ساختاری شبیه به یک مرورگر متنی دارد.
هر صفحهی info از گرههای (Node) متعددی تشکیل شده است که به وسیلهی پیوندها به هم وصل میشوند.
از کلیدهای Tab یا n و p برای حرکت بین پیوندها و گرههای بعدی و قبلی استفاده کنید،
کلید Enter پیوند انتخابشده را باز میکند و q از برنامه خارج میشود.
در بسیاری از ابزارهای GNU، مستندات info جزئیات بیشتری نسبت به صفحات man ارائه میکنند.
ساختن نام مستعار با alias
اگر لازم است دستوری طولانی را بارها و بارها تکرار کنیم، میتوانیم برای آن یک نام مستعار تعریف کنیم:
alias ll='ls -alF'
alias gs='git status'
بعد از تعریف، کافی است نام مستعار را تایپ کنیم تا دستور مربوطه اجرا شود.
برای مشاهدهی فهرست تمام نامهای مستعار فعلی، دستور alias را بدون هیچ آرگومانی اجرا کنید.
برای حذف یک نام مستعار از unalias استفاده میشود:
unalias ll
نکته: aliasهایی که در خط فرمان تعریف میکنیم فقط تا پایان نشست جاری (Session) باقی میمانند.
برای دائمی کردن آنها، دستورهایaliasرا در فایلهای راهاندازی شل مانند~/.bashrcقرار دهید.
همچنین به خاطر داشته باشید که شل aliasها را تنها در ابتدای خط تشخیص میدهد؛
برای دور زدن یک alias موقتاً میتوانید قبل از نام دستور یک بکاسلش (\) قرار دهید، مانند \ls.
تاریخچهی دستورات (history)
شل دستورات اجراشده را در یک فایل تاریخچه ذخیره میکند (برای Bash معمولاً ~/.bash_history).
با دستور history میتوانیم این فهرست را ببینیم:
history
history 20
خروجی شامل شمارهی هر دستور است. برای اجرای مجدد دستوری مشخص میتوانیم از ! استفاده کنیم:
!!— آخرین دستور را دوباره اجرا میکند.!عدد— دستور با شمارهی مشخص را اجرا میکند (مثلاً!42).!رشته— آخرین دستوری را که با «رشته» شروع شده اجرا میکند (مثلاً!ls).
برای ویرایش سریع دستور قبلی میتوان از شکل جایگزینسازی استفاده کرد:
^old^new^
این ساختار آخرین دستور را یافته و نخستین وقوع old را با new جایگزین میکند.
برای جستوجوی تعاملی در تاریخچه، Ctrl + r را فشار دهید و بخشی از دستور مورد نظر را بنویسید.
با فشردن دوبارهی Ctrl + r به نتیجهی قبلی برمیگردید و با Enter یا کلید فلش راست میتوانید دستور را اجرا یا ویرایش کنید.
نکته امنیتی: اگر به صورت تصادفی اطلاعات حساسی مانند رمزها را در خط فرمان وارد کردهاید، بهتر است آنها را از تاریخچه پاک کنید.
با دستورhistory -d شمارهمیتوانید یک خط مشخص را حذف کنید و باhistory -cکل تاریخچهی نشست جاری را پاک کنید.
همچنین میتوانید پس از پاکسازی تاریخچهی نشست، فایل~/.bash_historyرا به صورت دستی ویرایش یا حذف کنید.
در نهایت، ترکیب تاریخچه با aliasها و مستندات درون سیستم باعث میشود کار با خط فرمان روزبهروز سریعتر و مؤثرتر شود.
جمعبندی
در این فصل یاد گرفتیم که شل چگونه نام دستورات را تفسیر میکند و با استفاده از type، which و ابزارهای مستندسازی مختلف
میتوانیم اطلاعات دقیقی از هر دستور به دست آوریم.
همچنین دیدیم چگونه با aliasها کارهای تکراری را ساده کنیم و با بهرهگیری از تاریخچهی شل، دستورات قبلی را به سرعت بازیابی کنیم.
در فصل بعد با تغییر مسیر ورودی و خروجی (I/O Redirection) آشنا خواهیم شد که یکی از قدرتمندترین قابلیتهای خط فرمان است.