bashrc و profile: کجا تنظیمات شل را دائمی کنیم؟
login در برابر interactive، نقش ~/.bashrc و ~/.profile و /etc/profile، و جای درست export PATH و alias.
بنیانگذار و مهندس محصول

یک export در ترمینال تا بستن جلسه زنده است. برای ماندگاری باید بدانید کدام فایل هنگام شروع شل خوانده میشود — و این به نوع شل بستگی دارد: login یا non-login، interactive یا غیرتعاملی. همین جزئیات علت «در SSH دیدم ولی در اسکریپت نه» است.
این مقاله روی bash تمرکز دارد چون هنوز پیشفرض بسیاری سرورهاست؛ zsh فایلهای خودش را دارد ولی ایدهٔ جداسازی محیط login و تنظیمات تعاملی مشابه است.

پاسخ کوتاه
برای alias، تابع، و تنظیمات تعاملی روزمره: معمولاً `~/.bashrc`. برای متغیر محیطی و PATH که باید در ورود به سیستم تنظیم شوند: زنجیرهٔ profile مثل `~/.profile` یا `~/.bash_profile` که اغلب در انتها bashrc را هم صدا میزند. فایلهای `/etc/profile` و `/etc/bash.bashrc` سطح سیستماند. اسکریپتهای غیرتعاملی و cron معمولاً این فایلها را نمیخوانند — به آنها اعتماد نکنید.
اول بپرسید این شل login است یا فقط interactive؛ بعد فایل را انتخاب کنید.
مدل ذهنی چهار حالت
| حالت | نمونه | فایلهای رایج bash |
|---|---|---|
| Login + interactive | ssh به سرور، login console | /etc/profile سپس ~/.bash_profile یا ~/.bash_login یا ~/.profile |
| Non-login + interactive | باز کردن ترمینال داخل دسکتاپ، bash جدید | /etc/bash.bashrc سپس ~/.bashrc (بسته به توزیع) |
| Non-interactive | اسکریپت، cron | معمولاً startup کاربر خوانده نمیشود مگر صریح |
| bash -c / اسکریپت | اتوماسیون | محیط ارثی پدر؛ نه bashrc بهطور پیشفرض |
دیدن اینکه چه چیزی لود شده
bash
echo "shell=$0" shopt login_shell 2>/dev/null || true echo "interactive? $-" # اگر i در $- باشد غالباً interactive است
برای آزمایش کنترلشده:
bash
bash -l # login bash -i # interactive bash --noprofile --norc
~/.bashrc چه چیزی بگذارد؟
- aliasهای تعاملی (`alias ll='ls -alF'`).
- تنظیمات prompt و تاریخچه.
- توابع کمکی ترمینال.
- گاهی PATH کاربر — اگر مطمئنید این فایل همیشه برای کار شما لود میشود.
bash
# نمونهٔ بیخطر در ~/.bashrc alias ll='ls -alF' export HISTCONTROL=ignoredups
profile و bash_profile
اگر `~/.bash_profile` وجود داشته باشد، bash login معمولاً همان را ترجیح میدهد و ممکن است `~/.profile` را نخواند. بسیاری سیستمها bash_profile را طوری مینویسند که bashrc را source کند:
bash
# الگوی رایج داخل ~/.bash_profile if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi export PATH="$HOME/.local/bin:$PATH"
قبل از ساختن فایل جدید، ببینید توزیعتان چه اسکلتی گذاشته تا قرارداد را نشکنید.
/etc در برابر خانهٔ کاربر
bash
ls /etc/profile /etc/bash.bashrc /etc/profile.d 2>/dev/null ls -la ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
تغییر /etc روی همهٔ کاربران اثر میگذارد و در بهروزرسانی باید با دقت merge شود. برای ماشین شخصی، خانهٔ کاربر کافی است؛ برای سیاست سازمانی، /etc/profile.d/*.sh ماژولارتر است.
source و اعمال بدون خروج
bash
source ~/.bashrc . ~/.profile
بعد از ویرایش، یا ترمینال جدید باز کنید یا source کنید. اشتباه رایج: ویرایش فایل و انتظار اثر روی شلهای از قبل باز بدون reload.
چه چیزی در bashrc نگذارید؟
- فرمانهای سنگین شبکه یا چیزهایی که خروجی به اسکریپتهای ناخواسته میریزند.
- فرض اینکه هر bashی interactive است بدون نگهبان.
bash
# نگهبان رایج بالای ~/.bashrc case $- in *i*) ;; *) return ;; esac
این جلوی اثر جانبی وقتی bashrc از مسیر غیرتعاملی source میشود را میگیرد.
ارتباط با PATH و محیط
اگر PATH را فقط در bashrc بگذارید و ابزار GUI یا cron آن را نخواند، «فرمان نیست». برای متغیرهایی که باید وسیعتر دیده شوند، profile یا محیط سرویس مناسبتر است.
zsh و دیگران (کوتاه)
zsh معمولاً `.zshrc` برای تعاملی و `.zprofile` برای login دارد. اگر تیم مختلط bash/zsh دارید، تنظیمات مشترک را در اسکریپت جدا بگذارید و از هر دو source کنید تا دوبارهکاری کم شود.
اشتباههای رایج
- ساخت ~/.bash_profile خالی بدون source کردن bashrc و از دست دادن aliasها در ssh.
- گذاشتن secret در این فایلها و commit کردن نقطهفایلها به ریپو.
- ویرایش فقط /etc و فراموش کاربران که override میکنند.
- اتکا به bashrc برای cron.
الگوی پیشنهادی عملی
- alias و prompt → ~/.bashrc با نگهبان interactive.
- PATH کاربر و متغیرهای login → ~/.profile یا bash_profile که bashrc را صدا میزند.
- سیاست همهٔ کاربران → /etc/profile.d/myorg.sh.
- سرویسها → Environment فایل systemd نه bashrc.
عیبیابی «تنظیماتم اعمال نمیشود»
bash
whoami echo $SHELL ps -p $$ grep -n 'PATH\|alias' ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
مطمئن شوید شل واقعی bash است (`echo $SHELL` و ورود پیشفرض). اگر fish/zsh پیشفرض است، فایل bash خوانده نمیشود.
مدیریت نقطهفایلها با کنترل نسخه
بسیاری توسعهدهندگان dotfiles را در گیت نگه میدارند. جدا کردن بخش دارای secret از بخش عمومی ضروری است؛ از submodule یا فایل local غیرcommit برای توکن استفاده کنید. هرگز کلید خصوصی را در ریپوی نقطهفایل عمومی نگذارید.
ترتیب بهروزرسانی توزیع
وقتی توزیع اسکلت bashrc را عوض میکند، ممکن است فایل `.bashrc.dpkg-new` ببینید. تغییرات خود را merge کنید؛ نادیده گرفتن اسکلت جدید گاهی باعث از دست دادن اصلاحات امنیتی یا قابلیتهای جدید میشود.
تست با کاربر خام
bash
sudo useradd -m -s /bin/bash dottest 2>/dev/null || true sudo -u dottest -i bash -lc 'echo HOME=$HOME; type ll; echo PATH=$PATH'
آزمایش با کاربر تمیز نشان میدهد تنظیمات سیستمسطح کافیاند یا نه — قبل از اعمال گسترده روی همه.
جداسازی ماشین کاری و شخصی
اگر روی یک حساب هم کار شرکتی هم آزمایش شخصی میکنید، با شرط روی hostname یا وجود فایل marker، بلوکهای مختلف را source کنید تا alias خطرناک روی سرور production نرود.
bash
if [ -f "$HOME/.bashrc.work" ]; then # shellcheck source=/dev/null . "$HOME/.bashrc.work" fi
این الگو پیچیدگی دارد؛ فقط وقتی واقعاً دو زمینه دارید استفاده کنید. سادهسازی حسابهای جدا اغلب امنتر است.
خلاصه
bashrc خانهٔ تنظیمات تعاملی است؛ profile زنجیرهٔ ورود و محیط اولیه. نوع شل را بشناسید، از اسکلت توزیع پیروی کنید، با source اعمال کنید، و برای cron/systemd به این فایلها دل نبندید. فایلهای راهاندازی را ساده و بدون اثر جانبی سنگین نگه دارید.
سوالات متداول
آیا باید هم bash_profile هم profile داشته باشم؟
ترجیحاً یکی را منبع حقیقت کنید و از دیگری به آن لینک/source بزنید تا دو مسیر واگرا نشوند.
چرا روی دسکتاپ Ubuntu ترمینال bashrc را میخواند ولی ssh انگار profile؟
چون یکی غالباً non-login interactive و دیگری login است. اسکلت اوبونتو معمولاً این را طوری به هم وصل میکند که هر دو به bashrc برسند — ولی اگر فایلها را دستکاری کرده باشید ممکن است زنجیره قطع شود.
میتوانم همه چیز را فقط در bashrc بگذارم؟
برای کاربر تکی اغلب کار میکند اگر login همیشه bashrc را source کند؛ با این حال فهم مدل درست جلوی سورپرایز را میگیرد.
منابع و مراجع
- Bash Reference Manual — Bash Startup Files: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
- bash(1) INVOCATION section: https://man7.org/linux/man-pages/man1/bash.1.html
- Debian/Ubuntu shell startup documentation (system bashrc/profile): https://wiki.debian.org/Bash
نویسنده
سهیل ابراهیمپور بنیانگذار FutureForge است. روی طراحی محصول، معماری و استقرار نرمافزار سفارشی کار میکند.
یادداشتهای مرتبط
اگر در انتخاب معماری یا مسیر توسعه مطمئن نیستید، میتوانید درباره پروژه صحبت کنیم.
مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ میکنیم.




