为什么环境变量持久化会破坏 PATH var?

为什么环境变量持久化会破坏 PATH var?

我尝试使用/etc/environment.

它清除了我的PATH变量;之后没有识别到​​任何命令。

为什么会发生这种情况,因为在 shell 中执行相同的命令就可以正常工作?!

我的内容/etc/environment

ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib

答案1

/etc/environment是一个配置文件pam_env,不是 shell 读取的文件。语法有些相似,但又不一样。特别是,您不能引用现有变量:您已将搜索路径设置为包含$ORACLE_HOME/bin$PATH,即名称中带有美元符号的目录。

要为所有用户设置变量,您可以 edit /etc/security/pam_env.conf,它具有不同的、更丰富的语法,但仍然不如您在 shell 中可以执行的操作丰富。

ORACLE_HOME DEFAULT=/usr/lib/oracle/12.1/client64
PATH OVERRIDE=/usr/local/bin:/usr/bin:/bin:${ORACLE_HOME}/bin
LD_LIBRARY_PATH DEFAULT=$ORACLE_HOME/lib

请注意,您可以引用其他变量,但不能引用变量的先前值。

如果您想要更灵活的方法,请添加变量定义/etc/profile。在那里您可以使用所有 shell 结构。缺点是这只能在登录会话中读取,而不是通过 cron 等读取。. /etc/profile;不过,通过在 cron 作业的开头添加,您可以轻松地从它们中受益。

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

答案2

中的作业/etc/environment应该是出口。否则它们的值不会被使用。如果你使用“.”要获取文件,那么您将使用以下语法:

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

但如前所述,/etc/environment并不打算获取来源(例如参见为所有用户持久设置环境变量的值)。

根据6.6. pam_env - 设置/取消设置环境变量(Linux-PAM 系统管理员指南):

PAMpam_env模块允许设置(取消)环境变量。支持使用先前设置的环境变量以及 PAM_ITEM,例如PAM_RHOST.

/etc/security/pam_env.conf默认情况下,如果未指定其他文件,则从配置文件中获取变量设置(取消)的规则。

该模块还可以使用简单的方法解析文件键=值在不同的行上配对(/etc/environment默认情况下)。您可以使用 envfile 标志更改要解析的默认文件,并通过readenv分别将该标志设置为 1 或 0 来打开或关闭它。

由于 PAM 环境变量的设置可能会对其他模块产生副作用,因此该模块应该是堆栈上的最后一个。

也就是说,PAM(对用户进行身份验证)读取该文件,如果它不理解您设置的值,则会将该变量设置为没有什么

相反,如果您进行了修改/etc/profile,您会得到更好的结果。但阅读文件顶部的评论:

# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

/etc/profile.d/custom.sh通过使用您的设置创建文件,您会得到更好的结果。

但是,您可能会因该设置而遇到麻烦LD_LIBRARY_PATH。相反,您应该通过例如将目录添加到配置中/etc/ld.so.conf.d,例如作为文件,例如/etc/ld.so.conf.d/oracle包含路径:

/usr/lib/oracle/12.1/client64/lib

进一步阅读:

相关内容