مقدمه

تا اینجا با تعدادی از مهمترین و پرکاربردترین کامندهای لینوکسی آشنا شدیم. اما در این درس قصد داریم به این موضوع بپردازیم که یک کامند ماهیتاً چیست؟ در واقع، کامندها انواعی دارند که آنها را در این درس معرفی می‌کنیم. به‌علاوه، یک موضوع بسیار کلیدی در دنیای لینوکس با نام مستندات (documentation) را نیز در این درس مورد بررسی قرار می‌دهیم. یعنی یاد می‌گیریم که چطور به اطلاعات و مستندات مربوط به کامندها دسترسی پیدا کنیم.

یک کامند دقیقاً چیست؟

کامندهای لینوکس دستوراتی هستند که کاربر با وارد کردن آنها در محیط ترمینال، با سیستم‌عامل ارتباط برقرار می‌کند. برخی از این کامندها در خود شِل تعبیه شده‌اند و برخی دیگر برنامه‌های مستقلی هستند که شِل آنها را فراخوانی می‌کند. برای مثال، کامند cd که دیدیم برای تغییر دایرکتوری جاری کاربرد دارد، کامند pwd که دایرکتوری جاری را نمایش می‌دهد و یا کامندی مثل echo که برای نمایش متن در ترمینال کاربرد دارد، متعلق به خود شِل و اصطلاحاً shell built-in هستند اما کامندهایی مثل cp و mv و rm و اکثر کامندهایی که تا الان دیدیم، در واقع برنامه‌های اجرایی مستقلی هستند که معمولاً درون دایرکتوری /usr/bin قرار دارند و وقتی از آنها استفاده می‌کنیم، شِل آنها را فراخوانی می‌کند.

کامندهایی که مستقل از شِل هستند، یا باینری‌هایی هستند که به زبان‌هایی مانند C و C++ نوشته و کامپایل شده‌اند و یا برنامه‌هایی هستند که به زبان‌هایی مانند پایتون، روبی یا حتی شِل‌هایی مانند Bash نوشته شده‌اند و اسکریپت نام دارند.

کامندهای درونی شِل هم یا به فرم یک کامند ساده مانند cd هستند و یا به فرم یک تابع شِل که بعداً نحوه‌ی ایجاد آنها را یاد می‌گیریم. علاوه بر اینها، امکان ساخت کامندهای سفارشی هم وجود دارد. این کامندها را که alias نامیده می‌شوند، با ترکیب کردن کامندهای موجود می‌سازیم.

پس به طور خلاصه، یک کامند می‌تواند یکی از موارد زیر باشد:

  • یک کامند درونی شِل یا shell built-in که توسط خود شِل تفسیر و اجرا می‌شود.
  • یک برنامه‌ی اجرایی کامپایل‌شده که توسط شِل فراخوانی می‌شود.
  • یک اسکریپت که با استفاده از زبان‌هایی مانند پایتون و Perl و یا با استفاده از شِل‌هایی مانند Bash نوشته شده است.
  • یک alias که با دستکاری و ترکیب کامندهای موجود ساخته می‌شود.

پیدا کردن نوع کامند

حالا که با انواع کامندهای لیوکسی آشنا شدیم، باید ببینیم چطور می‌توانیم نوع یک کامند را تشخیص بدهیم. برای پیدا کردن نوع کامند، می‌توانیم از کامندی به نام type استفاده کنیم که دارای فرم کلی زیر است.

$ type command

یعنی باید نام کامند مورد نظر را به عنوان آرگومان کامند type بیاوریم. مثال زیر را ببینید.

$ type type 
type is a shell builtin 
$ type ls 
ls is aliased to `ls –color=tty’ 
$ type cp 
cp is /usr/bin/cp
          

مثال بالا نشان می‌دهد که خود کامند type یک کامند درونی شِل است، کامند ls یک کامند از نوع alias است که در واقع، کامند اورجینال ls را به همراه یک آپشن --color به کار می‌گیرد و به همین دلیل است که خروجی این کامند به صورت رنگی نمایش داده می‌شود. همچنین، کامند cp هم یک برنامه‌ی اجرایی مستقل است که در دایرکتوری /usr/bin قرار دارد.

اغلب برنامه‌های اجرایی مستقل در دایرکتوری /usr/bin قرار دارند اما برای اطمینان از این موضوع، می‌توانیم از کامند which استفاده کنیم. کافیست مانند مثال زیر، نام کامند مورد نظر را بعد از عبارت which بیاوریم.

$ which cp
/usr/bin/cp
$ which date 
/usr/bin/date
$ which cd
$ which pwd 
/usr/bin/pwd
          

در مثال بالا موردی دیده می‌شود که نیازمند توضیح است. استفاده از کامند which برای cd بدون نتیجه بوده و خروجی نداشته است. البته این امر کاملاً منطقی و مطابق انتظار ماست؛ چون cd یک کامند درونی شِل است. اما اتفاق عجیب در مورد کامند pwd رخ داده که مثل cd یک کامند درونی شِل است اما دایرکتوری /usr/bin به عنوان محل ذخیره‌ی آن گزارش شده است.

داستان از این قرار است که در اکثر توزیع‌های لینوکسی، کامندهایی مثل pwd و echo یک ورژن باینری هم دارند. به همین دلیل است که وقتی از کامند which برای آنها استفاده می‌کنیم، یک دایرکتوری به عنوان محل ذخیره‌ی این باینری‌ها نمایش داده می‌شود. البته از نظر عملکردی، تفاوتی بین ورژن درونی و باینری این کامندها وجود ندارد.

دسترسی به مستندات کامندها

در لینوکس، کامندها روش اصلیِ برقراری ارتباط با سیستم‌عامل و انجام امور مخنلف هستند. اما به خاطر سپردن جزئیات کامندهای پرتعداد لینوکسی برای هیچ کس ممکن نیست و به همین دلیل است که در دنیای لینوکس تا این حد روی موضوع مستندسازی کامندها تأکید شده است. هنر یک ادمین لینوکس این است که بتواند اطلاعات مورد نیازش را از مجموعه‌ی غنی مستندات در لینوکس استخراج کند.

در ادامه، خواهیم دید که چطور می‌توانیم اطلاعات مورد نیازمان در مورد یک کامند را بدست بیاوریم.

کامند help و آپشن --help

هر شِل برای کامندهای درونی خود مستنداتی تدارک دیده که با استفاده از کامندی به نام help می‌توان به آنها دسترسی پیدا کرد. کافیست نام کامند مورد نظر را بعد از عبارت help بیاوریم. برای مثال، کامند زیر منجر به نمایش اطلاعاتی در مورد کامند cd می‌شود.

$ help cd

خروجی این کامند با خط زیر شروع می‌شود که سینتکس کامند cd را نشان می‌دهد.

cd: cd [-L|[-P [-e]] [-@]] [dir]

در توصیف سینتکس کامندها، کاراکترهای براکت ( [ ] ) به معنای اختیاری بودن آپشن یا آرگومان است و کاراکتر پایپ ( | ) به معنای "یا" است. بنابراین، خروجی بالا به این معناست که کامند cd می‌تواند یک آپشن اختیاری -L یا یک آپشن اختیاری -P یا -@ داشته باشد. در ضمن، اگر آپشن -P موجود باشد، می‌توان از آپشن اختیاری -e هم استفاده کرد. کامند cd می‌تواند با یک آرگومان اختیاری هم همراه باشد که در بالا با نام dir مشخص شده است. در ادامه‌ی خروجی تولید شده هم هر یک از این آپشن‌ها و کاربردشان توضیح داده شده‌اند.

بعضی از کامندهای باینری هم به یک مکانیزم help مانند آنچه در مورد کامندهای درونی شِل دیدیم، مجهز هستند. کافیست کامند مورد نظر را به همراه یک آپشن با نام --help به کار بگیریم. برای مثال، کامند cp --help اطلاعاتی را در مورد کامند cp نمایش می‌دهد. اما همه‌ی کامندهای باینری این قابلیت را ندارند.

کامندهای اجرایی مستندات جامعی دارند که در ادامه نحوه‌ی دسترسی به آنها را خواهیم دید اما در مورد کامندهای درونی شِل، باید از کامند help command برای دریافت مستندات استفاده کنیم.

مستندات Manual و Info

اکثر کامندهای اجرایی دارای مستنداتی موسوم به Manual یا man page هستند که از طریق کامند man command در دسترس ما قرار دارند. در اغلب توزیع‌های لینوکسی، برای نمایش این مستندات از پیجر less استفاده می‌شود و بنابراین، کامندهای کیبورد مربوط به less که در درس فبل معرفی شدند، اینجا هم قابل استفاده هستند. برای مثال، با کلید q می‌توانیم از صفحه‌ی مستندات خارج شویم.

اگرچه بین مستندات کامندهای مختلف تفاوت‌هایی دیده می‌شود اما معمولاً همه‌ی آنها شامل یک عنوان، سینتکس کلی، توضیح هدف و کاربرد کامند و لیستی از آپشن‌های کامند هستند. توجه داشته باشید که یک man page در واقع یک رفرنس محسوب می‌شود و برای اهداف آموزشی مناسب نیست.

جستجو در مستندات Manual

با استفاده از کامند apropos می‌توانیم عبارت مورد نظرمان را در مستندات Manual سرچ کنیم. برای مثال، اگر به دنبال عبارت partition باشیم، می‌توانیم به صورت زیر مستندات را جستجو کنیم.

$ apropos partition

اگر این کامند را اجرا کنید، لیستی از کامندهایی که عبارت partition در مستندات آنها وجود دارد، به همراه توضیج کوتاهی در مورد هر کامند نمایش داده می‌شود. به‌جای کامند apropos می‌توانیم از کامند man با آپشن -k استفاد کنیم. یعنی کامند بالا با man -k partition معادل است.

یک کامند مفید دیگر هم داریم که برای دریافت اطلاعات مختصر (در حد یک خط) در مورد کامندها کاربرد دارد و آن کامند whatis است. مثال زیر، خروجی whatis را برای چند کامند نشان می‌دهد.

$ whatis cp
cp (1)               - copy files and directories
$ whatis date
date (1)             - print or set the system date and time
$ whatis rsync
rsync (1)            - a fast, versatile, remote (and local) file-copying tool
          

پروژه‌ی GNU یک جایگزین برای مستندات Manual یا man ارائه داده که مستندات Info نام دارد. با استفاده از کامند info command می‌توانیم به مستندات info مربوط به یک کامند دسترسی پیدا کنیم. برای مثال، کامند info ls مستندات مربوط به کامند ls را باز می‌کند.

به دلایل زیر، مستندات info نسبت به صفحات man انتخاب مناسب‌تری محسوب می‌شوند:

  • ساختار سلسله‌مراتبی: یک سند info به صورت مجموعه‌ای از گره‌ها (nodes) سازماندهی شده است. هر گره می‌تواند شامل اطلاعات مشخصی در مورد یک کامند باشد و می‌تواند به گره‌های دیگر هم لینک بدهد. این ساختار، جابجایی بین بخش‌های مختلف سند را ساده‌تر می‌کند.
  • لینک‌ها و پیمایش: در صفحات info می‌توانید مثل یک صفحه‌ی وب از لینک‌ها برای جابجایی بین بخش‌های مختلف سند استفاده کنید.
  • دستورالعمل‌های جامع‌تر: یک صفحه‌ی info معمولاً نسبت به صفحه‌ی man معادلش، مفصل‌تر است و جزئیات بیشتری را در مورد کامند مورد نظر ارائه می‌دهد.
  • قابلیت جستجو: درون یک صفحه‌ی info امکان جستجوی یک عبارت هم وجود دارد.

جدول زیر چند کلید کیبورد کاربردی در صفحات info را لیست کرده است.

کلید کاربرد
space به صفحه‌ی بعدی می‌رود
b به صفحه‌ی قبلی می‌رود.
n به گره بعدی می‌رود.
p به گره قبلی می‌رود.
u به گره والد (یک سطح بالاتر) می‌رود.
Enter به یک لینک وارد می‌شود.
q از مستندات info خارج می‌شود.

با توجه به مزایای مستندات info انتظار می‌رفت که جایگزین صفحات man شوند اما در عمل، چنین اتفاقی نیفتاده و هنوز کاربران از man خیلی بیشتر استفاده می‌کنند. برای این موضوع، علاوه بر سادگی و پیچیدگی کمتر man و آشنایی بیشتر کاربران با آن، یک دلیل مهم وجود دارد و آن این است که تقریباً برای هر کامندی مستندات man وجود دارد اما مستندات info برای خیلی از کامندها (به‌ویژه کامندهایی که به پروژه GNU متعلق نیستند) موجود نیست. البته با وجود استفاده‌ی کمتر از info، این ابزار برای دستورات پیچیده‌تر یا ابزارهای بزرگ مانند کامپایلرها (مثل gcc) و مجموعه ابزارهای GNU مثل make و gdb بسیار مفید است. در این موارد، مستندات info اطلاعات بسیار بیشتری نسبت به صفحات man ارائه می‌دهند.

ایجاد کامندهای سفارشی توسط alias

دیدیم که کامند type نوع کامند ls را alias گزارش می‌کند. کامندهایی مانند ls با استفاده از کامند alias ایجاد می‌شوند. کامند alias در لینوکس برای ایجاد نام‌های مستعار برای دستورات طولانی یا پرکاربرد استفاده می‌شود. این ویژگی به کاربران این امکان را می‌دهد که دستورات پیچیده یا پرکاربرد را با نام‌های کوتاه‌تر و ساده‌تر فراخوانی کنند. استفاده از alias می‌تواند کارایی و سرعت کار با شِل را افزایش دهد و امکان سفارشی‌سازی دستورات را فراهم می‌کند.

کامند alias دارای فرم کلی زیر است:

alias command =  'string'

عبارتی که به جای string وارد می‌شود، کامندی است که با اجرای command فراخوانی می‌شود. به مثال زیر نگاه کنید.

alias ll='ls -l'

از این به بعد، هر وقت دستور ll را اجرا کنیم، در واقع، دستور ls -l است که اجرا می‌شود. حالا مثال زیر را ببینید.

$ alias foo='cd /usr; ls; cd -'

با استفاده از سمی‌کالن می‌توانیم کامندها را از هم جدا کنیم و به این ترتیب، این امکان فراهم می‌شود که چند کامند را در یک خط وارد کنیم تا یکی پس از دیگری اجرا شوند. بنابراین، بعد از اجرای کامند بالا، هر وقت کامند foo را اجرا کنیم، سه دستور فوق اجرا می‌شوند.

برای حذف alias می‌توانیم از کامند uninstall command استفاده کنیم که در آن باید به جای command نام alias را وارد کنیم. البته با بسته شدن شِل، هر alias که به روش بالا تعریف شده باشد، خود به خود حدف می‌شود. به عبارت دیگر، عمر یک alias محدود به session جاری است. اما در فصل یازدهم خواهیم دید که چطور می‌توانیم یک alias را برای همیشه ماندگار کنیم.