Future ForgeFuture ForgeFuture ForgeFuture Forge
خدماتنمونه‌کارهاپکیج‌هاابزارهای رایگانیادداشت‌هادرباره ماتماس
شروع پروژه
  1. خانه
  2. /یادداشت‌ها
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

خدمات

طراحی و ساخت محصولتوسعه فول‌استکممیزی مهندسیمشاوره معماریزیرساخت و استقرارهوش مصنوعی در محصول

کاوش

نمونه‌کارهایادداشت‌هاپرسش‌هاپکیج‌ها

ابزارهای رایگان

ممیزی مهندسیمشاور معماریتخمین پروژهابزار پرامپت

شرکت

درباره ماتماسحریم خصوصیشرایط استفاده

پروژه‌تان را مطرح کنید

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
GitHubLinkedIn

© 2026 FutureForge. همه حقوق محفوظ است.

خانهخدماتابزارهای رایگانشروع پروژه
عملیات و استقرار

bashrc و profile: کجا تنظیمات شل را دائمی کنیم؟

login در برابر interactive، نقش ~/.bashrc و ~/.profile و /etc/profile، و جای درست export PATH و alias.

سا
سهیل ابراهیم‌پور

بنیان‌گذار و مهندس محصول

·۲۹ شهریور ۱۴۰۵·6 دقیقه مطالعه
bashrc profilebash_profilelogin shellinteractive shell/etc/profilealias
استیکی .bashrc و .profile کنار لامپ

یک export در ترمینال تا بستن جلسه زنده است. برای ماندگاری باید بدانید کدام فایل هنگام شروع شل خوانده می‌شود — و این به نوع شل بستگی دارد: login یا non-login، interactive یا غیرتعاملی. همین جزئیات علت «در SSH دیدم ولی در اسکریپت نه» است.

این مقاله روی bash تمرکز دارد چون هنوز پیش‌فرض بسیاری سرورهاست؛ zsh فایل‌های خودش را دارد ولی ایدهٔ جداسازی محیط login و تنظیمات تعاملی مشابه است.

Login shell در برابر Interactive shell

پاسخ کوتاه

برای alias، تابع، و تنظیمات تعاملی روزمره: معمولاً `~/.bashrc`. برای متغیر محیطی و PATH که باید در ورود به سیستم تنظیم شوند: زنجیرهٔ profile مثل `~/.profile` یا `~/.bash_profile` که اغلب در انتها bashrc را هم صدا می‌زند. فایل‌های `/etc/profile` و `/etc/bash.bashrc` سطح سیستم‌اند. اسکریپت‌های غیرتعاملی و cron معمولاً این فایل‌ها را نمی‌خوانند — به آن‌ها اعتماد نکنید.

اول بپرسید این شل login است یا فقط interactive؛ بعد فایل را انتخاب کنید.

مدل ذهنی چهار حالت

حالتنمونهفایل‌های رایج bash
Login + interactivessh به سرور، 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.

الگوی پیشنهادی عملی

  1. alias و prompt → ~/.bashrc با نگهبان interactive.
  2. PATH کاربر و متغیرهای login → ~/.profile یا bash_profile که bashrc را صدا می‌زند.
  3. سیاست همهٔ کاربران → /etc/profile.d/myorg.sh.
  4. سرویس‌ها → 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 است. روی طراحی محصول، معماری و استقرار نرم‌افزار سفارشی کار می‌کند.

یادداشت‌های مرتبط

یادداشت‌های مرتبط

دسته‌بندی‌ها

خدمات مرتبط

از یادداشت تا پروژه

اگر موضوع این مقاله به سیستم یا محصول شما نزدیک است، می‌توانیم درباره دامنه واقعی صحبت کنیم.

اگر در انتخاب معماری یا مسیر توسعه مطمئن نیستید، می‌توانید درباره پروژه صحبت کنیم.

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

سهیل ابراهیم‌پور
یادداشت‌ها
شِل چیست؟ تفاوت bash و zsh در لینوکس
Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه
تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload
Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار
چرا همیشه به Kubernetes نیاز ندارید؟

عملیات و استقرار

شِل چیست؟ تفاوت bash و zsh در لینوکس

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

چرا همیشه به Kubernetes نیاز ندارید؟

۲۹ شهریور ۱۴۰۵
همه یادداشت‌ها219
معماری نرم‌افزار13
واژه‌نامه37
عملیات و استقرار87
مهندسی محصول74
راهنمای وب8
طراحی و ساخت محصول
توسعه فول‌استک
ممیزی مهندسی
مشاوره معماری
زیرساخت و استقرار
پروژه‌تان را مطرح کنید
ابزارهای رایگان
پروژه‌تان را مطرح کنید