Сконфигурируйте gnome-терминал для запуска bash в качестве оболочки входа в систему, не читает .bashrc


24

Я пытаюсь интегрировать RVM с gnome-терминал .

По умолчанию gnome-терминал не запускает bash в качестве оболочки для входа. Я включил, run command as a login shellкак предложено в этом ответе о той же теме настройки RVM, но когда я делаю это, .bashrcфайл не читается.

Например, я создаю переменную окружения в, .bashrcа затем, когда я запускаю новый терминал gnome, я не могу прочитать его. Мне нужно запустить явно, source .bashrcчтобы прочитать файл.

Это ожидаемое поведение?

Ответы:


38

Да, это ожидаемое поведение.

Короче говоря, поведение выглядит следующим образом:

  • 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 запущен как интерактивная оболочка входа, он будет читать следующие файлы:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

и если bash запускается как интерактивная оболочка без авторизации:

  1. ~/.bashrc

Вы должны поместить материал, специфичный для bash, ~/.bashrcи материал, не специфичный для bash ~/.profile. Например, PATHвходит ~/.profileи HISTCONTROLвходит ~/.bashrc.

Обратите внимание, что ~/.profileэто не относится к Bash. Другие текстовые оболочки (например, sh или ksh) и графические оболочки (gnome) также читаются ~/.profile. Вот почему вы не должны помещать в Bash определенные вещи ~/.profile.


1
+1. Спасибо, это
вело

1
mywiki.wooledge.org/DotFiles объясняет некоторую историю того, почему это так. Основная причина этой проблемы с rvm заключается в том, что rvm помещает код, который должен быть в ~/.bashrcпервую очередь, в профиль. Ошибка на рвм.
Гейра

Согласно @geirha, они должны были использовать~/.profile
sanmai

Смысл в том, что скрипт профиля может контролировать оценку .bashrcотносительно того, что ему нужно делать. Если интерактивная оболочка всегда читает, это .bashrcдолжно быть до или после .profile? Что делать, если вы хотите настроить некоторые вещи, .bashrcкоторые .profileвоспринимаются как должное? И в то же время вы хотите, чтобы некоторые вещи .bashrcполагались на что-то созданное .profile? Ни один из вариантов загрузки не удовлетворит оба сценария.
Kaz

11

Это не плохое дизайнерское решение, не ошибка и не ожидаемое поведение оболочек и терминалов.

Это просто неудачное значение по умолчанию параметра конфигурации для каждого профиля в терминале Gnome, которое вы можете легко исправить.

  1. Перейдите в Edit -> Настройки профиля .

  2. Выберите вкладку « Заголовок и команда ».

  3. Обратите внимание, что флажок « Выполнить как оболочка входа» снят! Проверь это.

Вот и все. Если вы сделаете это с Defaultпрофилем или с тем профилем, который настроен для использования при создании новых терминалов, вы получите оболочку входа.

Я предполагаю, что под капотом эта опция, вероятно, заставляет его передавать -lопцию в оболочку.


0

У меня был тот же вопрос, и я нашел решение: просто используйте SSH для реальной оболочки входа в систему!

1. В качестве суперпользователя создайте выделенного пользователя системы rvm для полной изоляции и назначьте пароль:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Установите зависимости, чтобы rvm мог создавать рубины без запроса пароля суперпользователя:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH в localhost для реальной оболочки входа (возможно, придется apt-get install ssh)

ssh rvmuser@localhost

4. Установите rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Выйдите из системы и снова войдите в нее, чтобы загрузить все функции rvm.

exit

ssh rvmuser@localhost

6. Используйте рвм :)


0

Обычно используется bash для размещения инициализации профиля .bash_profile, которая только для чтения bash при входе в систему, в то время как другие оболочки исторически делятся .profile. Это позволяет вам помещать специфичные для bash команды .bash_profile.

Обычно используется следующее для получения псевдонимов, которые определены в .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.