فصل ۵ – کار با دستورات (Working With Commands)


مقدمه

تا اینجا یاد گرفته‌ایم که چطور در سیستم فایل حرکت کنیم و فایل‌ها و پوشه‌ها را بسازیم،
جابه‌جا کنیم و حذف کنیم.
اکنون وقت آن رسیده که سراغ خود «دستورات» برویم تا بفهمیم وقتی نامی را در خط فرمان وارد می‌کنیم
دقیقاً چه چیزی اجرا می‌شود و چگونه می‌توانیم اطلاعات بیشتری از آن به دست بیاوریم.

در این فصل موضوعات زیر را بررسی می‌کنیم:


دستور چیست؟

وقتی در خط فرمان یک «نام» وارد می‌کنیم، شل باید تشخیص دهد که منظور ما چیست و چه چیزی باید اجرا شود.
در لینوکس چهار نوع اصلی از دستورات وجود دارد:

  1. برنامه‌های اجرایی (Executable Programs):
    می‌تواند یک برنامه‌ی کامپایل‌شده (مانند برنامه‌هایی که با C یا C++ ساخته شده‌اند)
    یا یک اسکریپت باشد (اسکریپت‌های شل، پایتون، پرل و غیره).
  2. دستورات داخلی شل (Shell Builtins):
    قابلیت‌هایی که جزئی از خود شل هستند، مانند cd، alias، history و … .
  3. توابع شل (Shell Functions):
    مجموعه‌ای از دستورات که با یک نام تعریف شده‌اند و دقیقاً مانند یک دستور فراخوانی می‌شوند.
  4. نام‌های مستعار (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 عبارتند از:


پیدا کردن برنامه با 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 معمولاً دارای بخش‌های استاندارد زیر است:

صفحات راهنما بر اساس شماره‌ی بخش دسته‌بندی شده‌اند. رایج‌ترین بخش‌ها عبارت‌اند از:

  1. دستورات اجرایی و برنامه‌های کاربری
  2. فراخوانی‌های سیستمی هسته‌ی لینوکس
  3. فراخوانی‌های کتابخانه‌ای C
  4. فایل‌های ویژه، دستگاه‌ها و درایورها
  5. فرمت‌های فایل و قراردادها
  6. بازی‌ها و تفریحات
  7. موارد متفرقه
  8. ابزارهای مدیریتی سیستم

اگر یک نام در چند بخش مختلف وجود داشته باشد، می‌توانیم با نوشتن شماره‌ی بخش، صفحه‌ی دقیق را مشخص کنیم:

man 5 passwd

در صورت نیاز به مشاهده‌ی نام تمام صفحات موجود برای یک دستور، از man -k (یا همان apropos) استفاده کنید.

نکته: فایل‌های صفحات راهنما در مسیرهایی مانند /usr/share/man ذخیره می‌شوند و با استفاده از برنامه‌ی less نمایش داده می‌شوند.
اگر صفحه‌ای باز نشد یا متن آن ناخوانا بود، بررسی کنید که بسته‌های مربوط به man در سیستم نصب شده باشند.


جست‌وجو در مستندات با whatis و apropos

گاهی فقط ایده‌ای کلی از کاری که می‌خواهیم انجام دهیم در ذهن داریم ولی نام دستور را نمی‌دانیم.
دستورات whatis و apropos برای همین موقعیت‌ها طراحی شده‌اند:

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

خروجی شامل شماره‌ی هر دستور است. برای اجرای مجدد دستوری مشخص می‌توانیم از ! استفاده کنیم:

برای ویرایش سریع دستور قبلی می‌توان از شکل جایگزین‌سازی استفاده کرد:

^old^new^

این ساختار آخرین دستور را یافته و نخستین وقوع old را با new جایگزین می‌کند.

برای جست‌وجوی تعاملی در تاریخچه، Ctrl + r را فشار دهید و بخشی از دستور مورد نظر را بنویسید.
با فشردن دوباره‌ی Ctrl + r به نتیجه‌ی قبلی برمی‌گردید و با Enter یا کلید فلش راست می‌توانید دستور را اجرا یا ویرایش کنید.

نکته امنیتی: اگر به صورت تصادفی اطلاعات حساسی مانند رمزها را در خط فرمان وارد کرده‌اید، بهتر است آن‌ها را از تاریخچه پاک کنید.
با دستور history -d شماره می‌توانید یک خط مشخص را حذف کنید و با history -c کل تاریخچه‌ی نشست جاری را پاک کنید.
همچنین می‌توانید پس از پاک‌سازی تاریخچه‌ی نشست، فایل ~/.bash_history را به صورت دستی ویرایش یا حذف کنید.

در نهایت، ترکیب تاریخچه با aliasها و مستندات درون سیستم باعث می‌شود کار با خط فرمان روزبه‌روز سریع‌تر و مؤثرتر شود.


جمع‌بندی

در این فصل یاد گرفتیم که شل چگونه نام دستورات را تفسیر می‌کند و با استفاده از type، which و ابزارهای مستندسازی مختلف
می‌توانیم اطلاعات دقیقی از هر دستور به دست آوریم.
همچنین دیدیم چگونه با aliasها کارهای تکراری را ساده کنیم و با بهره‌گیری از تاریخچه‌ی شل، دستورات قبلی را به سرعت بازیابی کنیم.
در فصل بعد با تغییر مسیر ورودی و خروجی (I/O Redirection) آشنا خواهیم شد که یکی از قدرتمندترین قابلیت‌های خط فرمان است.