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

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

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

10
задан 7 January 2018 в 12:17

2 ответа

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

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

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

14
ответ дан 7 January 2018 в 12:17
  • 1
    Это работает, но это отказывает на некотором cutscenes... – BrianXP7 3 June 2012 в 22:58
  • 2
    Это работает, но это отказывает на некотором cutscenes... – BrianXP7 3 June 2012 в 22:58

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

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

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

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

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

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

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

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

3
ответ дан 7 January 2018 в 12:17
  • 1
    Работы очень хорошо спасибо. То же обманет работу для Амнезии? Игра загрузится вплоть до него, просит имя и затем отказывает. – shaneo 4 June 2012 в 01:29
  • 2
    Работы очень хорошо спасибо. То же обманет работу для Амнезии? Игра загрузится вплоть до него, просит имя и затем отказывает. – shaneo 4 June 2012 в 01:29

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

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