在 /etc/environment 中设置变量没有影响,但在命令行中设置它们是

在 /etc/environment 中设置变量没有影响,但在命令行中设置它们是

我正在设置某些环境变量以使命令pyspark正常工作。当我设置变量/etc/environment并获取它时,它不起作用。但是,当我在命令行中设置它们时,它们确实可以工作,但当然仅适用于本次会话。我的目的是将它们设置为全局,这样即使我重新打开会话我也可以输入pyspark

在/etc/environment中设置

[root@localhost ~]# more /etc/environment
[root@localhost ~]# echo "export SPARK_HOME=/srv/spark" >> /etc/environment
[root@localhost ~]# echo "export PATH="$SPARK_HOME"/bin:"$PATH >> /etc/environment
[root@localhost ~]# echo "export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk" >> /etc/environment
[root@localhost ~]# source /etc/environment
[root@localhost ~]# pyspark --version
-bash: pyspark: command not found

在命令行上设置

[root@localhost ~]# export SPARK_HOME=/srv/spark
[root@localhost ~]# export PATH=$SPARK_HOME/bin:$PATH
[root@localhost ~]# export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk
[root@localhost ~]# pyspark --version
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.1
      /_/

Type --help for more information.

答案1

export SPARK_HOME=...等命令放入 shell 的启动文件中。对于 bash,这将是~/.profile~/.bash_profile


在Linux上,/etc/environment通常在登录时读取pam_env.so,并且不支持扩展现有变量,因此设置PATH=$PATH:/something将导致文字字符串$PATH出现在您的PATH.这不是你想要的。 (参见例如,也为了好玩.)

此外,设置PATH可能/etc/environment不起作用,因为 shell 的全局启动脚本可能会重写它们。 (默认情况下,它们在 Debian 上执行,在我手边的旧 CentOS 上执行,启动脚本似乎只放在前面PATH)。

如果您的系统不使用pam_env.so,但您仅手动获取脚本,那么这些考虑因素当然并不重要。但看起来它至少被几个 Linux 发行版广泛使用,因此使用另一个文件名可能是个好主意。


(因为这与其他答案所说的完全相反,所以我在旧的 CentOS 上测试了它。)

我将以下内容放入/etc/environment

export FOO1=bar
export FOO2=foo:$FOO

再次登录后set | grep FOO显示:

FOO1=bar
FOO2='foo:$FOO'

答案2

这行代码并不符合您的想法:

echo "export PATH="$SPARK_HOME"/bin:"$PATH >> /etc/environment

问题是$SPARK_HOME正在评估期间echo(按原样$PATH;您可能不希望您的当前的该文件中的路径)。

如果你cat /etc/environment会发现这条线看起来不正确。

相反,使用

echo 'export PATH="$SPARK_HOME/bin:$PATH"' >> /etc/environment

这将在您创建文件时使用$SPARK_HOME和的值。$PATHsource

相关内容