Рейтинг:5

Рабочий стол Ubuntu: почему сценарий .profile выполняется в интерактивной оболочке без входа в систему?

флаг kz

Я понимаю разницу между Интерактивный вход и Интерактивный без входа

В соответствии с этим прекрасным постом: Порядок загрузки файлов запуска Zsh/Bash (.bashrc, .zshrc и т. д.) у нас есть следующая таблица

+----------------+-----------+------------+------+
| |Интерактивный|Интерактивный|Сценарий|
| |логин |не вход | |
+----------------+-----------+------------+------+
|/и т.д./профиль | А | | |
+----------------+-----------+------------+------+
|/etc/bash.bashrc| | А | |
+----------------+-----------+------------+------+
|~/.bashrc | | Б | |
+----------------+-----------+------------+------+
|~/.bash_profile | Б1 | | |
+----------------+-----------+------------+------+
|~/.bash_логин | Б2 | | |
+----------------+-----------+------------+------+
|~/.профиль | Б3 | | |
+----------------+-----------+------------+------+
|BASH_ENV | | | А |
+----------------+-----------+------------+------+
| | | | |
+----------------+-----------+------------+------+
| | | | |
+----------------+-----------+------------+------+
|~/.bash_logout | С | | |
+----------------+-----------+------------+------+

Первая ссылка относится к другому отличному посту: Очистка настроек bash где доступно отличное объяснение о Интерактивный вход и Интерактивный без входа следующее:

Ан интерактивный вход shell — это оболочка, в которую вы печатаете, это первая такая оболочка, которую вы запускаете на машине. Как правило, вам придется войти в систему непосредственно перед запуском оболочки. Например, когда вы подключаетесь по SSH к удаленной системе и вводите команды для этой системы, вы вводите интерактивную оболочку входа в систему.

Ан интерактивная оболочка без входа в систему запускается ли новая оболочка после того, как вы уже вошли в систему; тот, который не требует повторного входа в систему. Например, если вы откроете новое окно терминала в своем графическом пользовательском интерфейсе и получите приглашение оболочки, это интерактивная оболочка без входа в систему. Другим примером интерактивной оболочки без входа в систему может быть вложенная оболочка, запускаемая из текстового редактора; например, набрав :sh в vi.

Что касается первого, то это практически обязательно в Ubuntu. Сервер среда - где работать с каждым телетайп нужно войти в систему, поэтому в соответствии с таблицей ~/.профиль используется (я подтвердил, что не существует ни ~/.bash_profile ни ~/.bash_логин файлы). Это относится к su - другой пользователь (он запрашивает его/ее пароль) и, следовательно, его/ее собственный ~/.профиль файл тоже выполняется. Пока здесь я в порядке.

О последнем — причина этого поста — Ubuntu Рабочий стол среда, это применяется, когда новое окно/терминал открывается только с одной вкладкой по умолчанию, поэтому в соответствии с таблицей следует выполнить /etc/bash.bashrc и ~/.bashrc файлы и нет в .профиль файл

Но почему если выполняется в что Терминал:

  • эхо $JAVA_HOME (определено на .профиль)
  • эхо $M2_HOME (определено на .профиль)
  • эхо $GRADLE_HOME (определено на .профиль)
  • какая ява
  • какой мвн
  • какой уровень

все команды работают нормально?

То же поведение для любой новой вкладки (Ctrl + Shift + T) в том же окне и даже для нового окна терминала с уникальной вкладкой по умолчанию

Я прочитал следующий пост:

А упомянутых настроек у меня нет (вторая адаптирована для Ubuntu Desktop 18:04):

  • .bashrc файлы не ссылаются или не получают .профиль файл
  • Редактировать --> Настройки --> Безымянный -> Вкладка «Команда» --> Запустить команду как оболочку входа (это не проверено)
raj avatar
флаг cn
raj
Это не оболочка, которая выполняет файл `.profile`. Попробуйте вставить команду типа `echo This is .profile` в файл `.profile` - вы не увидите сообщение ни на одном новом открытом вами терминале, и вы **должны** увидеть его, если оболочка действительно выполнялась файл. Это ваша **среда рабочего стола** (GNOME или другая), которая выполняет этот файл при запуске сеанса. Определенные там переменные среды затем наследуются (как сказано в ответе ниже) **всеми процессами**, запущенными из среды рабочего стола, **включая терминалы**.
Manuel Jordan avatar
флаг kz
@raj Нарушает ли эта логика правила, указанные в таблице (таблицах), которые используются в двух ссылках на мой вопрос? На первый взгляд кажется, что да — такое поведение происходит в других дистрибутивах Linux?
raj avatar
флаг cn
raj
Нет. Логика относится к **выполнению файлов запуска оболочкой**. В этом случае файл `~/.profile` **не выполняется оболочкой**. Так что все в порядке. Выше ничего не сказано о выполнении файла **другим** программным обеспечением, кроме оболочки. Кроме того, как сказано в первом комментарии к ответу, крайне важно, чтобы файл выполнялся DE при входе в систему, потому что в противном случае в терминалах, запускаемых из DE, будут происходить плохие вещи (например, у вас не будет `$ PATH` определены правильно, поэтому некоторые команды, которые работают при входе в систему через ssh, не будут работать из DE).
Рейтинг:8
флаг cn

Скрипты, которые выполняются для оболочка входа (общесистемный /etc/профиль, любой скрипт в /etc/profile.d, ваш местный ~/.профиль и другие файлы, которые вы перечисляете) определяют среду вашего текущего пользователя - с тех пор, как вы вошли в систему.

Любой без входа оболочка, которую вы впоследствии откроете, по крайней мере унаследует среду вашей оболочки входа в систему. Вот почему у вас (уже) есть все переменные среды, определенные в .профиль при открытии нового терминала.

флаг cc
Точно, наследование - это ключ. К сожалению, несколько десятилетий назад люди из CDE (Common Desktop Environment) не получили заметку, и терминалы, появляющиеся на их рабочем столе (и та же проблема сегодня для многих DE), никогда не получают вашу среду, потому что 1) не срок входа в систему и 2 ) разветвляется из не-вашего-процесса, поэтому наследование не работает. В результате в .bashrc сбрасывается столько дерьма. Ужасно, так как это делается для каждой команды (запустите set -xv и посмотрите, что на самом деле должен выполнить bash)
Manuel Jordan avatar
флаг kz
@vanadium Даже если ваш ответ правильный - нарушает ли эта логика правила, указанные в таблице (таблицах), которые используются в двух ссылках на мой вопрос? На первый взгляд кажется, что да — такое поведение происходит в других дистрибутивах Linux?
vanadium avatar
флаг cn
Согласно блок-схеме, файлы типа «профиль» выполняются при входе в систему, независимо от того, входите ли вы в систему TTY (интерактивная оболочка входа) или в среде рабочего стола (неинтерактивная оболочка входа). Также запускается .bashrc, потому что он получен по профилю. После входа в систему, когда вы открываете новый терминал или подоболочку (например, в TTY) (интерактивные оболочки без входа в систему), запускаются только файлы типа bashrc.
raj avatar
флаг cn
raj
@vanadium На самом деле, основываясь на журналах в `/var/log/syslog` относительно запуска сеанса GNOME, вы можете сказать, что файлы `/etc/profile` и `~/.profile` (но **не** `.bash_profile ` ни `.bash_login`) явно запускаются сценарием `/etc/gdm3/Xsession`, который запускается `gdm-x-session`, который запускается непосредственно gdm. После этого `dbus-update-activation-environment` вызывается `gdm-x-session` для экспорта среды в другие процессы в сеансе (запущенные systemd отдельно) через D-Bus. Так что это довольно сложно, но нигде не задействована оболочка входа.
vanadium avatar
флаг cn
@ray да, детали могут быть действительно более сложными. Вопрос здесь был "почему .profile был выполнен в оболочке без входа в систему" - простой ответ - "нет, он *не* выполняется. Однако он уже был выполнен ранее, поэтому вы наследуете его настройки в своей снаряды». .

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.