为什么有些脚本使用导出系统变量?

为什么有些脚本使用导出系统变量?

我看到很多ubuntu的在线教程,其中一些在脚本的开头使用export=作为系统变量。

例如:

export JAVA_HOME=/usr/local/java/jdk1.8.0_05
export CATALINA_HOME=/ubuntuland/utils/apache-tomcat-8.0.8

本教程

我试图理解其中的逻辑 - 因为对我来说,他们将使用系统变量而不是定义自己的变量是有意义的。

编辑

当我写: echo $JAVA_HOME在 shell 中,我在任何 shell 中、在服务器的任何时间(即使在重新启动后)都看到了正确的内容

答案1

有时您需要使用版本来运行某些东西。在您的情况下,这将是一个为您的 Tomcat 服务器提供支持的 Java 版本。全球 Java 版本可能会随着时间的推移而发生变化,并导致您的 Tomcat 服务器因错误或不兼容性而崩溃。因此,如果您定义自己的JAVA_HOMETomcat,则可以确保您的 Tomcat 以您之前测试过且可以信赖的 Java 版本启动。另一点可能是您有多个实例正在运行,并且您需要为CATALINA_HOME不同的实例指定不同的实例。

我认为最好的做法是显式定义变量,而不是依赖于可能随时间变化甚至不存在的变量,具体取决于系统范围的配置。这也使得排除故障以及查看所使用的路径和二进制文件变得更加容易。

答案2

bash手册有这样的说法export

export [-fn] [name[=word]] ...
export -p
        The  supplied names are marked for automatic export to the envi‐
        ronment of subsequently executed commands. [...]

这意味着当导出变量时,导出该变量的 shell 的任何子进程都可以使用该变量。为了显示:

$ foo="bar"              
$ bash -c 'echo "$foo"'  ## the variable isn't available to the child

$ export foo="bar"
$ bash -c 'echo "$foo"' ## the child also gets the variable
bar

因此,export当您想让一个变量可用于所有进程而不仅仅是当前运行的 shell 时,请使用该变量。

相关内容