Простой ответ: вы не можете сделать это вообще .
Почему не может быть общего решения?
Почему?нужно более подробное объяснение.В Linux среда зависит от процесса.Каждая среда процесса хранится в специальной области памяти, выделенной исключительно для этого процесса.
В качестве отступления: чтобы быстро проверить среду процесса, взгляните на /proc/<pid>/env
(или попробуйте /proc/self/env
для среды запущенного в данный момент процесса, например вашей оболочки).
Когда (родительский) процесс запускает другой (дочерний) процесс (через fork(2)
), средасреда родителя копируется , чтобы создать среду ребенка.После этого между этими двумя средами нет никакой ассоциации в стиле наследования, они полностью разделены.Таким образом, не существует «глобальной» или «основной» среды, которую мы могли бы изменить, чтобы добиться того, чего вы хотите.
Почему бы просто не изменить среду для каждого процесса всех запущенных процессов?Область памяти для среды находится в четко определенном месте (в основном прямо перед памятью, выделенной для стека), поэтому вы не можете легко расширить ее, не повредив другие критические области памяти процесса.
Возможные полу-решения для особых случаев
Тем не менее, можно представить несколько особых случаев, когда вы действительно можете достичь того, что вы хотите.
Mostочевидно, что если вы делаете «нейтральные по размеру» изменения, вы, возможно, сможете исправить все среды всех процессов.Например, замените каждую переменную среды USER=foo
(если имеется) на USER=bar
.Боюсь, это довольно частный случай.
Если вам не нужно менять среду всех процессов, а только класс известных, более креативные подходы могутбыть возможным Ответ Ворспрунга является впечатляющей демонстрацией выполнения именно этого только с процессами Bash.
Вероятно, существует множество других особых случаев, где возможное решение.Но, как объяснено выше: нет решения для общего случая.