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

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

环境是Ubuntu 18。

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

echo $JAVA_HOME
/usr/java11

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

export | grep JAVA_HOME
--result is blank--

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

export |grep JAVA_HOME
declare -x JAVA_HOME="/usr/java8"

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

echo $JAVA_HOME
/usr/java11

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

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

答案1

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

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

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

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

也可以看看

答案2

echo 并且export首先就是非常不同的命令。

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

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

`JAVA_HOME=/usr/java11`

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

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

答案3

基于此处的其他答案,一些与此并行export但适用于其他类别变量的命令是set(例如适用于VARIABLE=valuethen set | grep VARIABLE)和env

这三个命令中的每一个,当不给出任何参数时,都会打印一个变量列表;它们将打印哪些变量与命令管理的变量类型有关。

set、export 和 env 之间有什么区别以及我应该何时使用它们?

echo $VARIABLE总是有效的,因为所有类型的变量都可以读作$VARIABLE;然而,这意味着它不会告诉你它是什么类型的变量或者它来自哪里。

答案4

echo是用于将文本和变量打印到标准输出(或重定向)的命令。

export列出 shell 中当前导出的变量。

这个帖子解释了为什么你会用export得比我好得多:

https://stackoverflow.com/questions/7411455/what-does-export-do-in-shell-programming... 它很好地解释了什么是出口

相关内容