当我执行环境命令(例如env
、set
和unset
)时,会发生一些事情,但是会发生什么?
set hello='hello world!'
unset find
你用命令做什么?这些变化是永久性的还是暂时的?在哪里可以看到变化?我是一个 Ubuntu 新手。
当我执行环境命令(例如env
、set
和unset
)时,会发生一些事情,但是会发生什么?
set hello='hello world!'
unset find
你用命令做什么?这些变化是永久性的还是暂时的?在哪里可以看到变化?我是一个 Ubuntu 新手。
这些变化是暂时的。它们只存在于当前的 shell 中。当您在~/.profile
or中设置环境变量时~/.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...
创建的每个进程都有自己的环境,该环境与进程一样长。您的 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)。
除非进程显式创建到该特定区域的映射并与另一个进程共享,否则任何进程都无法访问另一个进程。同样,一个进程的地址空间是完全私有的并且与其他进程隔离。环境变量存在于该地址空间中,否则进程无法访问或操作它们。
与参数列表一样,为存储环境变量的进程分配了一段内存。我相信它是一个\0
单独的、未排序的 KEY=VALUE 对列表。
这部分内存会被复制fork()
并不会被擦除,exec()
因此任何更改都会被复制到子进程中。
Unix shell 在使用之前不会将变量写入此环境变量内存export
。这就是shell变量和环境变量的区别。
在 bash shell 中,"x=2"
不设置环境变量。 "export x=2"
或者"x=2; export x"
确实。