رفتن به محتوا
LoopX

کمک گرفتن از خود لینوکس

توی این درس یاد می‌گیری وقتی یک دستور را نمی‌شناسی یا یادت رفته چه flag ای داشت، بدون هیچ سایتی جوابش را از خود لینوکس بگیری. صفحه‌های man (man ls) را باز و بخش SYNOPSIS را بخوانی، با --help خلاصه‌ی سریع بگیری، برای دستورهای داخلی shell از help استفاده کنی، با type و which بفهمی یک دستور چیست و کجاست، و با apropos دستوری را که اسمش را نمی‌دانی پیدا کنی. با tldr هم آشنا می‌شوی. تمرین: flag ای از ls پیدا می‌کنی که فایل‌ها را بر اساس حجم مرتب کند.

مسئله: صدها دستور، هیچ‌کس همه‌شان را حفظ نیست

Section titled “مسئله: صدها دستور، هیچ‌کس همه‌شان را حفظ نیست”

لینوکس هزاران دستور و flag دارد. حتی متخصص‌ها flag های دستورها را حفظ نیستند؛ فقط بلدند کجا نگاه کنند. کسی که این مهارت را دارد، روی هر سروری (حتی بدون اینترنت) کار می‌کند، چون راهنما همراه خود سیستم است.

تشبیه: کتابچه‌ی راهنمای داخل جعبه

Section titled “تشبیه: کتابچه‌ی راهنمای داخل جعبه”

هر وسیله‌ی برقی کتابچه‌ی راهنما همراه جعبه دارد. لینوکس هم همین‌طور: man کتابچه‌ی کامل است، --help برگه‌ی خلاصه‌ی روی جعبه، type برچسب «این چیست و کجا ساخته شده» و apropos فهرست راهنما برای وقتی که اسم وسیله را نمی‌دانی.

از سریع‌ترین و کم‌حجم‌ترین شروع کن و فقط در صورت نیاز سراغ کامل‌ترین برو.

مثال ۱: man، راهنمای کامل

Section titled “مثال ۱: man، راهنمای کامل”

man (مخفف manual) صفحه‌ی راهنمای یک دستور را باز می‌کند. در ترمینال واقعی این صفحه در برنامه‌ی less باز می‌شود و با کلیدها حرکت می‌کنی؛ اینجا برای نمایش، بالای صفحه را چاپ می‌کنم (col -b فقط علامت‌های ضخیم‌کننده را حذف می‌کند و در ترمینال خودت لازم نیست):

Terminal window
man ls | col -b | head -22
خروجی
LS(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 یک نقشه‌ی فشرده است: ls [OPTION]... [FILE].... قراردادهایش:

نماد معنی
[ ... ] اختیاری است
... می‌تواند تکرار شود (چند تا)
A | B یکی از دو
حروف بزرگ (FILE) جای‌نگهدار؛ خودت مقدار می‌گذاری
<...> الزامی (در بعضی صفحه‌ها)

پس ls [OPTION]... [FILE]... یعنی: ls، هر چند option (اختیاری)، هر چند فایل یا پوشه (اختیاری). برای دستورهای دیگر هم همین‌طور بخوان؛ مثلاً cp:

Terminal window
man cp | col -b | sed -n '/^SYNOPSIS/,/^DESCRIPTION/p' | head -8
خروجی
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
DESCRIPTION

cp [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 می‌زنی):

Terminal window
man ls | col -b | grep -n -i "sort by file size"
خروجی
152: -S sort by file size, largest first

خط شماره‌ی بالا همان جایی است که -S توضیح داده شده است. پس flag ای که فایل‌ها را بر اساس حجم مرتب می‌کند -S است. امتحانش می‌کنیم:

Terminal window
mkdir -p t && cd t
head -c 100 /dev/zero > a_small.txt
head -c 5000 /dev/zero > b_big.txt
head -c 800 /dev/zero > c_medium.txt
echo "--- ترتیب پیش‌فرض (الفبایی):"
ls -l | awk 'NR>1{print $5, $9}'
echo "--- با -S (بزرگ‌ترین اول):"
ls -lS | awk 'NR>1{print $5, $9}'
خروجی
--- ترتیب پیش‌فرض (الفبایی):
100 a_small.txt
5000 b_big.txt
800 c_medium.txt
--- با -S (بزرگ‌ترین اول):
5000 b_big.txt
800 c_medium.txt
100 a_small.txt

مثال ۴: --help، خلاصه‌ی سریع

Section titled “مثال ۴: --help، خلاصه‌ی سریع”

بیشتر دستورهای GNU گزینه‌ی --help دارند که یک خلاصه‌ی کوتاه‌تر از man می‌دهد، مناسب وقتی فقط flag را می‌خواهی یادآوری کنی:

Terminal window
ls --help | head -12
خروجی
Usage: 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 شروع می‌شود»):

Terminal window
ls --help | grep -E "^ +-S "
خروجی
-S sort by file size, largest first

اگر flag را اشتباه بزنی، خود دستور راهنمایی می‌کند:

Terminal window
ls -z 2>&1
خروجی
ls: invalid option -- 'z'
Try 'ls --help' for more information.

پیام خطا می‌گوید «-z وجود ندارد» و راه را نشان می‌دهد: Try 'ls --help'. خطاها را بخوان؛ پر از سرنخ‌اند.

مثال ۵: دستورهای داخلی shell، help

Section titled “مثال ۵: دستورهای داخلی shell، help”

بعضی دستورها (مثل cd) برنامه‌ی جدا نیستند و جزو خود shell‌اند (درس قبل: builtin). برای آن‌ها man معمولاً چیزی ندارد و باید از help استفاده کنی:

Terminal window
whatis cd 2>&1 | head -2
echo "--- help cd:"
help cd | head -8
خروجی
cd: 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 کدام راهنما را باید بزنی؟

مثال ۶: type و which، این دستور چیست و کجاست؟

Section titled “مثال ۶: type و which، این دستور چیست و کجاست؟”

type می‌گوید shell با آن اسم چه می‌کند؛ which فقط مسیر برنامه را نشان می‌دهد:

Terminal window
hash -r
type cd
type ls
type -a echo
which python3
which -a python3
command -v ls cd
خروجی
cd is a shell builtin
ls is /usr/bin/ls
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
/usr/bin/python3
/usr/bin/python3
/bin/python3
/usr/bin/ls
cd

cd یک builtin است، ls یک فایل برنامه در /usr/bin/ls. echo هم builtin است هم برنامه‌ی جدا (type -a همه‌ی نسخه‌ها را نشان می‌دهد؛ shell اول builtin را اجرا می‌کند). وقتی چند نسخه از یک دستور داری (مثلاً دو پایتون)، which -a به تو می‌گوید کدام اول پیدا می‌شود (ترتیب $PATH، درس متغیرهای محیطی). command -v در اسکریپت‌ها برای «آیا این دستور هست؟» استاندارد است. (اگر قبلاً ls را اجرا کرده باشی، type ls می‌گوید hashed: shell مسیر برنامه‌هایی را که یک بار پیدا کرده در یک جدول به‌خاطر می‌سپارد تا دفعه‌ی بعد جستجو نکند؛ hash -r آن جدول را خالی می‌کند.)

برای پیدا کردن برنامه و راهنمایش با هم:

Terminal window
whereis ls
خروجی
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

مثال ۷: apropos، اسم دستور را نمی‌دانم

Section titled “مثال ۷: apropos، اسم دستور را نمی‌دانم”

وقتی می‌دانی چه کاری می‌خواهی ولی اسم دستور را نه، apropos (یا man -k) در توضیح یک‌خطی همه‌ی صفحه‌ها جستجو می‌کند:

Terminal window
apropos "copy files"
echo "--- فقط بخش ۱ (دستورهای کاربر):"
apropos -s 1 copy | head -5
خروجی
cp (1) - copy files and directories
install (1) - copy files and set attributes
--- فقط بخش ۱ (دستورهای کاربر):
aarch64-linux-gnu-objcopy (1) - copy and translate object files
cp (1) - copy files and directories
dd (1) - convert and copy a file
install (1) - copy files and set attributes
objcopy (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)

گاهی یک اسم در چند بخش هست. با شماره مشخص می‌کنی:

Terminal window
man -f printf
echo "--- بخش 1 (دستور شل):"
man 1 printf | col -b | head -1
echo "--- بخش 3 (تابع C):"
man 3 printf | col -b | head -1
خروجی
printf (1) - format and print data
printf (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 tldr
tldr tar
ظاهر خروجی (نمونه)
tar
Archiving utility.
- Create an archive from files:
tar cf target.tar file1 file2 file3
...

اگر tldr در دسترس نبود، راه برگشت همیشه همین man و --help و جستجو با / است. برای همین اول آن‌ها را یاد گرفتیم.

مثال ۹: نسخه و سازنده‌ی دستور

Section titled “مثال ۹: نسخه و سازنده‌ی دستور”
Terminal window
ls --version | head -1
man --version
bash --version | head -1
خروجی
ls (GNU coreutils) 9.4
man 2.12.0
GNU 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 مسیر واقعی را می‌دهد:

Terminal window
man -w ls
man -w passwd
man -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». در ماشین عادی نصب هستند.

دستور کار نمونه
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

۱) man برای دستور داخلی shell

Section titled “۱) man برای دستور داخلی shell”
Terminal window
man cd 2>&1 | head -2
خروجی
No manual entry for cd

cd برنامه نیست و صفحه‌ی مستقلی ندارد؛ پیام «No manual entry» می‌گیری. راه‌حل: help cd.

۲) صفحه‌ی اشتباه در بخش اشتباه

Section titled “۲) صفحه‌ی اشتباه در بخش اشتباه”

man printf بخش ۱ (دستور) را باز می‌کند، نه تابع C. اگر تابع C (بخش ۳) را می‌خواهی، man 3 printf. راه‌حل: اگر صفحه چیزی نبود که انتظار داشتی، بخش را مشخص کن.

۳) فکر کردن «اگر man نیست، دستور نیست»

Section titled “۳) فکر کردن «اگر man نیست، دستور نیست»”
Terminal window
man -k "no-such-thing-xyz" 2>&1 | head -2
خروجی
no-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”
Terminal window
which cd; echo "کد خروج: $?"
خروجی
کد خروج: 1

which cd چیزی چاپ نمی‌کند و کد خروج غیرصفر می‌دهد، چون cd فایلی ندارد. راه‌حل: type cd.

✎ تمرینآسان

با type بفهم echo، ls و cd هر کدام چه هستند.

دیدن جواب
Terminal window
type echo ls cd
خروجی
echo is a shell builtin
ls is /usr/bin/ls
cd is a shell builtin
✎ تمرینمتوسط

تمرین اصلی: flag ای از ls پیدا کن که فایل‌ها را بر اساس حجم مرتب کند. فقط با man یا --help (نه اینترنت) پیدایش کن، سه فایل با حجم متفاوت بساز و نشان بده ترتیب درست است.

دیدن جواب
Terminal window
ls --help | grep -i "sort by file size"
mkdir -p ex && cd ex
head -c 10 /dev/zero > a.txt; head -c 3000 /dev/zero > b.txt; head -c 500 /dev/zero > c.txt
ls -lS | awk 'NR>1{print $5, $9}'
خروجی
-S sort by file size, largest first
3000 b.txt
500 c.txt
10 a.txt

flag همان -S است؛ بزرگ‌ترین فایل (b.txt) اول می‌آید. برای معکوس: ls -lSr.

✎ تمرینسخت

یک تابع shell بنویس به اسم opt که اسم دستور و یک flag بگیرد و توضیح همان flag را از صفحه‌ی man چاپ کند (مثلاً opt ls -S). روی ls -S و ls -h و cp -a امتحانش کن.

دیدن جواب
Terminal window
opt() { man "$1" | col -b | grep -A2 -E "^ +$2[ ,]" | head -4; }
opt ls -S
echo "---"; opt ls -h
echo "---"; 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 شروع می‌شود و دو خط بعدش را هم نشان می‌دهد.

؟ آزمونک
  1. در man ls، با کلید / چه می‌کنی؟

  2. SYNOPSIS: cp [OPTION]... SOURCE DEST. [OPTION]... یعنی…

  3. راهنمای دستور داخلی cd را از کجا می‌گیری؟

  4. اگر اسم دستور را نمی‌دانی ولی کارش را می‌دانی؟

  5. type -a echo چه نشان می‌دهد؟

  6. flag مرتب‌سازی ls بر اساس حجم؟

  • ترتیب کمک: 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مسیر فایل راهنما