Contents

设置bash命令的环境变量

1. 概述

环境变量 保存有关我们登录会话的信息。它们是为我们执行命令时使用的系统 shell 存储的。

通常,当我们执行命令时,我们不会直接操作环境变量。但是,有时,我们希望为一个或多个命令更改系统预定义的环境变量。

在这个快速教程中,让我们看看如何为一个或多个命令设置环境变量。

2. 一个Shell脚本示例

首先,让我们创建一个简单的 shell 脚本来模拟使用不同环境变量的命令:

$ cat java_app_sim.sh
#!/bin/bash
date +'%A %B %e %T %Y'
echo "JAVA_HOME: $JAVA_HOME"
echo "Now, starting a Java Application with the JAVA_HOME setting, please standby ..."

java_app_sim.sh 脚本模拟 Java 程序启动器,使用当前JAVA_HOME设置运行 Java 应用程序。

接下来,让我们使用当前设置执行java_app_sim.sh脚本,看看会发生什么:

$ ./java_app_sim.sh
Monday January 10 17:53:56 2022
JAVA_HOME: /usr/lib/jvm/default
Now, starting a Java Application with the JAVA_HOME setting, please standby ...

如上面的输出所示,java_app_sim.sh打印当前日期和时间以及系统的默认JAVA_HOME。然后它启动一个 Java 程序。当然,我们这里是通过echo命令来模拟的。

在本教程中,我们将首先演示如何仅为一个命令设置环境变量。

此外,我们将讨论如何在同一个 Bash 会话中为所有未来的命令设置环境变量。

接下来,让我们看看他们的行动。

3. 只为单个命令设置多个变量

假设我们的系统上安装了多个 Java 版本。我们希望使用特定的 Java 版本而不是默认版本来运行java_app_sim.sh应用程序。

此外,我们想通过设置LANG变量将应用程序的语言设置为德语。

此外,我们希望环境变量的更改只影响java_app_sim.sh命令

我们可以使用以下语法为单个命令设置变量:

VAR1=VALUE1 VAR2=VALUE2 ... Command ARG1 ARG2...

现在,让我们设置所需的变量并执行我们的 Java 应用程序启动器并查看它报告的内容:

$ LANG=de_DE JAVA_HOME=/the/special/java ./java_app_sim.sh 
Montag Januar 10 18:06:23 2022
JAVA_HOME: /the/special/java
Now, starting a Java Application with the JAVA_HOME setting, please standby ...

我们已经设置了LANGJAVA_HOME变量。正如我们在输出中看到的,我们的脚本采用了自定义的JAVA_HOME

此外,如果我们查看上面的日期信息,它是用德语打印的。因此,它采用了我们预期的LANG值。到目前为止,一切都很好!

最后,让我们检查两个变量在脚本执行后是否仍然保持原始值:

$ echo -e "LANG: $LANG \nJAVA_HOME: $JAVA_HOME"
LANG: en_US.utf8 
JAVA_HOME: /usr/lib/jvm/default

正如我们所看到的,这两个变量仍然具有原始值。

如果我们再次执行脚本而不自定义任何变量,它将采用默认设置:

$ ./java_app_sim.sh 
Monday January 10 18:14:11 2022
JAVA_HOME: /usr/lib/jvm/default
Now, starting a Java Application with the JAVA_HOME setting, please standby ...

4. 为所有未来的命令设置多个变量

我们已经学习了如何仅为一个命令设置变量。当我们想要临时运行具有不同环境设置的命令时,这种技术会很方便。

但是,有时,我们希望在当前 Bash 会话中设置一些环境变量,以便将来在该会话中运行的所有命令都将使用新设置的变量。

实现这一点的关键是使用导出 命令

export VAR1=VALUE1
export VAR2=VALUE2
...
Command ARG1 ARG2...

当然,我们可以把它写成更紧凑的形式

export VAR1=VALUE1 VAR2=VALUE2; Command ARG1 ARG2...

现在,让我们使用java_app_sim.sh脚本对其进行测试:

$ export LANG=de_DE JAVA_HOME=/the/special/java; ./java_app_sim.sh
Montag Januar 10 18:49:32 2022
JAVA_HOME: /the/special/java

正如我们在上面的输出中看到的,我们的脚本已经应用了我们自定义的变量值。

接下来,让我们检查两个环境变量的值是否在同一个 Bash 会话中发生了更改:

$ echo -e "LANG: $LANG \nJAVA_HOME: $JAVA_HOME"
LANG: de_DE 
JAVA_HOME: /the/special/java

很好,正如我们所料,这两个变量的值已更新。

现在,如果我们再次启动脚本而不设置任何变量,它将采用更新后的变量值:

$ ./java_app_sim.sh 
Montag Januar 10 19:01:06 2022
JAVA_HOME: /the/special/java
Now, starting a Java Application with the JAVA_HOME setting, please standby ...

因此,同一 Bash 会话中的所有未来命令都将使用更新的LANGJAVA_HOME变量执行。