shell 脚本中的全局环境变量

问题描述 投票:0回答:6

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

如果我做类似的事情

#!/bin/bash
FOO=bar

...或者

#!/bin/bash
export FOO=bar

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

shell scripting environment-variables
6个回答
166
投票

使用

.

运行脚本
. myscript.sh

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

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

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

那么

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


63
投票

当您运行 shell 脚本时,它是在子 shell 中完成的,因此它不会影响父 shell 的环境。您想通过执行以下操作来获取脚本来源:

. ./setfoo.sh

这会在 current shell 的上下文中执行它,而不是作为 sub shell。

来自 bash 手册页:

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

在当前 shell 中读取并执行 filename 中的命令 环境并返回最后执行的命令的退出状态 来自文件名。

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

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

如果 shopt 内置命令的 sourcepath 选项被关闭, 未搜索 PATH。

如果提供任何参数,它们将成为位置参数 当执行 filename 时。

否则位置参数不变。返回状态 是脚本中最后退出命令的状态(如果没有则为 0) 命令被执行),如果文件名未找到或无法找到,则返回 false 被阅读。


13
投票

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

4
投票
#!/bin/bash
export FOO=bar

#!/bin/bash
FOO=bar
export FOO

男人出口:

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


0
投票

一个常见的设计是让你的脚本输出结果,并且需要调用者的配合。然后你可以说,例如,

eval "$(yourscript)"

或者也许危险性较小

cd "$(yourscript)"

这扩展到除 shell 脚本之外的其他语言的工具。

为了适应您的示例,如果您将其保存在

A.sh
中的
PATH
中并
chmod +x
中,

#!/bin/sh
echo 'FOO=bar'

那么你可以

eval "$(A.sh)"

在调用者的上下文中执行输出(在本例中为

FOO=bar
)。

显然,请始终小心

eval
,并且仅评估来自可信来源的字符串。

一个不太冒险的解决方案是储蓄

#!/bin/sh
echo 'bar'

如您的

B.sh
中的
PATH
;那么调用脚本可以自己完成分配,无需
eval
:

FOO=$(B.sh)

注意

A.sh
如何打印 shell 脚本的实际片段(赋值表达式),而
B.sh
只打印要分配的值,或者以其他方式供调用者使用他们认为合适的值。

(显然,示例脚本是微不足道的占位符。在实际使用中,当您要调用的脚本足够复杂以至于您希望能够重用它时,您会使用这些机制。)


-1
投票

在您的 shell 脚本中,将变量写入另一个文件,如下所示,并将这些文件放入您的

~/.bashrc
~/.zshrc

echo "export FOO=bar" >> environment.sh

在您的

~/.bashrc
~/.zshrc
中,按如下所示获取它:

source Path-to-file/environment.sh

然后您可以在全球范围内访问它。

© www.soinside.com 2019 - 2024. All rights reserved.