FutureForgeFutureForge

خدمات FutureForge

  • طراحی و ساخت محصولاز شناخت نیاز تا انتشار محصول، یک مسیر روشن پیش رو دارید.
  • توسعه فول‌استکوب‌اپلیکیشن، API و داده را هماهنگ و یکپارچه توسعه دهید.
  • ممیزی مهندسیپیش از هزینه‌ی بیشتر، از وضعیت واقعی محصول‌تان باخبر شوید.
  • مشاوره معماریپیش از یک تصمیم فنی پرهزینه، گزینه‌ها را درست بسنجید.
  • زیرساخت و استقرارمحصول را با خیال راحت منتشر کنید و پایدار نگه دارید.
  • هوش مصنوعی در محصولهوش مصنوعی را فقط جایی به کار می‌گیریم که مسئله‌ای را حل کند.
نمونه‌کارهایادداشت‌هاقیمت‌گذاریدرباره ما
شروع گفتگو
  1. خانه
  2. /یادداشت‌ها
  3. /یادداشت‌ها
FutureForge

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

خدمات

طراحی سایت با وردپرستوسعه اختصاصیمهندسی محصولزیرساخت و استقرارمشاوره معماریهوش مصنوعی در محصول

راهنمای انتخاب

یادداشت‌هاقیمت‌گذاریتخمین هزینه پروژهمقایسه روش‌هانمونه‌کارهادرباره ماتماس

ارتباط

hello@futureforge.ir

ایده‌ای برای ساخت دارید؟

نیازتان را مطرح کنید تا درباره مسیر توسعه و قدم بعدی صحبت کنیم.

شروع گفتگو

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

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

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

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

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

یک 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 است. روی طراحی محصول، معماری و استقرار نرم‌افزار سفارشی کار می‌کند.

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

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

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

خدمات مرتبط

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

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

برای انتخاب مسیر فنی پروژه‌تان کمک می‌خواهید؟

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

سهیل ابراهیم‌پور
یادداشت‌ها
امنیت n8n: اعتبارنامه، وب‌هوک و SSRF
نصب n8n روی سرور با Docker Compose
n8n چیست و چگونه کار می‌کند؟
امنیت فروشگاه اینترنتی: سایت، درگاه و فرایند عملیاتی
بازیابی سرور لینوکس بعد از خرابی دیسک یا استقرار اشتباه

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

امنیت n8n: اعتبارنامه، وب‌هوک و SSRF

۹ آبان ۱۴۰۵

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

نصب n8n روی سرور با Docker Compose

۸ آبان ۱۴۰۵

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

n8n چیست و چگونه کار می‌کند؟

۸ آبان ۱۴۰۵

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

امنیت فروشگاه اینترنتی: سایت، درگاه و فرایند عملیاتی

۶ آبان ۱۴۰۵

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

بازیابی سرور لینوکس بعد از خرابی دیسک یا استقرار اشتباه

۲ آبان ۱۴۰۵
همه یادداشت‌ها315
معماری نرم‌افزار31
واژه‌نامه37
عملیات و استقرار94
مهندسی محصول122
راهنمای وب31
طراحی و ساخت محصول
توسعه فول‌استک
ممیزی مهندسی
مشاوره معماری
زیرساخت و استقرار
شروع گفتگو
ابزارهای رایگان
شروع گفتگو