Да, это ожидаемое поведение.
Короче говоря, поведение выглядит следующим образом:
- bash запускается как интерактивная оболочка входа в систему: читает
~/.profile
- bash запускается как интерактивная оболочка без входа в систему: читает
~/.bashrc
Прочтите руководство bash о загрузочных файлах для более подробной информации.
Лично я думаю, что это поведение странно, и я еще не нашел обоснования для этого решения.
Некоторое объяснение терминологии:
- Интерактивная оболочка представляет собой оболочку , с которой вы можете взаимодействовать, это означает , что вы можете ввести в нем команду. Большинство используемых вами оболочек - это интерактивные оболочки.
- Неинтерактивная оболочка представляет собой оболочку , с которой вы не можете взаимодействовать. Скрипты оболочки запускаются внутри неинтерактивных оболочек.
- Войти оболочка является оболочкой , которая запускается при входе в систему.
- Не-Логин оболочки представляет собой оболочку , которая запускается после процесса входа в систему .
Большинство оболочек, которые вы видите, являются интерактивными оболочками без входа в систему . Это особенно верно, если вы используете графическое окружение, такое как gnome, потому что тогда gnome является «оболочкой для входа». Любая сессия bash, запущенная внутри gnome, является оболочкой без регистрации. Если вы хотите увидеть настоящую интерактивную оболочку входа в систему, перейдите на виртуальную консоль (используя Ctrl+Alt+F1
), а затем войдите в систему, используя свое имя пользователя и пароль. Это настоящая интерактивная оболочка bash для входа в систему. Вы можете вернуться к графической оболочке, используя Ctrl+Alt+F7
.
Есть опция, --login
которая заставит bash вести себя так, как будто это оболочка входа в систему, даже если она запущена после того, как вы вошли в систему. Настройка gnome-терминала для запуска bash в качестве оболочки входа в систему означает, что он запустит bash с помощью этой --login
опции.
Обычно вы хотите, чтобы bash всегда читал ~/.bashrc
в интерактивной оболочке. Вот как я рекомендую это сделать:
Создать ~/.bash_profile
файл. Если bash запускается как оболочка входа в систему, он сначала ищет, ~/.bash_profile
прежде чем искать ~/.profile
. Если bash находит, ~/.bash_profile
он не будет читать ~/.profile
.
Вставьте следующие строки в ~/.bash_profile
:
[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"
Теперь, если bash запущен как интерактивная оболочка входа, он будет читать следующие файлы:
~/.bash_profile
~/.profile
~/.bashrc
и если bash запускается как интерактивная оболочка без авторизации:
~/.bashrc
Вы должны поместить материал, специфичный для bash, ~/.bashrc
и материал, не специфичный для bash ~/.profile
. Например, PATH
входит ~/.profile
и HISTCONTROL
входит ~/.bashrc
.
Обратите внимание, что ~/.profile
это не относится к Bash. Другие текстовые оболочки (например, sh или ksh) и графические оболочки (gnome) также читаются ~/.profile
. Вот почему вы не должны помещать в Bash определенные вещи ~/.profile
.