Shell脚本中的全局环境变量


83

如何在bash脚本中设置全局环境变量?

如果我做类似的事情

#!/bin/bash
FOO=bar

...要么

#!/bin/bash
export FOO=bar

... var似乎保留在本地上下文中,而我想在脚本执行完后继续使用它们。

Answers:


141

使用以下命令运行脚本 .

. myscript.sh

这将在当前的shell环境中运行脚本。

export 控制哪些变量可用于新流程,所以如果您说

FOO=1
export BAR=2
./runScript.sh

那么$BAR它将在的环境中可用runScript.sh,但$FOO不会。


27
小心第一个。如果没有斜线,它会出现在您的路径中:使用类似'的名称。./myscript.sh”,如果您要确保它运行特定的。
paxdiablo

13
source是的别名.。因此source myscript.sh,如果您想更加明确,可以改为运行。
Ehtesh Choudhury

我想知道当我使用点和空格运行脚本时会发生什么。例子 myscript
cNgamba

54

当你运行一个shell脚本,它在一个子壳的完成,因此它不能影响父shell的环境。您想通过以下方式来获取脚本源:

. ./setfoo.sh

这将在当前外壳程序的上下文中执行它,而不是作为外壳程序执行。

从bash手册页:

。文件名[参数]
源文件名[参数]

在当前Shell环境中从文件名读取并执行命令,并返回从文件名执行的最后一条命令的退出状态。

如果filename不包含斜杠,则使用PATH中的文件名来查找包含filename的目录。

在PATH中搜索的文件不必是可执行的。当bash不在POSIX模式下时,如果在PATH中找不到文件,则搜索当前目录。

如果shopt内置命令的sourcepath选项已关闭,则不会搜索PATH。

如果提供了任何参数,则在执行文件名时它们将成为位置参数。

否则,位置参数将保持不变。返回状态是脚本中最后退出的命令的状态(如果未执行任何命令,则返回0),如果找不到或无法读取文件名,则返回false。


有趣的-我以前没有看过这种语法。这等效于源./setfoo.sh吗?
ire_and_curses

2
相同,只是键入速度更快(在较旧的系统上更兼容-ksh没有源命令,但确实有'。')。
paxdiablo

9

source myscript.sh 也是可行的。

linux命令说明source

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

也许这里还有更多细节。关于功能的简短描述如何source
菲利普·

man source在终端中输入@PhillipCloud ,您将得到想要的东西。
CDT

5
我熟悉source。也许OP不是。
菲利普·乌云

2
@PhillipCloud我想要更多细节,我自己。如果您要编辑答案,则绝对可以。帮助事业,一切……谢谢!
Dan Rosenstark 2014年

4
#!/bin/bash
export FOO=bar

要么

#!/bin/bash
FOO=bar
export FOO

男子出口:

外壳程序应将export属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。如果变量名后接= word,则该变量的值应设置为word。


请给shell脚本编写的每个初学者:请注意,envvar名称,'='字符和值本身之间没有任何空格;这行不通:export FOO = /mydir/bar
russellhoff

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.