我尝试使用/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 系统管理员指南):
PAM
pam_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
进一步阅读: