Режимы bash - .bash_profile .bashrc
-
Bash запускается в разных режимах — и от этого зависит какие файлы он читает при старте
4 режима bash
Login shell (интерактивный, с входом)
Как запускается: SSH-сессия без команды,
su - user,bash -lЧитает по порядку:
/etc/profile └── ~/.bash_profile ← первый найденный из трёх: └── ~/.bash_login └── ~/.profileПри выходе читает
~/.bash_logout.# Примеры: ssh user@server # интерактивная ssh-сессия bash -l # явно запустить login shell su - admin # переключиться с login
Interactive shell (интерактивный, без входа)
Как запускается: новое окно терминала, вкладка, просто набрать
bashЧитает:
/etc/bash.bashrc (на Debian/Ubuntu) ~/.bashrc# Примеры: bash # запустить дочерний bash xterm # открыть новый терминал tmux / screen # новое окно
Non-interactive, non-login ← самый частый источник проблем
Как запускается:
ssh user@host "команда", запуск скрипта черезbash script.shЧитает: ничего
# Примеры — ничего не работает: ssh user@host "pm2 restart app" # PATH пустой bash deploy.sh # nvm/fnm недоступны cron jobs # тоже сюда
Non-interactive login shell
Как запускается:
bash -lc "команда",ssh user@host bash -lc "..."Читает:
~/.bash_profile(и цепочку из п.1)# Примеры — работает если настроен bash_profile: ssh user@host 'bash -lc "pm2 restart app"' # ✅ bash -lc "node --version" # ✅
Полная таблица
Режим Пример запуска /etc/profile~/.bash_profile~/.bashrcLogin interactive ssh user@host


Non-login interactive Открыть терминал 


Non-interactive non-login ssh user@host "cmd"


Non-interactive login bash -lc "cmd"


Типичная схема настройки
Именно поэтому рекомендуют делать так:
~/.bash_profile └── source ~/.bashrc ← подтягивает всё из bashrc в login-сессииТогда и интерактивные терминалы (
~/.bashrc), и SSH-деплой черезbash -lc(~/.bash_profile) видят одно и то же окружение.
Порядок чтения
~/.bash_profile— важный нюансBash ищет первый существующий файл из трёх и читает только его:
1. ~/.bash_profile ← если есть — читается, остальные игнорируются 2. ~/.bash_login ← если нет bash_profile 3. ~/.profile ← если нет двух предыдущихНа Ubuntu
~/.bash_profileобычно отсутствует → читается~/.profile. На macOS — есть~/.bash_profile.
Применительно к деплою
# ❌ Не работает — режим 3, читает ничего ssh "$SERVER" "pm2 restart app" # ✅ Работает — режим 4, читает ~/.bash_profile ssh "$SERVER" 'bash -lc "pm2 restart app"' # ✅ Работает — если настроил ~/.bash_profile → source ~/.bashrc # и в ~/.bashrc прописан fnm/nvm
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.