设置Linux环境变量


Answers:


16

这是Bash手册页的节选:

导出[-fn] [名称[=单词]] ...
导出-p
标记提供的名称以自动导出到随后执行的命令的环境。如果给出了-f选项,则名称指的是函数...

如果仅在当前环境中需要该变量,则无需使用export。

var=value

编辑:

不导出:仅当前环境。导出:当前环境和子环境。

这是导出对子级环境中变量可用性的影响的演示,并且子级环境中的更改不会影响父级:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

在第一个回显(echo "parent...")之后,您会看到“ 123”和“ 456”,因为var1var2都在当前环境中处于活动状态。您尚未看到的值,var3因为尚未设置。

在“ var3=...” 开头的行之后,您看不到其值,var1因为未导出该值。您确实看到了的值,var2因为它导出。您会看到一个值,var3因为它针对子环境设置。

bash -c相当于运行带有-c选项自变量内容的脚本。脚本或其他可执行文件,或者在这种情况下,to的参数bash -c成为当前环境的子级,因此,结果当然是该子级的父)。

在“脚本”中更改变量的值。现在,它将输出这些新值。

一旦“脚本”完成,执行将返回到父环境(在这种情况下为命令行)。在最后一个回显之后,您会看到原始值,因为在子环境中所做的更改不会影响父环境。


什么是“在当前环境中”?当前的bash脚本还是?
2010年

1
是的,它的意思是“在当前脚本中”或“在当前交互式会话中”。因此,这不包括从当前脚本或交互式会话中运行的可执行文件或脚本。这是为了export-使变量可用于这些子环境。
暂停,直到另行通知。

我发现你所说的有些矛盾。:-)您说过“所以不包括可执行文件或脚本”,请注意“排除”,但是在引用中提到“提供的名称已标记为自动导出到随后执行的命令的环境中”。-设为“包含”(自动导出或影响),而不是“排除”。我很困惑,请您澄清一下吗?
George2

1
@ George2:有关更多信息,请参见我编辑的答案。
暂停,直到另行通知。

3

你这样说

我一直在使用export命令设置环境变量

用您所说的话来说,听起来您确实在想问如何使环境变量持续存在。为此,您需要将export VAR="foo"语句放入$ HOME / .bash_profile文件中(如果使用的是bash)。如果您希望该环境变量对除root用户以外的所有用户持久存在,则将其添加到/ etc / profile。如果您也想为root用户添加它,则在/root/.bash_profile中进行设置。

这对于所有选择bash的登录shell都适用。对于非登录外壳,您需要使用.bashrc。我没有其他壳提供的见解:D


2
您可能想重新阅读Bash手册页中有关这些文件来源的时间部分。
暂停,直到另行通知。

1
是的...我已经登录并感到困惑。编辑我的答案以反映出来。感谢您的纠正!
whaley 2010年

“使环境变量持续存在”-什么意味着持续存在?
2010年

1
“ Persist”表示每次启动外壳程序时都希望此变量具有此值。根据变量的用途,可能不一定要导出变量。
暂停,直到另行通知。

1
这意味着您尚未使其持久化。尝试按照whaley的描述进行操作。
暂停,直到另行通知。

1

导出是最简单的方法,那么为什么不保留它呢?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
Bourne shell需要VARIABLE = value; 出口变量
mpez0 2010年

1
这也应该起作用...
BloodPhilia 2010年

@BloodPhilia,对于bash,只有一种设置环境变量的方法?
2010年

1
@ George2-使用VARIABLE = value时,您正在创建一个局部变量,该变量在当前脚本执行后消失了。使用导出时,子进程将从其父进程继承变量值。例如:FOO=BAR; executethisprogram 程序executethisprogram将不知道变量的值FOO。另一方面,在使用时:FOO=BAR; export FOO; executethisprogram 程序executethisprogram将知道variable的值FOO
BloodPhilia 2010年

1
executethisprogram 不是 “ export FOO”的子过程。它是调用它的脚本的子进程(子进程)或交互式(命令行)shell。export FOO是标记该变量的命令,FOO以便发出该命令的环境的子进程可以访问该变量。该父对象可以是脚本或交互式外壳。
暂停,直到另行通知。

1

您还可以执行以下操作:

VAR=val application

例如:

LANG=C ls --help

用英文输出。

LANG=pl_PL ls --help

波兰语输出(如果有)。

在过去的sh中,您无法导出VAL = val。你不得不

VAL=val; export VAL

我对“ VAR = val应用程序”感到困惑,什么表示val,什么表示应用程序?
2010年

2
这些示例为子环境(ls例如)设置变量的值,而不会影响当前(父)环境中该变量的值。
暂停,直到另行通知。

请问孩子的环境是什么?我很困惑。
George2

1
ls是其运行过程的子级。如果我ls在命令提示符下键入,则交互式外壳程序是父级,ls是子级。如果我有使用的脚本,ls则该脚本是父级,并且ls是子级。
暂停,直到另行通知。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.