不幸的是,没有完全可移植的位置来设置环境变量。最接近的两个文件是~/.profile
,这是传统位置,在许多设置中都是开箱即用的,以及~/.pam_environment
是一种现代,普通但有限的选择。
放入什么 ~/.pam_environment
该文件~/.pam_environment
是由所有的登录方法,其使用读取PAM和启用了此文件。这涵盖了当今的大多数Linux系统。
它的主要优点~/.pam_environment
是(启用时)在用户外壳启动之前读取它,因此无论会话类型,登录外壳和其他复杂性如何,它都可以工作。它甚至适用于非交互式登录,例如su -c somecommand
和ssh somecommand
。
主要的限制~/.pam_environment
是您只能在其中放置简单的分配,而不能在其中放置复杂的Shell语法。该文件的语法如下。
- 文件逐行解析。
- 前导空格被忽略。
- 您可以选择以
export
和一个空格作为开始行(不是制表符,请转到图)。
- 之后,每一行必须采用
VAR=VALUE
VAR由字母,数字和下划线组成的形式。
#
开始注释,它不能出现在值中。
- 如果VALUE以
'
或开头"
并包含另一个相同的引号,则将VAR设置为引号之间的字符串(忽略第二个引号之后的所有内容)。否则,将VAR设置为=
符号后的字符串。
- 如果没有
=
,则将变量从环境中删除。
因此,从好的方面来说,它~/.pam_environment
可以在多种情况下工作。不利的一面是,您无法进行任何动态设置,例如,将变量的值基于另一个变量(例如,将目录添加到PATH)或使用命令的输出(例如,测试是否存在目录或程序),以及一些字符(#'"
,换行符)不可能或很难输入值。
放入什么 ~/.profile
该文件应具有可移植(POSIX)sh语法。仅[[ … ]]
当您知道系统将这些shell作为时,才使用ksh或bash扩展名(数组等)/bin/sh
。
该文件可由自动化应用程序中的脚本读取,因此不应调用产生任何输出的程序或call exec
。如果要在文本模式登录中执行此操作,请仅对交互式外壳执行此操作。例:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
这是一个/bin/sh
用作登录shell并切换到您喜欢的shell 的示例。另请参阅当系统管理员拒绝让我更改bash时如何将其用作登录shell
~/.profile
非图形登录什么时候不读?
不同的登录外壳读取不同的文件。
如果您的登录shell是bash
Bash读取,~/.bash_login
或者~/.bash_profile
它们是否存在而不是~/.profile
。同样~/.bashrc
,即使bash 是交互式的,它也不会在登录shell中读取。为了不再需要记住这些怪癖,请~/.bash_profile
使用以下两行创建一个:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
另请参见应使用哪些设置文件来通过bash设置环境变量?
如果您的登录外壳是zsh
Zsh读取~/.zprofile
和~/.zlogin
,但不读取~/.profile
。Zsh的语法与sh不同,但可以~/.profile
在sh仿真模式下读取。您可以将其用于~/.zprofile
:
emulate sh -c '. ~/.profile'
另请参见Zsh未达到〜/ .profile
如果您的登录外壳是其他外壳
您只能在其中做很多事情,只需将其/bin/sh
用作登录外壳程序并将您喜欢的外壳程序(例如fish)仅用作交互式外壳程序即可。那就是我对zsh所做的。请参阅上面的示例,从中调用另一个shell ~/.profile
。
远程命令
当不通过交互式外壳程序而调用远程命令时,并非所有外壳程序都读取启动文件。
ENV
如果您设法通过Ksh ,则将读取变量指定的文件。
Bash会读取~/.bashrc
它是否不是交互式(!)并且其父进程称为rshd
或sshd
。所以,你就可以开始你~/.bashrc
用
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh始终~/.zshenv
在启动时读取。请谨慎使用,因为zsh的每个单个实例都会读取此内容,即使它是您已设置其他变量的子shell。如果zsh是您的登录shell,并且您想使用它来仅为远程命令设置变量,请使用防护措施:在中设置一些变量~/.profile
,例如和MY_ENVIRONMENT_HAS_BEEN_SET=yes
,并在阅读之前检查此防护措施~/.profile
。
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
图形登录的情况
许多发行版,显示管理器和桌面环境都安排运行~/.profile
,可以通过从启动脚本中明确采购来运行它,也可以通过运行登录外壳程序来运行。
不幸的是,没有一种通用的方法来处理~/.profile
无法读取的发行版/ DM / DE组合。
如果使用以开头的传统会话~/.xsession
,则应在此处设置环境变量。通过获取这样做~/.profile
(即. ~/.profile
)。请注意,在某些设置中,桌面环境启动脚本将~/.profile
再次提供。