CodeShot

اجرا در Subshell (./script.sh) در مقابل Source کردن اسکریپت (source یا .)

اجرای اسکریپت با ./script.sh یک پروسه فرزند (Subshell) جدید می‌سازد که متغیرها و cd های داخل آن بعد از پایان اسکریپت از بین می‌روند، در حالی که source script.sh یا . script.sh اسکریپت را در همان شل فعلی اجرا می‌کند و هر تغییری در متغیرها، alias یا دایرکتوری جاری در شل فعلی باقی می‌ماند.

ویژگیاجرا در Subshell (./script.sh)Source کردن اسکریپت (source یا .)
پروسه اجراSubshell جدیدهمان شل فعلی
ماندگاری متغیرها بعد از اجراندارددارد
نیاز به Execute Permissionبله (chmod +x)خیر

کِی از اجرا در Subshell (./script.sh) استفاده کنیم؟

وقتی می‌خواهید اسکریپت مستقل و ایزوله اجرا شود و تغییراتش روی محیط شل فعلی تأثیری نگذارد.

کِی از Source کردن اسکریپت (source یا .) استفاده کنیم؟

وقتی می‌خواهید اسکریپت متغیرهای محیطی تنظیم کند یا فایل تنظیمات (مثل .bashrc یا یک فایل env) را در شل فعلی بارگذاری کند.

مثال اجرا در Subshell (./script.sh)

#!/bin/bash
# در subshell اجرا می‌شود
cd /tmp
export MY_VAR=42

مثال Source کردن اسکریپت (source یا .)

# source کردن: تغییرات در شل فعلی می‌ماند
source ./setenv.sh
echo $MY_VAR   # همچنان در دسترس است

اشتباه رایج

اشتباه رایج تلاش برای تغییر دایرکتوری فعلی شل با اجرای یک اسکریپت به‌صورت ./script.sh است؛ چون اسکریپت در subshell اجرا می‌شود، cd داخل آن هیچ اثری روی ترمینال فعلی کاربر ندارد و فقط source کردن آن جواب می‌دهد.

جمع‌بندی

برای اجرای ایزوله و مستقل از ./script.sh و برای تنظیم متغیرهای محیطی یا تغییر شل فعلی حتماً از source استفاده کنید.