在 bash 脚本中无法访问环境变量

Meh*_*ban 31 command-line bash scripts environment-variables

我遇到了一个奇怪的问题。我将一些 env 变量放入其中.bashrc,它可以正常工作:

echo $HADOOP_HOME
/home/me/dist/hadoop
Run Code Online (Sandbox Code Playgroud)

但是在执行 bash 脚本时无法访问 env 变量。假设我/tmp/sample.sh使用以下内容创建:

#! /bin/bash
echo $HADOOP_HOME
Run Code Online (Sandbox Code Playgroud)

当我运行上面的脚本时,回显一个空行:

/tmp/sample.sh
   ?
Run Code Online (Sandbox Code Playgroud)

ter*_*don 43

那是因为HADOOP_HOME变量没有被导出:

$ cat foo.sh
#!/bin/bash
echo "HADOOP_HOME: $HADOOP_HOME"


$ HADOOP_HOME=/home/me/dist/hadoop
$ echo $HADOOP_HOME
/home/me/dist/hadoop

$ foo.sh
HADOOP_HOME: 

$ export HADOOP_HOME
$ foo.sh
HADOOP_HOME: /home/me/dist/hadoop
Run Code Online (Sandbox Code Playgroud)

当您运行一个 shell 脚本时,该脚本将在它自己的 bash 实例中运行(这就是它的#!/bin/bash作用),它是当前一个的子 shell。默认情况下,变量不会传递给子 shell,仅当它们被导出时。将每个 bash 会话视为独立的(它们在很大程度上是独立的)。您通常不希望一个定义的变量污染另一个的环境。对于那些必要的情况,请使用export.