English 中文(简体)
你如何使用环境变量?
原标题:
  • 时间:2009-03-24 01:55:52
  •  标签:

当我执行环境命令,比如envsetunset时,会发生什么事情呢?

set hello= hello world! 
unset find

你如何处理这些命令?更改是永久性的还是临时的?更改在哪里可见?我是一个Ubuntu新手。

最佳回答

每个进程被创建时都会获得自己的环境,其生命周期与进程一样长。您的 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:

我认为我现在完全理解您的问题。如果有人说虚拟环境,他们只是指出环境位于应用程序的地址空间中,该地址空间由内核映射为虚拟内存(某些页面可能位于物理内存中,某些页面可能位于交换空间、共享动态对象等中)。

除非该进程明确为该特定区域创建映射并与另一个进程共享,否则不允许任何进程访问另一个进程的环境。同样,进程的地址空间是完全私有且独立于其他进程的。环境变量驻留在该地址空间中,否则该进程无法访问或操作它们。

问题回答

这些更改是暂时的,仅在当前的 shell 中持久存在。当您在您的 ~/.profile~/.bash_profile 中设置环境变量(只需使用已经存在的一个,使用 ls -a ~ 查看),它们将是真正的永久性,因为每次打开新的 shell 时这些文件都会被“源化”。

例如,如果您添加了:

export HELLO="world"

把这个变量加到你的~/.profile 文件中,每次打开一个新的 shell 时,这个变量就会变得可用(你可以用source ~/.profile命令更新当前的 shell)。你可以使用以下命令进行测试:

$ 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...

就像参数列表一样,进程分配了一段用于存储环境变量的内存区域。我认为它是一个以 分隔的未排序的 KEY=VALUE 对列表。

这些记忆片段在每次fork()时复制,而且不会被exec()清除,所以任何更改都会被复制到子进程中。

Unix shells 不会将变量写入环境变量内存中,直到使用 export 命令。这就是shell变量和环境变量之间的区别。

在Bash Shell中,“x=2”不会设置环境变量。“export x=2”或“x=2; export x”会设置。





相关问题
热门标签