环境是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_env
pam_env
当您进入/etc/environment
shell 时,没有什么特殊的魔法可以告诉 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=value
then 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... 它很好地解释了什么是出口