如何在bash脚本中设置全局环境变量?
如果我做类似的事情
#!/bin/bash
FOO=bar
...或者
#!/bin/bash
export FOO=bar
...变量似乎保留在本地上下文中,而我想在脚本执行完成后继续使用它们。
使用
.
运行脚本
. myscript.sh
这将在当前 shell 环境中运行脚本。
export
控制哪些变量可用于新进程,所以如果你说
FOO=1
export BAR=2
./runScript.sh
那么
$BAR
将在 runScript.sh
的环境中可用,但 $FOO
不会。
当您运行 shell 脚本时,它是在子 shell 中完成的,因此它不会影响父 shell 的环境。您想通过执行以下操作来获取脚本来源:
. ./setfoo.sh
这会在 current shell 的上下文中执行它,而不是作为 sub shell。
来自 bash 手册页:
。文件名[参数]
源文件名[参数]在当前 shell 中读取并执行 filename 中的命令 环境并返回最后执行的命令的退出状态 来自文件名。
如果文件名不包含斜杠,则使用 PATH 中的文件名 找到包含文件名的目录。
在 PATH 中搜索的文件不必是可执行的。当 bash 不存在时 POSIX模式下,如果没有找到文件则搜索当前目录 在路径中。
如果 shopt 内置命令的 sourcepath 选项被关闭, 未搜索 PATH。
如果提供任何参数,它们将成为位置参数 当执行 filename 时。
否则位置参数不变。返回状态 是脚本中最后退出命令的状态(如果没有则为 0) 命令被执行),如果文件名未找到或无法找到,则返回 false 被阅读。
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
#!/bin/bash
export FOO=bar
或
#!/bin/bash
FOO=bar
export FOO
男人出口:
shell应为与指定名称相对应的变量赋予导出属性,这将使它们处于随后执行的命令的环境中。如果变量名称后跟 = word,则该变量的值应设置为 word。
一个常见的设计是让你的脚本输出结果,并且需要调用者的配合。然后你可以说,例如,
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
只打印要分配的值,或者以其他方式供调用者使用他们认为合适的值。
(显然,示例脚本是微不足道的占位符。在实际使用中,当您要调用的脚本足够复杂以至于您希望能够重用它时,您会使用这些机制。)
在您的 shell 脚本中,将变量写入另一个文件,如下所示,并将这些文件放入您的
~/.bashrc
或 ~/.zshrc
echo "export FOO=bar" >> environment.sh
在您的
~/.bashrc
或 ~/.zshrc
中,按如下所示获取它:
source Path-to-file/environment.sh
然后您可以在全球范围内访问它。