1

当我执行环境命令(例如envsetunset)时,会发生一些事情,但是会发生什么?

set hello='hello world!'
unset find

你用命令做什么?这些变化是永久性的还是暂时的?在哪里可以看到变化?我是一个 Ubuntu 新手。

4

3 回答 3

4

这些变化是暂时的。它们只存在于当前的 shell 中。当您在~/.profileor中设置环境变量时~/.bash_profile(只需使用已经存在的环境变量,ls -a ~用于查看),它们将有效地永久存在,因为每次打开新 shell 时这些文件都是“来源”的。

例如,如果您添加:

export HELLO="world"

对您~/.profile而言,每次打开新 shell 时,该变量都会变为可用(您可以使用 刷新当前 shell 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...
于 2009-03-24T02:04:59.723 回答
2

创建的每个进程都有自己的环境,该环境与进程一样长。您的 shell 就像任何其他进程一样。它的环境是它自己的。

如果您键入不带参数的“set”,您将看到存在的内容。其中许多设置用于控制程序行为。您的搜索路径、所需的 X11 显示、主目录(如果不是 /home/yourname)等。

用途实际上是您需要的任何东西。每当您需要将一些有用的信息(例如某些程序的命令行选项的长列表)存储到其他应用程序可以读取的变量中,或者您可以从 shell 访问时,请使用环境。

例如:

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

编辑:

作为一名程序员,我阅读环境来确定用户的偏好并服从他们。例如,如果设置了变量 POSIXLY_CORRECT,它会影响我的程序的输出。环境是用户告诉程序如何表现的地方。它也发生了,正如我上面所描述的,环境是用户存储有用位的一个方便的地方。

再次(响应您的评论),执行的每个程序都是一个过程。一个进程拥有自己的地址空间(自己的内存),其环境存储在该空间中。这意味着,环境是特定于该过程的,并且仅与过程本身一样长。

编辑2:

我想我现在完全理解你的问题了。如果有人说“虚拟环境”,他们只是注意到环境驻留在应用程序的地址空间中,该地址空间被内核映射为虚拟内存(有些页面可能在物理内存中,有些可能在交换中,共享动态对象, ETC)。

除非进程显式创建到该特定区域的映射并与另一个进程共享,否则任何进程都无法访问另一个进程。同样,一个进程的地址空间是完全私有的并且与其他进程隔离。环境变量存在于该地址空间中,否则进程无法访问或操作它们。

于 2009-03-24T02:12:50.140 回答
0

与参数列表一样,为存储环境变量的进程分配了一段内存。我相信它是一个\0单独的、未排序的 KEY=VALUE 对列表。

这部分内存会被复制fork()并不会被擦除,exec()因此任何更改都会被复制到子进程中。

Unix shell 在使用之前不会将变量写入此环境变量内存export。这就是shell变量和环境变量的区别。

在 bash shell 中,"x=2"不设置环境变量。 "export x=2"或者"x=2; export x"确实。

于 2009-03-24T02:30:08.290 回答