shell脚本中的全局环境变量
Posted
技术标签:
【中文标题】shell脚本中的全局环境变量【英文标题】:Global environment variables in a shell script 【发布时间】:2010-11-30 15:48:18 【问题描述】:如何在 bash 脚本中设置全局环境变量?
如果我做类似的事情
#!/bin/bash
FOO=bar
...或
#!/bin/bash
export FOO=bar
...变量似乎保留在本地上下文中,而我想在脚本完成执行后继续使用它们。
【问题讨论】:
【参考方案1】:使用.
运行您的脚本
. myscript.sh
这将在当前 shell 环境中运行脚本。
export
控制哪些变量可用于新进程,所以如果你说
FOO=1
export BAR=2
./runScript.sh
那么$BAR
将在runScript.sh
的环境中可用,但$FOO
不会。
【讨论】:
小心第一个。如果没有斜线,它将在您的路径中查找:使用类似 '. ./myscript.sh' 如果你想确保它运行一个特定的。source
是 .
的别名。因此,如果您想更明确一些,可以运行 source myscript.sh
。
我想知道当我运行带有点和空格的脚本时会发生什么。例子 。我的脚本
@cNgamba 如果您通过阅读本页的其他答案和/或谷歌搜索找不到新问题,请提出新问题,但这是常见的常见问题解答;另见例如unix.stackexchange.com/questions/114300/…【参考方案2】:
当您运行 shell 脚本时,它是在子 shell 中完成的,因此它不会影响父 shell 的环境。您想通过以下方式获取脚本:
. ./setfoo.sh
这会在 当前 shell 的上下文中执行它,而不是作为 sub shell。
来自 bash 手册页:
。文件名 [参数]源文件名 [参数]
从当前 shell 中的文件名读取并执行命令 环境并返回最后执行的命令的退出状态 来自文件名。
如果文件名不包含斜杠,则使用 PATH 中的文件名 找到包含文件名的目录。
在 PATH 中搜索的文件不必是可执行文件。当 bash 不是 在 POSIX 模式下,如果没有找到文件,则搜索当前目录 在 PATH 中。
如果 shopt 内置命令的 sourcepath 选项被关闭, 未搜索 PATH。
如果提供了任何参数,它们将成为位置参数 当文件名被执行时。
否则位置参数不变。退货状态 是脚本中退出的最后一个命令的状态(如果没有,则为 0 命令被执行),如果文件名未找到或无法找到则返回 false 被阅读。
【讨论】:
有趣——我以前没见过这种语法。这相当于 source ./setfoo.sh 吗? 相同,只是输入速度更快(并且在旧系统上更兼容 - ksh 没有源命令,但它有 '.')。【参考方案3】: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
的作用怎么样?
@PhillipCloud 在终端输入man source
,你会得到你想要的。
我熟悉source
。也许 OP 不是。
@PhillipCloud 我想了解更多细节。如果您想编辑答案,您绝对可以这样做。帮助事业和所有...谢谢!
man source
很可能会返回No manual entry for source
。请改用help source
。这是因为source
是bash
命令语言解释器中的一个命令,所以它没有自己的手册页。为 shell 内部定义的所有命令键入 help
。【参考方案4】:
#!/bin/bash
export FOO=bar
或
#!/bin/bash
FOO=bar
export FOO
人出口:
shell 应将导出属性赋予与指定名称对应的变量,这将使它们处于随后执行的命令的环境中。如果变量名后跟=word,则该变量的值应设置为word。
【讨论】:
请各位 shell 脚本初学者注意:请注意 envvar 名称、'=' 字符和值本身之间没有空格;这行不通:export FOO = /mydir/bar
【参考方案5】:
FOO=bar
export FOO
【讨论】:
这个不行,它没有给父进程设置环境变量。 只有父进程才能为父进程设置环境变量。以上是关于shell脚本中的全局环境变量的主要内容,如果未能解决你的问题,请参考以下文章