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

Omn*_*ent 8 centos environment-variables

我正在为命令设置某些环境变量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
Run Code Online (Sandbox Code Playgroud)

命令行设置

[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.
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 14

export SPARK_HOME=...etc. 命令放在 shell 的启动文件中。使用 bash,这将是~/.profile~/.bash_profile


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

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

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


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

我把以下内容/etc/environment

export FOO1=bar
export FOO2=foo:$FOO
Run Code Online (Sandbox Code Playgroud)

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

FOO1=bar
FOO2='foo:$FOO'
Run Code Online (Sandbox Code Playgroud)