Что вы делаете с переменными среды? - PullRequest
1 голос
/ 24 марта 2009

Когда я выполняю команды среды, такие как env, set и unset, что-то происходит, но что?

set hello='hello world!'
unset find

Что вы делаете с командами? Являются ли изменения постоянными или временными? Где вы можете увидеть изменения? Я новичок в Ubuntu.

Ответы [ 3 ]

4 голосов
/ 24 марта 2009

Изменения временные. Они сохраняются только в текущей оболочке. Когда вы устанавливаете переменную окружения в своих ~/.profile или ~/.bash_profile (просто используйте ту, которая уже существует, используйте ls -a ~, чтобы увидеть), они будут фактически постоянными, так как эти файлы "исходят" каждый раз, когда вы открываете новая оболочка.

Например, если вы добавили:

export HELLO="world"

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

$ echo $HELLO
world

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

export EDITOR="nano"

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

Bill:~$ export PS1="\u is awesome$ "
Bill is awesome$ ls
Bill is awesome$ du -h
Bill is awesome$ ...etc...
2 голосов
/ 24 марта 2009

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

Если вы введете «set» без аргументов, вы увидите, что существует. Многие из этих настроек предназначены для управления поведением программы: ваш путь поиска, требуемый экран X11, домашний каталог (если не / home / yourname) и т. Д.

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

Например:

USUAL_CONFIGURE_OPTS="--prefix=/home/charlie --sysconfdir=/home/charlie/tmp-etc"
./configure $USUAL_CONFIGURE_OPTS --and-additional-arguments

Edit:

Как программист, я читаю среду, чтобы определить предпочтения пользователя и подчиняться им. Например, переменная POSIXLY_CORRECT влияет на вывод моих программ, если она установлена. Среда - это то, где пользователь говорит программам, как себя вести. Также бывает, что среда - удобное место для хранения полезных битов, как я описал выше.

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

Редактировать 2:

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

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

0 голосов
/ 24 марта 2009

Так же, как со списком аргументов, есть раздел памяти, выделенный для процесса, в котором хранятся переменные среды. Я считаю, что это разделенный \0 несортированный список пар KEY = VALUE.

Этот бит памяти копируется с каждым fork() и не стирается exec(), поэтому любые изменения копируются в дочерние процессы.

Оболочки Unix не записывают переменные в эту память переменных среды, пока не будет использован export. В этом разница между переменными оболочки и переменными среды.

В оболочке bash, "x=2" не устанавливает переменную окружения. "export x=2" или "x=2; export x" делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...