شل (Shell) یک برنامه واسط است که دستورات متنی شما را دریافت کرده، آنها را تفسیر میکند و برای اجرا به هسته سیستمعامل (Kernel) میفرستد.
اگر کرنل را «مغز» سیستمعامل در نظر بگیریم، شل زبانی است که با آن میتوانید با این مغز ارتباط برقرار کنید. بدون شل، هیچ راه کاربردی برای دستور دادن به سیستمعامل ندارید — مگر اینکه بخواهید مستقیماً با کرنل صحبت کنید که عملاً غیرممکن و بسیار خطرناک است.
شل پل ارتباطی بین انسان و ماشین است و وظیفه آن صرفاً به اجرای دستورات محدود نمیشود؛ بلکه یک زبان برنامهنویسی کامل با متغیرها، حلقهها، شرطها و توابع است. شما میتوانید در شل اسکریپت بنویسید و تمام جریانهای کاری مدیریت سیستم را خودکار (Automate) کنید.
اجرای برنامهها و ابزارهای سیستم
مدیریت فایلها و دایرکتوریها (ایجاد، کپی، حذف، جابهجایی)
هدایت ورودی/خروجی بین برنامهها (Piping و Redirection)
تعریف و مدیریت متغیرهای محیطی (Environment Variables)
خودکارسازی کارهای تکراری از طریق اسکریپتنویسی
کنترل برنامهها و پردازشها (پیشزمینه، پسزمینه، تعلیق)
وقتی دستوری مانند ls -l /home را تایپ میکنید، شل چرخه زیر را طی میکند:
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ کاربر │────▶│ شل │────▶│ کرنل │
│ (شما) │◀────│ (bash) │◀────│ (لینوکس) │
└──────────┘ └──────────┘ └──────┬───────┘
│
┌──────▼───────┐
│ سختافزار │
│ (CPU, RAM) │
└──────────────┘
🔒 نکته امنیتی حیاتی: کرنل هرگز دستورات را مستقیماً از یک کاربر معمولی نمیپذیرد. تمام دستورات باید از فیلتر شل عبور کنند. این مکانیزم امنیتی بنیادی از دسترسیهای غیرمجاز به منابع سیستم جلوگیری میکند.
برای یافتن برنامهای که نام آن را تایپ کردهاید، شل دایرکتوریهای ذخیرهشده در متغیر محیطی PATH را یکییکی جستجو میکند:
# مشاهده PATH فعلی
echo $PATH
# خروجی نمونه:
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# یافتن مسیر دقیق یک دستور
which ls
# خروجی: /bin/ls
# یا استفاده از type (دقیقتر — نامهای مستعار و توابع را هم نشان میدهد)
type ls
# خروجی: ls is aliased to `ls --color=auto`
شلها به دو خانواده اصلی تقسیم میشوند:
| نام شل | مسیر معمول | توضیحات |
| sh (Bourne Shell) | /bin/sh | جد تمام شلهای مدرن یونیکس؛ ساده و استاندارد شده |
| bash (Bourne Again Shell) | /bin/bash | استاندارد لینوکس؛ سازگار با sh اما بسیار قدرتمندتر |
| dash (Debian Almquist Shell) | /bin/dash | یک پیادهسازی سبک و سریع از sh؛ /bin/sh پیشفرض در دبیان و اوبونتو |
| zsh (Z Shell) | /bin/zsh | قدرتمند با ویژگیهای تعاملی پیشرفته؛ شل پیشفرض مکاواس از نسخه کدام Catalina |
| ksh (Korn Shell) | /bin/ksh | محبوب در سیستمهای یونیکس تجاری (AIX, Solaris) |
| نام شل | توضیحات |
| csh (C Shell) | دارای سینتکسی مشابه زبان برنامهنویسی C |
| tcsh (TENEX C Shell) | نسخه بهبودیافته csh با قابلیت تکمیل خودکار و تاریخچه دستورات |
# مشاهده شل فعلی
echo $SHELL
# خروجی: /bin/bash
# لیست تمام شلهای نصبشده روی سیستم
cat /etc/shells
متنی که قبل از مکاننما (Cursor) در ترمینال میبینید Prompt نام دارد و اطلاعات مفیدی ارائه میدهد:
# پرامپت پیشفرض در باژ (Bash)
user@hostname:~$
# علامت $ یعنی شما یک کاربر معمولی هستید
# علامت # یعنی شما کاربر root هستید (یا با sudo وارد شدهاید)
root@server:/home#
# علامت ~ نشاندهنده دایرکتوری خانگی (Home) کاربر فعلی است
# مسیر کامل مانند /home زمانی نشان داده میشود که از دایرکتوری خانگی خارج شوید
ساختار عمومی تعامل با شل:
# اجرای یک دستور ساده
command
# دستور همراه با گزینه/فلگ (Option / Flag)
command --option
command -o
# دستور همراه با آرگومان (Argument)
command argument
# ترکیب گزینه و آرگومان
command -o argument
command -abc argument # ترکیب فلگهای تکحرفی
# مثال واقعی:
ls -la /var/log # نمایش تمام فایلها به صورت لیست در مسیر /var/log
تفاوت گزینه (Option) و آرگومان (Argument):
گزینه (Option/Flag): رفتار دستور را تغییر میدهد (مثلاً
-lدرlsخروجی را به صورت لیست جزییات نشان میدهد).آرگومان (Argument): متغیری است که دستور روی آن عملیات انجام میدهد (مثلاً مسیر
/var/log).
اگر میخواهید شل خود را از Bash به Zsh تغییر دهید:
# نصب Zsh
sudo apt install zsh -y # در دبیان/اوبونتو
# یا
sudo pacman -S zsh # در آرچ لینوکس
# تغییر شل پیشفرض کاربر
chsh -s /bin/zsh
# پس از خروج و ورود مجدد، شل شما Zsh خواهد بود
# برای بازگشت به Bash:
chsh -s /bin/bash
&& و ||میتوانید اجرای دستور بعدی را مشروط به موفقیت یا شکست دستور قبلی کنید:
# بهروزرسانی سیستم تنها در صورت موفقیتآمیز بودن آپدیت مخازن
sudo apt update && sudo apt upgrade -y
# عملگر && : اگر دستور قبلی موفق بود (کد خروجی 0)، دستور بعدی را اجرا کن.
# تلاش برای ساخت دایرکتوری؛ در صورت عدم موفقیت، نمایش پیام خطا
mkdir /tmp/mydir && cd /tmp/mydir || echo "ساخت یا ورود به دایرکتوری ناموفق بود"
# عملگر || : اگر دستور قبلی با خطا مواجه شد، دستور بعدی را اجرا کن.
# نمایش ۲۰ دستور آخر
history 20
# اجرای مجدد دستور شماره ۴۵۰ از تاریخچه
!450
# اجرای آخرین دستوری که با sudo شروع شده بود
!sudo
# جستجوی تعاملی در تاریخچه
# کلیدهای ترکیبی Ctrl+R را بزنید، سپس عبارت مورد نظر (مثلاً curl) را تایپ کنید
⚠️ نکته امنیتی در مورد تاریخچه: دستورات در فایل
~/.bash_historyذخیره میشوند. اگر دستوری حاوی رمز عبور تایپ کنید (مانندmysql -u root -pMyPassword)، رمز در این فایل باقی میماند! برای جلوگیری از ذخیره شدن، قبل از دستور یک فاصله (Space) بزنید (به شرطی که تنظیماتHISTCONTROL=ignorespaceفعال باشد).
❌ اشتباه رایج ۱: یکسان دانستن
/bin/shو/bin/bash. در بسیاری از توزیعهای مدرن،/bin/shیک لینک نمادین بهdashاست، نهbash. شل Dash سبکتر و سریعتر است اما قابلیتهای تعاملی Bash را ندارد. اسکریپتهایی که با#!/bin/shشروع میشوند باید طبق استاندارد POSIX نوشته شوند.
❌ اشتباه رایج ۲: نادیده گرفتن قابلیت برنامهنویسی شل. شل فقط برای اجرای دستورات منفرد نیست؛ شما میتوانید متغیر تعریف کنید، حلقه و شرط بنویسید و کارهای پیچیده را خودکار کنید.
⚠️ هشدار امنیتی: هرگز اسکریپتهای شل دانلودشده از اینترنت را بدون بررسی کامل اجرا نکنید. اجرای دستوری مانند
curl [https://example.com/script.sh](https://example.com/script.sh) | bashیعنی کدی ناآشنا را با دسترسیهای سیستم خود مستقیماً اجرا کردهاید!
| نوع شل | زمان اجرا | فایلهای پیکربندی خواندهشده |
| Login Shell | ورود از طریق SSH، کنسول مجازی، یا su - | /etc/profile, ~/.profile, ~/.bash_profile |
| Non-Login Shell | باز کردن ترمینال در محیط گرافیکی یا اجرای bash درون شل | ~/.bashrc |
| Interactive | تعاملی (شما تایپ میکنید و پاسخ میگیرید) | تنظیمات پرامپت، نامهای مستعار (Aliases) |
| Non-Interactive | اجرای یک اسکریپت | فقط متغیرهای محیطی |
# بررسی حالت Login بودن شل
echo $0
# اگر خروجی با - شروع شود (مانند -bash)، یعنی Login Shell است.
# خروجی ساده bash یعنی Non-Login Shell است.
نقش شل در یک جمله: مترجم دستورات متنی کاربر به فراخوانهای سیستمی (System Calls) برای هسته (Kernel).
| دستور | کاربرد |
echo $SHELL | نمایش شل پیشفرض کاربر |
echo $0 | نمایش نام شل در حال اجرا |
cat /etc/shells | لیست شلهای مجاز روی سیستم |
chsh -s /bin/zsh | تغییر شل پیشفرض به Zsh |
which command | نمایش مسیر کامل اجرای یک دستور |
type command | تعیین نوع دستور (Alias، تابع، فایل اجرایی) |
history | نمایش تاریخچه دستورات |
Ctrl+R | جستجوی تعاملی در تاریخچه |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات