توی این درس یاد میگیری وقتی یک دستور را نمیشناسی یا یادت رفته چه flag ای داشت، بدون هیچ سایتی جوابش را از خود لینوکس بگیری. صفحههای man (man ls) را باز و بخش SYNOPSIS را بخوانی، با --help خلاصهی سریع بگیری، برای دستورهای داخلی shell از help استفاده کنی، با type و which بفهمی یک دستور چیست و کجاست، و با apropos دستوری را که اسمش را نمیدانی پیدا کنی. با tldr هم آشنا میشوی. تمرین: flag ای از ls پیدا میکنی که فایلها را بر اساس حجم مرتب کند.
مسئله: صدها دستور، هیچکس همهشان را حفظ نیست
Section titled “مسئله: صدها دستور، هیچکس همهشان را حفظ نیست”لینوکس هزاران دستور و flag دارد. حتی متخصصها flag های دستورها را حفظ نیستند؛ فقط بلدند کجا نگاه کنند. کسی که این مهارت را دارد، روی هر سروری (حتی بدون اینترنت) کار میکند، چون راهنما همراه خود سیستم است.
تشبیه: کتابچهی راهنمای داخل جعبه
Section titled “تشبیه: کتابچهی راهنمای داخل جعبه”هر وسیلهی برقی کتابچهی راهنما همراه جعبه دارد. لینوکس هم همینطور: man کتابچهی کامل است، --help برگهی خلاصهی روی جعبه، type برچسب «این چیست و کجا ساخته شده» و apropos فهرست راهنما برای وقتی که اسم وسیله را نمیدانی.
مثالهای عملی
Section titled “مثالهای عملی”مثال ۱: man، راهنمای کامل
Section titled “مثال ۱: man، راهنمای کامل”man (مخفف manual) صفحهی راهنمای یک دستور را باز میکند. در ترمینال واقعی این صفحه در برنامهی less باز میشود و با کلیدها حرکت میکنی؛ اینجا برای نمایش، بالای صفحه را چاپ میکنم (col -b فقط علامتهای ضخیمکننده را حذف میکند و در ترمینال خودت لازم نیست):
man ls | col -b | head -22LS(1) User Commands LS(1)
NAME ls - list directory contents
SYNOPSIS ls [OPTION]... [FILE]...
DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐ fied.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..بخشهای استاندارد هر صفحه:
| بخش | محتوا |
|---|---|
| NAME | اسم و توضیح یکخطی |
| SYNOPSIS | شکل کلی نوشتن دستور |
| DESCRIPTION | توضیح کامل و فهرست گزینهها |
| EXAMPLES | مثالها (همهی صفحهها ندارند) |
| SEE ALSO | دستورهای مرتبط |
مثال ۲: خواندن SYNOPSIS
Section titled “مثال ۲: خواندن SYNOPSIS”خط SYNOPSIS یک نقشهی فشرده است: ls [OPTION]... [FILE].... قراردادهایش:
| نماد | معنی |
|---|---|
[ ... ] |
اختیاری است |
... |
میتواند تکرار شود (چند تا) |
A | B |
یکی از دو |
حروف بزرگ (FILE) |
جاینگهدار؛ خودت مقدار میگذاری |
<...> |
الزامی (در بعضی صفحهها) |
پس ls [OPTION]... [FILE]... یعنی: ls، هر چند option (اختیاری)، هر چند فایل یا پوشه (اختیاری). برای دستورهای دیگر هم همینطور بخوان؛ مثلاً cp:
man cp | col -b | sed -n '/^SYNOPSIS/,/^DESCRIPTION/p' | head -8SYNOPSIS cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE...
DESCRIPTIONcp [OPTION]... SOURCE DEST یعنی یک مبدأ و یک مقصد؛ cp [OPTION]... SOURCE... DIRECTORY یعنی چند مبدأ و یک پوشهی مقصد. دو شکل مجاز است.
مثال ۳: حرکت و جستجو داخل man
Section titled “مثال ۳: حرکت و جستجو داخل man”در ترمینال تعاملی، man صفحه را با less نشان میدهد. کلیدهای مهم:
| کلید | کار |
|---|---|
Space یا f |
صفحهی بعد |
b |
صفحهی قبل |
j / k یا ↓ / ↑ |
یک خط پایین/بالا |
/متن + Enter |
جستجوی متن بهسمت پایین |
n / N |
نتیجهی بعدی / قبلی |
g / G |
اول / آخر صفحه |
q |
خروج |
جستجو مهمترین مهارت است: بهجای خواندن همهی صفحه، /sort میزنی. همین جستجو را اینجا با grep شبیهسازی میکنم (در ترمینال واقعی /size را داخل man میزنی):
man ls | col -b | grep -n -i "sort by file size"152: -S sort by file size, largest firstخط شمارهی بالا همان جایی است که -S توضیح داده شده است. پس flag ای که فایلها را بر اساس حجم مرتب میکند -S است. امتحانش میکنیم:
mkdir -p t && cd thead -c 100 /dev/zero > a_small.txthead -c 5000 /dev/zero > b_big.txthead -c 800 /dev/zero > c_medium.txtecho "--- ترتیب پیشفرض (الفبایی):"ls -l | awk 'NR>1{print $5, $9}'echo "--- با -S (بزرگترین اول):"ls -lS | awk 'NR>1{print $5, $9}'--- ترتیب پیشفرض (الفبایی):100 a_small.txt5000 b_big.txt800 c_medium.txt--- با -S (بزرگترین اول):5000 b_big.txt800 c_medium.txt100 a_small.txtمثال ۴: --help، خلاصهی سریع
Section titled “مثال ۴: --help، خلاصهی سریع”بیشتر دستورهای GNU گزینهی --help دارند که یک خلاصهی کوتاهتر از man میدهد، مناسب وقتی فقط flag را میخواهی یادآوری کنی:
ls --help | head -12Usage: ls [OPTION]... [FILE]...List information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too. -a, --all do not ignore entries starting with . -A, --almost-all do not list implied . and .. --author with -l, print the author of each file -b, --escape print C-style escapes for nongraphic characters --block-size=SIZE with -l, scale sizes by SIZE when printing them; e.g., '--block-size=M'; see SIZE format belowمیشود خروجی را با grep فیلتر کرد (در درسهای pipe و grep کامل یاد میگیری؛ فعلاً فقط نتیجه را ببین. الگوی ^ +-S یعنی «خطی که با فاصله و بعد -S شروع میشود»):
ls --help | grep -E "^ +-S " -S sort by file size, largest firstاگر flag را اشتباه بزنی، خود دستور راهنمایی میکند:
ls -z 2>&1ls: invalid option -- 'z'Try 'ls --help' for more information.پیام خطا میگوید «-z وجود ندارد» و راه را نشان میدهد: Try 'ls --help'. خطاها را بخوان؛ پر از سرنخاند.
مثال ۵: دستورهای داخلی shell، help
Section titled “مثال ۵: دستورهای داخلی shell، help”بعضی دستورها (مثل cd) برنامهی جدا نیستند و جزو خود shellاند (درس قبل: builtin). برای آنها man معمولاً چیزی ندارد و باید از help استفاده کنی:
whatis cd 2>&1 | head -2echo "--- help cd:"help cd | head -8cd: nothing appropriate.--- help cd:cd: cd [-L|[-P [-e]] [-@]] [dir] Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the HOME shell variable. If DIR is "-", it is converted to $OLDPWD.
The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:).whatis cd چیزی پیدا نکرد، ولی help cd راهنمای کامل را داد. قاعده: اگر man چیزی جواب نداد، بپرس type چیزی (مثال ۶): اگر shell builtin بود، help چیزی.
برای دستور داخلی cd کدام راهنما را باید بزنی؟
cd جزو shell است؛ راهنمایش با help میآید.
مثال ۶: type و which، این دستور چیست و کجاست؟
Section titled “مثال ۶: type و which، این دستور چیست و کجاست؟”type میگوید shell با آن اسم چه میکند؛ which فقط مسیر برنامه را نشان میدهد:
hash -rtype cdtype lstype -a echowhich python3which -a python3command -v ls cdcd is a shell builtinls is /usr/bin/lsecho is a shell builtinecho is /usr/bin/echoecho is /bin/echo/usr/bin/python3/usr/bin/python3/bin/python3/usr/bin/lscdcd یک builtin است، ls یک فایل برنامه در /usr/bin/ls. echo هم builtin است هم برنامهی جدا (type -a همهی نسخهها را نشان میدهد؛ shell اول builtin را اجرا میکند). وقتی چند نسخه از یک دستور داری (مثلاً دو پایتون)، which -a به تو میگوید کدام اول پیدا میشود (ترتیب $PATH، درس متغیرهای محیطی). command -v در اسکریپتها برای «آیا این دستور هست؟» استاندارد است. (اگر قبلاً ls را اجرا کرده باشی، type ls میگوید hashed: shell مسیر برنامههایی را که یک بار پیدا کرده در یک جدول بهخاطر میسپارد تا دفعهی بعد جستجو نکند؛ hash -r آن جدول را خالی میکند.)
برای پیدا کردن برنامه و راهنمایش با هم:
whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gzمثال ۷: apropos، اسم دستور را نمیدانم
Section titled “مثال ۷: apropos، اسم دستور را نمیدانم”وقتی میدانی چه کاری میخواهی ولی اسم دستور را نه، apropos (یا man -k) در توضیح یکخطی همهی صفحهها جستجو میکند:
apropos "copy files"echo "--- فقط بخش ۱ (دستورهای کاربر):"apropos -s 1 copy | head -5cp (1) - copy files and directoriesinstall (1) - copy files and set attributes--- فقط بخش ۱ (دستورهای کاربر):aarch64-linux-gnu-objcopy (1) - copy and translate object filescp (1) - copy files and directoriesdd (1) - convert and copy a fileinstall (1) - copy files and set attributesobjcopy (1) - copy and translate object filesنتیجه: cp (کپی فایل) و install. هر ردیف نام (بخش) - توضیح است. عدد داخل پرانتز شمارهی بخش صفحهی man است:
| بخش | محتوا |
|---|---|
| 1 | دستورهای کاربر (ls, cp) |
| 2 | فراخوانیهای سیستمی هسته (open, read) |
| 3 | توابع کتابخانهی C (printf) |
| 5 | فرمت فایلهای تنظیمات (passwd, crontab) |
| 7 | مفاهیم کلی (signal, regex) |
| 8 | دستورهای مدیریت سیستم (useradd, mount) |
گاهی یک اسم در چند بخش هست. با شماره مشخص میکنی:
man -f printfecho "--- بخش 1 (دستور شل):"man 1 printf | col -b | head -1echo "--- بخش 3 (تابع C):"man 3 printf | col -b | head -1printf (1) - format and print dataprintf (3) - formatted output conversion--- بخش 1 (دستور شل):PRINTF(1) User Commands PRINTF(1)--- بخش 3 (تابع C):printf(3) Library Functions Manual printf(3)مثال ۸: tldr، خلاصه با مثال (نمونه)
Section titled “مثال ۸: tldr، خلاصه با مثال (نمونه)”صفحههای man دقیق ولی طولانیاند. ابزار tldr (از «too long; didn’t read») صفحههای کوتاه با مثالهای رایج میدهد. نصب و استفاده (روی Ubuntu نیاز به اینترنت برای گرفتن صفحهها دارد):
sudo apt install tldrtldr tartarArchiving utility.
- Create an archive from files: tar cf target.tar file1 file2 file3...اگر tldr در دسترس نبود، راه برگشت همیشه همین man و --help و جستجو با / است. برای همین اول آنها را یاد گرفتیم.
مثال ۹: نسخه و سازندهی دستور
Section titled “مثال ۹: نسخه و سازندهی دستور”ls --version | head -1man --versionbash --version | head -1ls (GNU coreutils) 9.4man 2.12.0GNU bash, version 5.2.21(1)-release (aarch64-unknown-linux-gnu)--version نسخه را میدهد؛ این وقتی مهم است که یک flag در نسخهی قدیمیتر نباشد.
پشت پرده: man کجا میخواند؟
Section titled “پشت پرده: man کجا میخواند؟”صفحههای man فایلهای فشرده در /usr/share/man/man1/، man5/ و … هستند (ls.1.gz یعنی صفحهی ls در بخش ۱). man -w ls مسیر واقعی را میدهد:
man -w lsman -w passwdman -w 5 passwd/usr/share/man/man1/ls.1.gz/usr/share/man/man1/passwd.1.gz/usr/share/man/man5/passwd.5.gzبرنامهی man فایل را با groff قالببندی میکند و با less نشان میدهد. پایگاه apropos (mandb) فهرست یکخطی همهی صفحههاست که با نصب بستهها بهروز میشود. در سیستمهای کمحجم (مثل بعضی ایمیجهای کانتینر) صفحههای man حذف شدهاند تا حجم کم شود؛ برای همین در یک کانتینر گاهی man ls میگوید «No manual entry». در ماشین عادی نصب هستند.
جدولهای مرجع
Section titled “جدولهای مرجع”| دستور | کار | نمونه |
|---|---|---|
man CMD |
راهنمای کامل | man ls |
man N CMD |
بخش مشخص | man 5 passwd |
man -k عبارت / apropos |
جستجو در توضیحها | apropos copy |
man -f CMD / whatis |
توضیح یکخطی | whatis ls |
man -w CMD |
مسیر فایل راهنما | man -w ls |
CMD --help |
خلاصه (GNU) | ls --help |
help CMD |
راهنمای دستور داخلی shell | help cd |
type CMD |
نوع دستور (builtin، فایل، alias) | type -a echo |
which CMD |
مسیر برنامه | which python3 |
whereis CMD |
برنامه + راهنما | whereis ls |
command -v CMD |
آیا هست؟ (در اسکریپت) | command -v git |
tldr CMD |
خلاصه با مثال (نیاز به نصب) | tldr tar |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) man برای دستور داخلی shell
Section titled “۱) man برای دستور داخلی shell”man cd 2>&1 | head -2No manual entry for cdcd برنامه نیست و صفحهی مستقلی ندارد؛ پیام «No manual entry» میگیری. راهحل: help cd.
۲) صفحهی اشتباه در بخش اشتباه
Section titled “۲) صفحهی اشتباه در بخش اشتباه”man printf بخش ۱ (دستور) را باز میکند، نه تابع C. اگر تابع C (بخش ۳) را میخواهی، man 3 printf. راهحل: اگر صفحه چیزی نبود که انتظار داشتی، بخش را مشخص کن.
۳) فکر کردن «اگر man نیست، دستور نیست»
Section titled “۳) فکر کردن «اگر man نیست، دستور نیست»”man -k "no-such-thing-xyz" 2>&1 | head -2no-such-thing-xyz: nothing appropriate.جستجوی بینتیجه فقط یعنی آن عبارت در توضیحها نیست؛ ممکن است اسم دیگری داشته باشد. راهحل: مترادف را امتحان کن (copy ← cp)، یا انگلیسی سادهتر (apropos "list directory").
۴) خواندن کل man بهجای جستجو
Section titled “۴) خواندن کل man بهجای جستجو”صفحهی bash هزاران خط است. راهحل: /عبارت برای پرش مستقیم به بخش مورد نظر؛ یا man bash | col -b | grep -n عبارت.
۵) اجرای which برای دستور builtin
Section titled “۵) اجرای which برای دستور builtin”which cd; echo "کد خروج: $?"کد خروج: 1which cd چیزی چاپ نمیکند و کد خروج غیرصفر میدهد، چون cd فایلی ندارد. راهحل: type cd.
با type بفهم echo، ls و cd هر کدام چه هستند.
دیدن جواب
type echo ls cdecho is a shell builtinls is /usr/bin/lscd is a shell builtinتمرین اصلی: flag ای از ls پیدا کن که فایلها را بر اساس حجم مرتب کند. فقط با man یا --help (نه اینترنت) پیدایش کن، سه فایل با حجم متفاوت بساز و نشان بده ترتیب درست است.
دیدن جواب
ls --help | grep -i "sort by file size"mkdir -p ex && cd exhead -c 10 /dev/zero > a.txt; head -c 3000 /dev/zero > b.txt; head -c 500 /dev/zero > c.txtls -lS | awk 'NR>1{print $5, $9}' -S sort by file size, largest first3000 b.txt500 c.txt10 a.txtflag همان -S است؛ بزرگترین فایل (b.txt) اول میآید. برای معکوس: ls -lSr.
یک تابع shell بنویس به اسم opt که اسم دستور و یک flag بگیرد و توضیح همان flag را از صفحهی man چاپ کند (مثلاً opt ls -S). روی ls -S و ls -h و cp -a امتحانش کن.
دیدن جواب
opt() { man "$1" | col -b | grep -A2 -E "^ +$2[ ,]" | head -4; }opt ls -Secho "---"; opt ls -hecho "---"; opt cp -a -S sort by file size, largest first
--sort=WORD--- -h, --human-readable with -l and -s, print sizes like 1K 234M 2G etc.
--- -a, --archive same as -dR --preserve=allالگوی grep اول خطی را میگیرد که با آن flag شروع میشود و دو خط بعدش را هم نشان میدهد.
آزمونک
Section titled “آزمونک”در man ls، با کلید / چه میکنی؟
مثلاً /size و بعد n برای نتیجهی بعدی.
SYNOPSIS: cp [OPTION]... SOURCE DEST. [OPTION]... یعنی…
براکت = اختیاری، سهنقطه = تکرار.
راهنمای دستور داخلی cd را از کجا میگیری؟
builtin ها صفحهی man مستقل ندارند.
اگر اسم دستور را نمیدانی ولی کارش را میدانی؟
در توضیح یکخطی همهی صفحهها جستجو میکند.
type -a echo چه نشان میدهد؟
shell اول builtin را اجرا میکند.
flag مرتبسازی ls بر اساس حجم؟
-t بر اساس زمان؛ -r معکوس؛ -a شامل فایلهای مخفی.
جمعبندی
Section titled “جمعبندی”- ترتیب کمک:
type(چیست؟) ←CMD --help(خلاصه) ←man CMD(کامل) ←apropos(اسم را نمیدانم). - در man با
/عبارتجستجو کن، باnبعدی، باqخروج؛ SYNOPSIS را بخوان:[ ]اختیاری،...تکرار. - بخشهای man: ۱ دستورهای کاربر، ۳ توابع C، ۵ فرمت فایلها، ۸ مدیریت سیستم؛
man 3 printf. - دستور داخلی shell (
cd) باhelpراهنما میدهد؛typeنوع دستور وwhichمسیر برنامه را نشان میدهد. tldrخلاصهی با مثال میدهد ولی نصب و اینترنت میخواهد؛manهمیشه همراه سیستم است (در ماشینهای کمحجم ممکن است حذف شده باشد).- پیام خطای دستور اغلب خودش
--helpرا پیشنهاد میکند؛ بخوانش.
| دستور | کاری که میکند |
|---|---|
man ls | راهنمای کامل ls |
man 5 passwd | صفحهی بخش ۵ (فرمت فایل) |
ls --help | خلاصهی گزینهها |
help cd | راهنمای دستور داخلی shell |
type -a echo | همهی معنیهای یک اسم |
which python3 | مسیر برنامه |
whereis ls | برنامه و راهنما |
apropos "copy files" | جستجو در توضیحها |
man -f ls / whatis ls | توضیح یکخطی |
man -w ls | مسیر فایل راهنما |