在shell脚本中设置环境变量并不会使其对shell可见。

30

我想使用一个可以调用的shell脚本来设置一些环境变量。然而,在执行脚本之后,我在bash中使用"printenv"命令看不到这个环境变量。

以下是我的脚本:

#!/bin/bash

echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"
当我执行"./test.sh"时,我看到:
Hello!
After setting MYVAR!

当我执行 "printenv MYVAR" 命令时,没有看到任何输出。

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

2个回答

55

这就是环境变量的工作原理。每个进程都有一个环境的副本。进程对其副本所做的任何更改都会传播到该进程的子进程中。然而,这些更改不会传播到该进程的父进程。

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

source ./test.sh
或者
. ./test.sh

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

当您这样做时,bash不会在子shell中运行脚本,而是执行脚本中的每个命令,就像在提示符处输入一样。


它可以工作,但为什么“bash test.sh”不能设置环境变量?如果bash将脚本中的每个命令执行为在提示符中键入的命令,则环境变量将在当前进程中设置? - GDICommander
2
@GDICommander:不是。当你运行bash test.sh时,这会创建一个新的bash进程来执行脚本,并且退出 - NPE
1
好的,谢谢您提供的信息。现在我对环境变量有了更清晰的理解。 - GDICommander
如何使用 sudo 运行它?我得到了 sudo: .: command not found - Jorge Barrios

4
另一种选择是让脚本打印您想要设置的变量,使用echo export VAR=value,然后在主shell中执行eval "$(./test.sh)"。这是各种程序(例如resize、dircolors)提供环境变量设置的方法。
只有当脚本没有其他输出(或者任何其他输出出现在stderr上,使用>&2)时,此方法才有效。

为什么要踩?这是一种常见的模式,有几个优点。 - Random832

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接