4

Пытаясь "правильно" реализовать стандартную конфигурацию моей предпочтительной оболочки bash для использования на нескольких платформах, я натолкнулся на некоторую путаницу при работе с терминалами, которые несовместимы с их выбором типов запуска оболочки (логин или интерактивный).

Загрузочные файлы Bash

Из руководства по bash я определил разницу между файлами запуска и порядком / случаями, в которых они получены (/etc/profile , ~/.bash_profile , ~/.bash_login и ~/.profile для оболочек входа в систему). и ~/.bashrc для интерактивных оболочек без входа в систему). В документации предлагается, чтобы вы сохраняли конфигурацию входа в систему, специфичную для bash, в ~/.bash_profile а интерактивные настройки, специфичные для bash, в ~/.bashrc . Само руководство даже предложило добавить if [ -f ~/.bashrc ]; then source ~/.bashrc; fi в ~/.bash_profile файла так Войти оболочки наследуют вашу интерактивные настройки оболочки.

Из того, что я прочитал в руководстве и на различных онлайн-форумах / документах, также представляется целесообразным абстрагировать вашу конфигурацию входа, не относящуюся к bash, к ~/.profile так как другие оболочки могут получить этот файл. Это может быть крайний случай для людей, которые могут использовать оболочку Bourne в дополнение к bash (что в моем случае маловероятно), но это кажется хорошей привычкой формироваться.

Пока что все это кажется довольно простым и логичным, особенно в среде, где очевидно различие между различными типами запуска оболочки: в системах или терминалах, где командная строка является основным интерфейсом, оболочки входа в систему являются вашими основными оболочками сеанса. интерактивные оболочки - это последующие оболочки, запущенные в этом сеансе, а ваши неинтерактивные оболочки - это оболочки, запускаемые сценариями.

Настоящая путаница заключается в том, что представляет собой оболочка входа в систему, когда ваша оболочка запускается из терминала в среде графического интерфейса, где вы уже прошли проверку подлинности в системе? Мне кажется, что в Mac OSX Terminal.app по умолчанию используется оболочка, запускаемая в каждом окне, для запуска оболочки входа в систему, тогда как в xterm каждое новое окно представляет собой интерактивную оболочку.


Возможно, что я вижу проблему, когда ее не существует, однако учтите следующее: ситуация с терминалом предполагает, что я поместил подавляющее большинство своей конфигурации в ~/.bashrc чтобы избежать потери функциональности, если я буду работать на терминале, который запускает bash как интерактивную оболочку Будучи незнакомым с тонкостями, когда bash может порождаться в виде интерактивных оболочек, я должен полагаться на это утверждение, что неправильное использование ~/.bashrc как это, в конечном итоге приведет к проблемам, когда неправильная установка конфигурации оболочки входа наносит ущерб нормальной работе оболочки. Нетрудно представить, что проблемы могут возникнуть, если вы игнорируете рекомендации руководства и используете файлы конфигурации не по назначению.

Поскольку вы не можете полагаться на использование ~/.bashrc качестве всеобъемлющего , кажется, что вам, возможно, придется обрабатывать файлы ~/.bash_profile и ~/.bashrc разному в зависимости от используемого терминала. Похоже, что это приведет к множеству головных болей и противоречит цели иметь эти отличные файлы запуска в первую очередь!

Итак, наконец, мои вопросы таковы:

  • Как нынешние пользователи оболочки Bash решают проблему несоответствий терминала GUI между начальным входом в систему и интерактивными оболочками?
  • Как создать единый набор файлов запуска bash для кросс-платформенного (и кросс-терминального) использования, не сталкиваясь с проблемами?

Спасибо за вашу помощь и советы.

1 ответ1

4

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

Определение переменных среды из .bashrc как правило, не очень хорошая идея, но это в первую очередь потому, что, как правило, это бесполезно, поскольку переменные уже должны были быть установлены во время входа в систему. На практике это может вызвать проблемы, если вы (или приложение) сознательно изменили значение переменной (например, PATH) в программе, и вы запускаете оболочку из этой программы и ожидаете, что параметр остался прежним.

Вы можете избежать проблемы сброса переменных среды, задав значение «sentinel» и ничего не определяя, если задано значение «sentinel»:

if [ -z "$JMLANE_PROFILE_READ" ]; then
  export ...
  export JMLANE_PROFILE_READ=1
fi

Другая проблема, связанная с тем, что терминалы запускают оболочки входа в систему, заключается в том, что существуют вещи, которые следует выполнять только один раз при входе в систему, например запуск агента паролей (например, ssh-agent) или запуск сеанса (например, запуск startx в определенных обстоятельствах). Переменная стража позволяет избежать этих проблем.

Оболочка внутри терминала всегда интерактивна. Если вы используете исходный код .bashrc из .bash_profile когда оболочка является интерактивной, вам не нужно беспокоиться о том, что терминал запустит оболочку входа.

Дополнительным преимуществом обработки файлов запуска bash является то, что .bashrc читается неинтерактивными оболочками, вызываемыми rshd или sshd. Например, когда вы выполняете rsync somefile host.example.com: если ваша оболочка входа на host.example.com - bash, вы можете использовать .bashrc там, чтобы указать путь для включения rsync . Вы можете сказать, что находитесь в этой ситуации, потому что .bashrc читается из неинтерактивной оболочки.

## .bashrc
if [[ $- != *i* ]]; then
  # either .bashrc was executed explicitly or this is a noninteractive rsh/ssh session
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .