“echo”和“export”环境变量之间的区别?

Ben*_*n L 2 command-line bash environment-variables

环境是Ubuntu 18。

如果我在 /etc/environment 中添加一行JAVA_HOME="/usr/java11"并执行source /etc/environment,我可以回显此环境变量:

echo $JAVA_HOME
/usr/java11
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试从导出中获取它,则该变量不在列表中:

export | grep JAVA_HOME
--result is blank--
Run Code Online (Sandbox Code Playgroud)

然后我用export $JAVA_HOME=/usr/java8导出一个变量(注意这里是java8,而不是java 11),我可以有:

export |grep JAVA_HOME
declare -x JAVA_HOME="/usr/java8"
Run Code Online (Sandbox Code Playgroud)

现在,我仍然可以echo $JAVA_HOME作为/usr/java11:

echo $JAVA_HOME
/usr/java11
Run Code Online (Sandbox Code Playgroud)

echo $variable问题:和有什么区别export | grep JAVA_HOME

我尝试一个简单的 python 程序,os.environ.get("JAVA_HOME")从导出返回“/usr/java8”,而不是回显。

ste*_*ver 13

这里的问题实际上并不是echo和之间的区别export,而是环境变量和简单shell 变量之间的区别(以及/etc/environment文件通常如何使用的区别)。

特别是,虽然/etc/environment碰巧包含作为 POSIX shell 变量赋值有效的形式的行,但其主要目的(在现代 Linux 系统中)是在用户会话初始化期间name=value由模块读取- 即将它们导出到用户的环境。pam_envpam_env

当您/etc/environment进入 shell 时,没有特殊的魔法告诉 shell 分配的是环境变量(导出到环境,因此由子进程继承)而不是常规 shell 变量(仅在当前 shell 范围)。

下次您登录时,pam_env它将发挥其魔力,然后JAVA_HOME 出现在 的输出中export | grep JAVA_HOME

也可以看看


van*_*ium 5

echoexport首先, 它们是非常不同的命令。

  • echo将显示文本。在 中echo $JAVA_HOME,shell 将用定义的 shell 变量 JAVA_HOME 的内容替换 $JAVA_HOME。否则,$JAVA_HOME将返回一个空字符串。
  • export为 shell 变量提供“导出”属性。export JAVA_HOME将设置导出属性,即该变量也将在任何子 shell 或子进程的环境中可用,而不仅仅是在当前 shell 中可用。如果尚未设置变量,您可以在导出时定义它,如 中所示export JAVA_HOME=/usr/java11

在 中/etc/environment,环境变量是使用变量赋值的语法注册的。默认Ubuntu安装中的内容/etc/environment确实可以执行。因此,如果您执行包含的行:

`JAVA_HOME=/usr/java11`
Run Code Online (Sandbox Code Playgroud)

然后,要做的就是为 shell 变量 PATH 分配当前值。

但是,因为您在 中包含了该变量/etc/environment,所以它应该在系统下次启动时有效地导出。然后,它应该存在export并显示在echo $JAVA_HOME您打开的第一个终端中。所以你目前观察到的是因为你修改后还没有重启机器/etc/environment(并且没有以其他方式导出变量)。