Bash مفسر خط فرمان و زبان اسکریپتنویسی پیشفرض در اکثر توزیعهای لینوکس و نسخههای قدیمیتر macOS (قبل از Catalina) است. این زبان در سال ۱۹۸۹ توسط برایان فاکس (Brian Fox) برای پروژه GNU توسعه یافت تا جایگزینی آزاد برای Bourne Shell (sh) باشد.
نام آن یک شوخی با کلمات است: Bourne Again اشاره به Stephen Bourne (خالق اصلی sh) دارد و نشاندهنده تولد دوباره sh با امکانات بسیار گستردهتر است.
| ویژگی | توضیحات |
سازگاری با sh | اسکریپتهای نوشتهشده برای sh بدون تغییر در Bash اجرا میشوند. |
| ویرایش تعاملی | امکان ویرایش خط فرمان با میانبرهای Emacs یا vi. |
| کنترل پردازشها (Job Control) | تعلیق، اجرا در پسزمینه و مدیریت پردازشها (bg و fg). |
| تاریخچه هوشمند | ذخیره، جستجو و بازخوانی دستورات قبلی. |
| تکمیل با کلید Tab | تکمیل خودکار دستورات، مسیرها و متغیرها. |
| نام مستعار (Alias) | ساخت میانبر برای دستورات پرکاربرد. |
| آرایهها | پشتیبانی از آرایههای عددی و متناظر (Associative). |
| گسترش آکولد (Brace Expansion) | تولید رشتههای متوالی مانند {1..100}. |
| محاسبات ریاضی | انجام محاسبات عددی مستقیماً درون شل. |
| پرامپت سفارشی | نمایش نام کاربر، مسیر، شاخه Git، کد خروجی و غیره. |
shدر اکثر سیستمهای لینوکسی، /bin/sh خودِ برنامه Bourne Shell اصلی نیست؛ بلکه یک لینک نمادین (Symlink) به Bash (در حالت سازگاری POSIX) یا شلهای سبکی مثل dash است.
# بررسی اینکه /bin/sh به چه برنامهای اشاره میکند
ls -l /bin/sh
# خروجی در اوبونتو: /bin/sh -> dash
# خروجی در فدورا: /bin/sh -> bash
# مشاهده نسخه Bash
bash
echo $BASH_VERSION
# خروجی نمونه: 5.1.16(1)-release
# اجرای Bash در حالت POSIX (شبیهسازی sh)
bash --posix
تفاوت عملی: اسکریپتهایی که با
#!/bin/shشروع میشوند باید فقط از ویژگیهای استاندارد POSIX استفاده کنند و به امکانات اختصاصی Bash (مانند آرایهها،[[ ]]یا کلمه کلیدیsource) دسترسی ندارند. برای استفاده از تمامی قابلیتها حتماً از#!/bin/bashاستفاده کنید.
Bash بر اساس نحوه فراخوانی، فایلهای متفاوتی را میخواند:
ترتیب اجرای فایلها در Login Shell:
/etc/profile → ~/.bash_profile → ~/.bashrc (معمولاً از داخل bash_profile فراخوانی میشود)
ترتیب اجرا در Non-Login Interactive Shell (باز کردن ترمینال معمولی):
~/.bashrc
ترتیب اجرا در Non-Interactive Shell (اجرای اسکریپتها):
فایل موجود در متغیر BASH_ENV را میخواند (در صورت تعریف)
| فایل | هدف | زمان خواندهشدن |
/etc/profile | تنظیمات عمومی سیستم برای همه کاربران | Login shells |
~/.bash_profile | تنظیمات شخصی کاربر هنگام ورود | Login shells |
~/.bashrc | تنظیمات شخصی ترمینال تعاملی | تمام ترمینالهای تعاملی |
~/.bash_logout | دستوراتی که هنگام خروج اجرا میشوند | خروج از Login shell |
~/.inputrc | تنظیمات نحوه ورودی کلیدها (Readline) | همه برنامههای متکی به Readline |
ساختار یک نمونه استاندارد برای ~/.bash_profile:
# ~/.bash_profile
# بارگذاری تنظیمات عمومی سیستم
if [ -f /etc/profile ]; then
. /etc/profile
fi
# بارگذاری bashrc برای ترمینالهای تعاملی
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# متغیرهای محیطی شخصی
export EDITOR=nvim
export PATH="$HOME/bin:$PATH"
| حالت | نحوه فراخوانی | رفتار |
| Interactive Login | SSH، ورود از کنسول یا su - | خواندن /etc/profile و ~/.bash_profile |
| Interactive Non-Login | باز کردن پنجره ترمینال در محیط گرافیکی | خواندن ~/.bashrc |
| Non-Interactive | اجرای اسکریپت (bash script.sh) | خواندن $BASH_ENV در صورت وجود |
| POSIX Mode | bash --posix یا فراخوانی با نام sh | غیرفعال کردن امکانات اختصاصی Bash |
| Restricted Mode | bash -r یا rbash | محدود کردن تغییر دایرکتوری، تغییر PATH و غیره |
# بررسی تعاملی بودن شل فعلی (وجود حرف 'i' یعنی تعاملی است)
echo $-
# خروجی نمونه: himBHs
# بررسی Login بودن شل
shopt login_shell
تولید سریع رشتهها و دنبالهها:
# تولید دنباله اعداد
echo {1..10}
# خروجی: 1 2 3 4 5 6 7 8 9 10
# دنباله اعداد با گام مشخص
echo {0..20..5}
# خروجی: 0 5 10 15 20
# ایجاد ساختار دایرکتوری پیچیده با یک دستور
mkdir -p project/{src,test,doc}/{main,util}
# ایجاد چند فایل همزمان
touch report_{jan,feb,mar}_2026.txt
# پشتیبانگیری سریع از یک فایل
cp config.conf config.conf.{bak,$(date +%Y%m%d)}
# کپی به: config.conf.bak20260725
# تعریف یک Alias
alias ll='ls -alF'
# افزایش امنیت دستورات خطرناک (پرسش قبل از اجرا)
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# مشاهده همه Aliasهای تعریفشده
alias
# حذف یک Alias
unalias ll
!! # اجرای مجدد آخرین دستور
!$ # استفاده از آخرین آرگومان دستور قبل
!* # استفاده از تمام آرگومانهای دستور قبل
!string # اجرای آخرین دستوری که با string شروع شده
Ctrl+R # جستجوی تعاملی در تاریخچه دستورات
# مثال کاربردی:
mkdir /very/long/path/that/is/hard/to/type
cd !$ # به این مسیر تغییر میدهد: cd /very/long/path/that/is/hard/to/type
[[ ]]دستور [[ ]] بسیار امنتر و قدرتمندتر از ساختار قدیمی POSIX یعنی [ ] است:
# مقایسه رشته با الگوی Wildcard
string="hello world"
if [[ $string == hello* ]]; then
echo "با hello شروع میشود"
fi
# بررسی با عبارت باقاعده (Regex)
email="user@example.com"
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "فرمت ایمیل معتبر است"
fi
# ترکیبات منطقی درون شرط
if [[ -f /etc/passwd && -r /etc/passwd ]]; then
echo "فایل وجود دارد و قابل خواندن است"
fi
~/.bashrc حرفهای و کاربردی# ~/.bashrc — نمونه تنظیمات بهینهشده
# خروج در صورت غیرتعاملی بودن
[[ $- != *i* ]] && return
# ─── تنظیمات تاریخچه ───
HISTCONTROL=ignoreboth # عدم ذخیره دستورات تکراری یا دستوراتی که با Space شروع میشوند
HISTIGNORE="ls:ll:cd:pwd:exit:clear:history"
shopt -s histappend # الحاق به تاریخچه بهجای بازنویسی
HISTSIZE=5000
HISTFILESIZE=10000
# ─── Aliasها ───
alias ls='ls --color=auto'
alias ll='ls -alF'
alias grep='grep --color=auto'
alias ..='cd ..'
alias df='df -h'
alias free='free -h'
# ─── پرامپت همراه با شاخه Git ───
parse_git_branch() {
git branch 2>/dev/null | sed -n 's/^\* //p'
}
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '
# ─── توابع کاربردی ───
# استخراج سریع انواع فایلهای آرشیو
extract() {
if [ -f "$1" ]; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.tar.xz) tar xJf "$1" ;;
*.zip) unzip "$1" ;;
*) echo "فرمت ناشناخته: $1" ;;
esac
fi
}
# ساخت دایرکتوری و ورود همزمان به آن
mkcd() { mkdir -p "$1" && cd "$1"; }
# اجرای اسکریپت در حالت دیباگ (نمایش هر دستور قبل از اجرا)
bash -x script.sh
# دیباگ بخش خاصی از اسکریپت درون کد:
#!/bin/bash
set -x # شروع حالت دیباگ
# ... دستورات مورد نظر ...
set +x # پایان حالت دیباگ
# هدر پیشنهادشده برای اسکریپتهای حساس (Strict Mode):
#!/bin/bash -euxo pipefail
# -e: خروج در صورت بروز هرگونه خطا
# -u: خطا در صورت استفاده از متغیرهای تعریفنشده
# -x: چاپ دستورات هنگام اجرا
# -o pipefail: شکست پایپلاین در صورت خطا در هر بخش
# ❌ روش نادرست (در صورت وجود فاصله در نام فایلها شکست میخورد)
for file in $(ls *.txt); do
cat "$file"
done
# ✅ روش درست (پشتیبانی از فاصله و کاراکترهای خاص)
find . -name "*.txt" -print0 | while IFS= read -r -d '' file; do
echo "در حال پردازش: $file"
cat "$file"
done
# ✅ روش جایگزین با استفاده از Globbing
shopt -s nullglob
for file in *.txt; do
[ -f "$file" ] || continue
echo "در حال پردازش: $file"
done
⚠️ نکته کوتیشنها (Quoting): رایجترین خطای اسکریپتنویسی، کوتیشن نگذاشتن دور متغیرهاست (
"$var"). متغیر بدون کوتیشن در صورت داشتن فاصله یا کاراکترهای خاص (مثل*) توسط شل تجزیه و باز میشود که میتواند نتایج غیرمنتظره داشته باشد.
name="*"
echo "$name" # خروجی: *
echo $name # خروجی: لیست تمام فایلهای دایرکتوری فعلی!
💡 کدهای خروجی (Exit Codes): هر دستور یک کد خروجی (
$?) برمیگرداند. مقدار0به معنی اجرای موفقیتآمیز و اعداد1تا255نشاندهنده خطا هستند.
grep "error" /var/log/syslog
if [ $? -eq 0 ]; then
echo "خطا پیدا شد"
fi
🔍 استفاده از ShellCheck: همیشه اسکریپتهای خود را قبل از اجرا با ابزار ShellCheck بررسی کنید تا خطاهای امنیتی، منطقی و عدم رعایت استانداردهای کوتیشنگذاری را شناسایی کند:
sudo apt install shellcheck # نصب در دبیان/اوبونتو
shellcheck myscript.sh # بررسی اسکریپت
| قابلیت | دستور / سینتکس |
| بررسی نسخه | echo $BASH_VERSION |
| محاسبات سریع | echo $(( 5 + 3 * 2 )) |
| حالت دیباگ | bash -x script.sh |
| کد خروجی آخرین دستور | echo $? |
| اجرای مجدد دستور قبل | !! |
| آرگومان پایانی دستور قبل | !$ |
| جستجو در تاریخچه | Ctrl+R |
| فراخوانی فایل پیکربندی | source file یا . file |
[x] تفاوت بین Bash و sh را میدانم.
[x] فایلهای پیکربندی مختلف (.bashrc و .bash_profile) را درک میکنم.
[x] تفاوت حالتهای Login، Interactive و Non-Interactive را میدانم.
[x] همیشه متغیرها را داخل کوتیشن قرار میدهم ("$var").
[x] نحوه دیباگ اسکریپت با set -x و set -e را میدانم.
[x] از میانبرهای تاریخچه مانند Ctrl+R و !$ استفاده میکنم.
[x] اسکریپتها را قبل از انتشار با shellcheck بررسی میکنم.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات