Shell 您如何处理环境变量?

Shell 您如何处理环境变量?,shell,environment-variables,Shell,Environment Variables,当我执行环境命令时,例如env、set和unset,会发生一些事情,但会发生什么 set hello='hello world!' unset find 你用这些命令做什么?这些变化是永久性的还是暂时性的?在哪里可以看到这些变化?我是Ubuntu新手。更改是暂时的。它们只存在于当前外壳中。当您在~/.profile或~/.bash_profile中设置环境变量时(只需使用已经存在的环境变量,使用ls-a~查看),它们将有效地永久存在,因为每次打开新shell时这些文件都是“源文件” 例如,如果

当我执行环境命令时,例如
env
set
unset
,会发生一些事情,但会发生什么

set hello='hello world!'
unset find

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

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

例如,如果您添加了:

export HELLO="world"
对于您的
~/.profile
,该变量将在每次打开新shell时可用(您可以使用
源~/.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...

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

例如,如果您添加了:

export HELLO="world"
对于您的
~/.profile
,该变量将在每次打开新shell时可用(您可以使用
源~/.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...

创建的每个进程都有自己的环境,环境的寿命与进程的寿命一样长。您的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与任何其他进程一样。它的环境是它自己的

如果键入不带参数的“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:

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

任何进程都不能访问其他进程的环境,除非该进程显式创建到该特定区域的映射并与其他进程共享。同样,进程的地址空间是完全私有的,并且与其他进程隔离。环境变量位于该地址空间内,否则,进程