مقدمه
تا اینجا با تعدادی از مهمترین و پرکاربردترین کامندهای لینوکسی آشنا شدیم. اما در این درس قصد داریم به این
موضوع بپردازیم که یک کامند ماهیتاً چیست؟ در واقع، کامندها انواعی دارند که آنها را در این درس معرفی میکنیم.
بهعلاوه، یک موضوع بسیار کلیدی در دنیای لینوکس با نام مستندات (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 را
برای همیشه ماندگار کنیم.