环境是Ubuntu 18。
如果我在/etc/ JAVA_HOME="/usr/java11"中添加一行source /etc/environment并执行D1,我可以回显这个环境变量:
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 11:
echo $JAVA_HOME
/usr/java11问:echo $variable和export | grep JAVA_HOME有什么区别?
我尝试一个简单的python程序,os.environ.get("JAVA_HOME")从导出返回“/usr/java8 8”,而不是回显。
发布于 2021-09-22 21:56:54
这里的问题实际上不是echo和export之间的区别,而是环境变量和简单shell变量之间的区别(以及/etc/environment文件通常是如何使用的)。
特别是,尽管/etc/environment碰巧包含作为POSIX变量赋值有效的表单name=value的行,但它的主要用途(在现代Linux系统中)是在用户会话初始化期间由pam_env模块读取--是pam_env将它们导出到用户的环境中。
当您将/etc/environment源到您的shell中时,没有什么特殊的魔力可以告诉shell,赋值是环境变量的赋值(这些变量被导出到环境中,因此由子进程继承),而不是常规的shell变量(这些变量仅在当前shell作用域中可用)。
下次登录时,pam_env将使用它的魔力,然后JAVA_HOME将出现在export | grep JAVA_HOME的输出中。
另请参阅
发布于 2021-09-23 07:38:53
首先,echo和export是非常不同的命令。
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`然后,所要做的就是将shell变量路径赋给当前值。
但是,由于您在/etc/environment中包含了变量,因此应该在系统下一次启动时有效地导出该变量。然后,它应该存在于export中,并显示在您打开的第一个终端中的echo $JAVA_HOME中。因此,您目前所观察到的是,在修改/etc/environment之后还没有重新启动机器(并且没有以其他方式导出变量)。
发布于 2021-09-23 16:33:50
在这里的其他答案的基础上,一些并行export的命令,但是对于其他类型的变量,是set (它适用于VARIABLE=value然后set | grep VARIABLE)和env。
当没有参数时,这三个命令中的每一个都会打印变量列表;它们要打印的变量与命令管理的变量类型有关。
请参阅设置、导出和env的区别是什么?我应该在什么时候使用它们?
echo $VARIABLE总是工作的,因为所有类型的变量都可以作为$VARIABLE读取;但是,这意味着它没有给您提供关于它是哪种变量或它来自哪里的信息。
https://askubuntu.com/questions/1365246
复制相似问题