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_env
pam_env
当您/etc/environment
进入 shell 时,没有特殊的魔法告诉 shell 分配的是环境变量(导出到环境,因此由子进程继承)而不是常规 shell 变量(仅在当前 shell 范围)。
下次您登录时,pam_env
它将发挥其魔力,然后JAVA_HOME
出现在 的输出中export | grep JAVA_HOME
。
也可以看看
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`
Run Code Online (Sandbox Code Playgroud)
然后,要做的就是为 shell 变量 PATH 分配当前值。
但是,因为您在 中包含了该变量/etc/environment
,所以它应该在系统下次启动时有效地导出。然后,它应该存在export
并显示在echo $JAVA_HOME
您打开的第一个终端中。所以你目前观察到的是因为你修改后还没有重启机器/etc/environment
(并且没有以其他方式导出变量)。
归档时间: |
|
查看次数: |
8863 次 |
最近记录: |