Почему я должен `source .profile` в каждом терминале, который я открываю?

Когда мы меняем некоторую переменную в ~/.profile в Ubuntu, мы выполняем команду source .profile. Тогда изменение действует только в этом терминале. Если мы откроем новый терминал, нам нужно снова выполнить команду source .profile. Таким образом, кажется, что у разных терминалов есть своя среда, хотя они могут принадлежать одному пользователю.

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

6
задан 7 January 2018 в 13:17

4 ответа

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

Существует множество случаев, когда процесс будет устанавливать конкретные переменные среды, чтобы влиять только на процессы, которые он запускает , Например, сценарий может преднамеренно сбросить настройки локали для запусканных команд, чтобы он мог анализировать выходные данные из них. В сценариях сборки для многих больших программных пакетов используются вложенные вызовы make, которые координируют друг с другом через переменные среды. Специализированные инструменты, возможно, должны изменить условия работы других программ, которые начинаются с трюков с помощью $ LD_PRELOAD или $ PATH.

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

Другие переменные среды содержат информацию о конкретном сеансе, в котором запущен процесс. $ TERM для описания набора команд конкретного терминала (или эмулятора терминала), к которому они подключены; что общая настройка для каждого пользователя делает невозможным вход в систему с несколькими различными терминалами. Даже если у вас есть только одна часть терминального оборудования и никогда не заходите в систему удаленно, такие программы, как screen, зависят от установки другого $ TERM для процессов, которые выполняются внутри их сеанса.

Лучшим вопросом будет , почему мы используем механизм связи между процессами для пользовательских настроек предпочтений, а не базу данных для каждого пользователя?

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

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

Это не так, как если бы альтернативы не переопределялись . Например, ресурсы X относятся к сеансу отображения, а не к процессу. Но им трудно получить доступ к командам командной строки, а программы командной строки, как правило, должны работать для удаленных логинов, которые даже , к которым подключен X-сервер.

3
ответ дан 17 July 2018 в 23:41

Причиной этого является то, что ~/.profile используется только в командах входа в систему. Когда вы открываете новое окно терминала, запускаемая оболочка по умолчанию является недействительной. Если вы выйдете из системы и войдете в систему, изменение на ~/.profile будет действовать во всех ваших терминалах, потому что ~/.profile будет получен при входе в вашу сессию.

Это не тот случай, когда разные терминальные окна имеют другую среду, но этот источник ~/.profile выполняет только ~/.profile в текущей оболочке (это именно то, что делает команда source).

Напротив, изменение на ~/.bashrc немедленно повлияет на любое новое окно терминала, которое вы открываете, или любую оболочку Bash, которую вы запускаете, набрав bash, потому что она получена из всех интерактивных оболочек Bash.

14
ответ дан 17 July 2018 в 23:41

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

Существует множество случаев, когда процесс будет устанавливать конкретные переменные среды, чтобы влиять только на процессы, которые он запускает , Например, сценарий может преднамеренно сбросить настройки локали для запусканных команд, чтобы он мог анализировать выходные данные из них. В сценариях сборки для многих больших программных пакетов используются вложенные вызовы make, которые координируют друг с другом через переменные среды. Специализированные инструменты, возможно, должны изменить условия работы других программ, которые начинаются с трюков с помощью $ LD_PRELOAD или $ PATH.

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

Другие переменные среды содержат информацию о конкретном сеансе, в котором запущен процесс. $ TERM для описания набора команд конкретного терминала (или эмулятора терминала), к которому они подключены; что общая настройка для каждого пользователя делает невозможным вход в систему с несколькими различными терминалами. Даже если у вас есть только одна часть терминального оборудования и никогда не заходите в систему удаленно, такие программы, как screen, зависят от установки другого $ TERM для процессов, которые выполняются внутри их сеанса.

Лучшим вопросом будет , почему мы используем механизм связи между процессами для пользовательских настроек предпочтений, а не базу данных для каждого пользователя?

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

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

Это не так, как если бы альтернативы не переопределялись . Например, ресурсы X относятся к сеансу отображения, а не к процессу. Но им трудно получить доступ к командам командной строки, а программы командной строки, как правило, должны работать для удаленных логинов, которые даже , к которым подключен X-сервер.

3
ответ дан 24 July 2018 в 17:05

Причиной этого является то, что ~/.profile используется только в командах входа в систему. Когда вы открываете новое окно терминала, запускаемая оболочка по умолчанию является недействительной. Если вы выйдете из системы и войдете в систему, изменение на ~/.profile будет действовать во всех ваших терминалах, потому что ~/.profile будет получен при входе в вашу сессию.

Это не тот случай, когда разные терминальные окна имеют другую среду, но этот источник ~/.profile выполняет только ~/.profile в текущей оболочке (это именно то, что делает команда source).

Напротив, изменение на ~/.bashrc немедленно повлияет на любое новое окно терминала, которое вы открываете, или любую оболочку Bash, которую вы запускаете, набрав bash, потому что она получена из всех интерактивных оболочек Bash.

14
ответ дан 24 July 2018 в 17:05

Другие вопросы по тегам:

Похожие вопросы: