اصلیترین دلیلی که افراد این سه واژه را به جای یکدیگر به کار میبرند، ادغام بصری آنها در سیستمعاملهای امروزی است. با این حال، معمار سیستم این سه را در سه لایه مستقل و مجزا قرار داده است:
┌─────────────────────────────────────────────────────────┐
│ کاربر (User) │
│ ورودی تایپ میکند، خروجی را میبیند │
└─────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ ترمینال (Terminal Emulator) │
│ یک پنجره گرافیکی یا رابط متنی. │
│ تنها وظیفه: دریافت کلیدها، نمایش کاراکترها. │
│ نمونهها: GNOME Terminal, iTerm2, Windows Terminal │
│ هیچ درکی از دستورات، فایلها یا سیستمعامل ندارد. │
└─────────────────────┬───────────────────────────────────┘
│ کاراکترهای خام (Raw Characters)
▼
┌─────────────────────────────────────────────────────────┐
│ شِل (Shell / Command Interpreter) │
│ برنامهای که دستورات را تجزیه، تفسیر و اجرا میکند. │
│ وظیفه: درک متون تایپشده، اجرای برنامهها، مدیریت │
│ پردازشها، اسکریپتها، خطوط لوله (Pipelines). │
│ نمونهها: sh, Bash, Zsh, Fish, dash, ksh, PowerShell │
│ هیچ درکی از فونت، ابعاد پنجره یا تبهای گرافیکی ندارد. │
└─────────────────────┬───────────────────────────────────┘
│ فراخوانهای سیستم (System Calls)
▼
┌─────────────────────────────────────────────────────────┐
│ کرنل (Kernel / هسته) │
│ Linux, macOS XNU, Windows NT Kernel │
│ مدیریت سختافزار، حافظه، پردازشها و سیستمفایلها. │
└─────────────────────────────────────────────────────────┘
قانون تغییرناپذیر: ترمینال هرگز یک دستور را تفسیر نمیکند. شل هرگز حتی یک پیکسل روی صفحه نمایش رسم نمیکند. جملهی «ترمینال دستور را اجرا کرد» از نظر فنی نادرست است؛ شل دستور را اجرا کرد و ترمینال فقط خروجی را به شما نشان داد.
شما میتوانید شلِ درون یک ترمینال را بدون تغییر پنجره ترمینال عوض کنید:
# مشاهده شل فعلی (مثلاً Bash)
echo $0
# خروجی: bash
# سویچ به شل Zsh در همان پنجره ترمینال
zsh
echo $0
# خروجی: zsh
# سویچ به شل dash در همان پنجره ترمینال
dash
echo $0
# خروجی: dash
پنجره ترمینال تغییری نکرد، اما شل ۳ بار عوض شد.
عکس این موضوع نیز صادق است: میتوانید یک شل یکسان (مثلاً Bash) را در شبیهسازهای ترمینال مختلف مثل xterm ،GNOME Terminal یا Konsole اجرا کنید.
Bash (مخفف Bourne Again Shell) تنها یکی از پیادهسازیهای لایه شل است. Bash هیچ کنترلی روی ظاهر پنجره، فونت یا تبها ندارد.
SHELL (رده عمومی)
│
┌─────────────────────┼─────────────────────┐
│ │ │
Bourne family C Shell family Modern / Niche
│ │ │
┌─────┼─────┐ ┌────┼────┐ ┌────┼────┐
sh bash zsh csh tcsh fish xonsh
│
dash
وقتی دستور ls -la /home را در ترمینال تایپ کرده و Enter میزنید، این فرآیند طی میشود:
[ترمینال]: کلیدهای تایپشده را جمعآوری کرده، روی صفحه نمایش میدهد (Echo) و کاراکتر خط جدید (\n) را اضافه میکند.
[ترمینال ⇐ شل]: رشته "ls -la /home\n" از طریق PTY به شل (مثلاً Bash) ارسال میشود.
[شل]: شروع به تجزیه (Parsing) متن میکند:
تفکیک کلمات: ["ls", "-la", "/home"]
شناسایی ls به عنوان دستور، -la به عنوان 옵션/فلگ، و /home به عنوان آرگومان.
جستجوی مسیر PATH برای یافتن فایل اجرایی /bin/ls.
[شل ⇐ کرنل]: شل دستور fork() و execve("/bin/ls", ["ls", "-la", "/home"], env) را صادر میکند.
[کرنل ⇐ /bin/ls]: کرنل پردازش فرزند را میسازد، برنامه ls را بارگذاری کرده و اجرا میکند.
[/bin/ls ⇐ شل]: خروجی متنی تولیدشده توسط ls در خروجی استاندارد (stdout) نوشته شده و توسط شل دریافت میشود.
[شل ⇐ ترمینال]: شل خروجی متنی را به بافر نمایش ترمینال میفرستد.
[ترمینال]: متن را با استفاده از فونت و رنگ تنظیمشده رندر کرده و نمایش میدهد.
[شل]: پرامپت جدید را چاپ کرده و منتظر ورودی بعدی میماند.
هر دستوری که در شل وارد میکنید از یک الگوی ساختاری دقیق پیروی میکند:
command [options/flags] [arguments]
یا شکل بازشده آن:
command [--option value] [--flag] [-o value] [-f] [argument ...]
اولین کلمهای است که بعد از پرامپت میآید. شل مسیرهای تعریفشده در متغیر PATH را جستجو میکند تا فایل اجرایی مربوط به آن را پیدا کند.
برنامههای خارجی: فایلهای اجرایی روی دیسک (مثل /bin/ls یا /usr/bin/git).
دستورات داخلی (Shell Builtins): دستوراتی که مستقیماً درون خودِ شل برنامهنویسی شدهاند و پردازش جدیدی ایجاد نمیکنند (مثل cd, echo, pwd, type).
# بررسی اینکه آیا یک دستور داخلی است یا یک فایل اجرایی خارجی
type cd
# خروجی: cd is a shell builtin
type ls
# خروجی نمونه: ls is aliased to `ls --color=auto' یا ls is /bin/ls
مودیفایرهایی هستند که رفتار دستور را تغییر میدهند و معمولاً با - (فرم کوتاه) یا -- (فرم بلند) شروع میشوند.
فلگ (Flag): گزینهای دوحالته (Boolean) است که نیازی به مقدار (Value) ندارد؛ وجود آن ویژگی خاصی را فعال یا غیرفعال میکند.
مثال: ls -l (کاراکتر l یک فلگ برای نمایش لیست طویل است).
ترکیب فلگها: ls -l -a -h را میتوان به صورت ترکیبشده ls -lah نوشت.
گزینه (Option): مودیفایری است که به یک مقدار صریح نیاز دارد.
مثال فرم کوتاه: grep -A 2 "error" file.txt (عدد 2 مقدار دادهشده به گزینه -A است).
مثال فرم بلند: git commit --message "Initial commit" (عبارت داخل کوتیشن مقدار گزینه --message است).
ورودی یا هدفی است که دستور روی آن عملیات انجام میدهد (مانند نام فایلها، مسیرها، آدرسهای وب یا رشتههای متنی). آرگومانها معمولاً بعد از گزینه/فلگها میآیند.
cp -r /source/folder /destination/folder
# │ │ └────────────────┬──────────────┘
# │ └─ Flag └─ Arguments (دو آرگومان: مبدا و مقصد)
# └─ Command
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات