你如何处理环境变量?

时间:2009-03-24 01:55:52

标签: shell environment-variables

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

set hello='hello world!'
unset find

你如何处理这些命令?这些变化是永久的还是暂时的?你在哪里可以看到变化?我是一个Ubuntu新手。

3 个答案:

答案 0 :(得分:4)

这些变化是暂时的。它们只存在于当前的shell中。当您在~/.profile~/.bash_profile中设置环境变量时(只使用已存在的环境变量,请使用ls -a ~查看),它们将是永久性的,因为这些文件是“来源的” “每次你打开一个新的外壳。

例如,如果您添加:

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

答案 1 :(得分: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:

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

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

答案 2 :(得分:0)

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

每个fork()都会复制此位内存,而不会被exec()删除,因此所有更改都会复制到子进程中。

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

在bash shell中,"x=2"未设置环境变量。 "export x=2""x=2; export x"会这样做。