当我执行环境命令时,例如env
,set
和unset
,会发生什么事情,但是什么?
set hello='hello world!'
unset find
你如何处理这些命令?这些变化是永久的还是暂时的?你在哪里可以看到变化?我是一个Ubuntu新手。
答案 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"
会这样做。