【问题标题】:Setting environment variable in shell script does not make it visible to the shell在 shell 脚本中设置环境变量不会使其对 shell 可见
【发布时间】:2011-12-22 13:21:32
【问题描述】:

我想使用一个可以调用的 shell 脚本来设置一些环境变量。但是,执行脚本后,我在 bash 中没有看到使用“printenv”的环境变量。

这是我的脚本:

#!/bin/bash

echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"

当我执行“./test.sh”时,我看到了:

Hello!
After setting MYVAR!

当我执行“printenv MYVAR”时,我什么也看不到。

你能告诉我我做错了什么吗?

【问题讨论】:

    标签: unix export environment-variables


    【解决方案1】:

    这就是环境变量的工作方式。每个进程都有一个环境副本。进程对其副本所做的任何更改都会传播到进程的子进程。但是,它们不会传播到进程的父进程。

    解决此问题的一种方法是使用source 命令:

    source ./test.sh
    

    . ./test.sh
    

    (这两种形式是同义词)。

    当您这样做时,bash 将执行脚本中的每个命令,而不是在子 shell 中运行脚本。

    【讨论】:

    • 可以,但是为什么“bash test.sh”没有设置环境变量呢?如果 bash 执行脚本中的每个命令就像在提示符中键入一样,那么环境变量会在当前进程中设置吗?
    • @GDICommander:不。当您运行bash test.sh 时,这将创建一个新的bash 进程,该进程执行脚本并退出
    • 好的,谢谢您的信息。现在,我对环境变量有了更好的理解。
    • 如何使用sudo 运行它?我得到sudo: .: command not found
    【解决方案2】:

    另一种选择是让脚本打印您要设置的变量,使用echo export VAR=value 并在您的主shell 中执行eval "$(./test.sh)"。这是各种程序使用的方法 [e.g. resize, dircolors] 提供环境变量来设置。

    这仅在脚本没有其他输出时才有效(或者如果任何其他输出出现在 stderr 上,>&2

    【讨论】:

    • 为什么投反对票?这是一种常见的模式,有几个优点。
    猜你喜欢
    • 2015-01-03
    • 2022-01-04
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多