【问题标题】:Global environment variables in a shell scriptshell脚本中的全局环境变量
【发布时间】:2010-11-30 15:48:18
【问题描述】:

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

如果我做类似的事情

#!/bin/bash
FOO=bar

...或

#!/bin/bash
export FOO=bar

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

【问题讨论】:

    标签: shell scripting environment-variables


    【解决方案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。这是因为sourcebash 命令语言解释器中的一个命令,所以它没有自己的手册页。为 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
    

    【讨论】:

    • 这个不行,它没有给父进程设置环境变量。
    • 只有父进程才能为父进程设置环境变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2013-09-04
    • 2015-09-16
    相关资源
    最近更新 更多