正确设置环境


15

我正在使用zsh和gdm运行gnome。前一段时间,我发现变量设置不正确。例如LANG / LC_ALL不正确(""而不是en_GB.UTF-8)。

我将.zshrc分为.zshrc.profile。在后者中,我设置了环境变量,但是如何在会话开始之前设置变量?我尝试了几种选择(.xinitrc.xsessionrc),但似乎都没有用。

编辑进行澄清-我在中使用.profile手动获取了它.zshrc。无论如何它不会改变问题。


您是否.profile根本没有加载,还是其他东西覆盖了语言环境变量?(尝试设置像其他一些变量export MACIEJ_PROFILE=yes,以确保。set -x.profile可能是一个很好的方法来检查什么正在被执行后.profile,如果它在所有阅读。)目前在采购没有意义.profile.zshrc
吉尔(Gilles)'所以

这是终端窗口还是其他地方的问题?运行时是否获得所需的语言环境设置ssh localhost zsh?那ssh localhost bash呢 如果bash可以,但zsh不能,那么您可以在/etc/zshenv或中放一些东西~/.zshenv(这几乎总是一个坏主意)。
吉尔斯

没有外壳工作正常(拆分前后)。问题是gnome-session没有设置此变量。
Maciej Piechotka 2010年

Answers:


21

简单的方法是发明一台时间机器,拜访设计shell启动文件的各种人员,并告诉他们清楚地区分三件事:

  • 会话设置,例如环境变量;
  • 会话启动,例如,启动命令行shell或窗口管理器或运行startx
  • Shell初始化,例如别名,提示,键绑定。

以一种可移植的方式正确地实现会话和外壳的关系不是很困难:登录时初始化进入.profile(或.zprofile,或.login),外壳初始化进入.bashrc.zshrc。我以前写过.bash_profilezsh的与其他炮弹更多的可移植性(主要是关于bash)的更多关于谁读.profile

剩下的问题是区分会话建立和会话启动。在大多数情况下,该~/.profile命令在您登录时执行,并且可以兼作两者,但也有例外:

  • 如果您的登录Shell是(t)csh或zsh,~/.login并且~/.zprofile是来源而不是~/.profile。与bash同上了~/.bash_profile,但是这很容易通过~/.profile从那里采购来解决~/.bash_profile
  • 如果在显示管理器(xdm,gdm,kdm等)下登录,则是否~/.profile读取将取决于程序的版本,发行版(Linux或其他)以及所选的会话类型。
    • 如果您依靠显示管理器为您启动会话,则.profile必须设置环境变量但不启动会话(例如,窗口管理器)。
    • X会话的传统配置文件是~/.xsession,同时进行会话设置和会话启动。因此,该文件实质上可以是. ~/.xsession; . ~/.xinitrc~/.profile之前的一些分布源~/.xsession。仅~/.xsession当您从显示管理器中选择“自定义”会话时,现代发行版才作为来源,并且此类会话并非始终可用。
    • 您的会话管理器可能有自己的设置环境变量的方式。(这是桌面环境的可选部分,由您通过配置文件或登录时通过选择会话类型进行选择;不要将其与显示管理器提供的会话启动脚本混淆,该脚本在您的用户下执行,但是在整个系统范围内选择的。是的,这很混乱。)

总之,~/.profile是环境变量的正确位置。如果未读,请尝试从中进行采购~/.xsession(并从此处启动X程序),或寻找特定于系统的方法(这可能取决于您的发行版,显示管理器(如果有),会话类型(如果显示管理器)以及桌面环境或会话管理器)。


.xsession是我要查找的文件。
Maciej Piechotka 2010年

1
除了您的摘要,我都同意。我认为您没有确定这一点。如果您的.profile来源.bashrc或类似来源,那么您不仅可以可靠地.bashrc为登录会话设置环境变量,而且还可以为需要不同设置的新Shell 可靠地设置环境变量,例如,如果您xterm从from 开始gnome-terminal并希望使用dircolors
Mikel 2012年

@Mikel如果在中设置环境变量.bashrc,它们将覆盖以前的设置。例如,如果您使用特定的环境变量启动了Screen或Tmux实例,则您设置的任何内容.bashrc都会覆盖这些设置。LS_COLORS这是一种特殊情况,因为它实际上是每个终端的设置;理想情况下,应由终端仿真器进行设置,并且将其设置在shell rc文件中是一种尽力而为的解决方法。
吉尔斯(Gillles)“所以别再作恶了”

1

在Gentoo文档中,有文章Gentoo Linux本地化指南第3章是关于设置语言环境的。

通常,用户只在全局范围内设置LANG变量。此示例适用于Unicode德语语言环境:

代码3.1:在中设置默认系统区域设置 /etc/env.d/02locale

LANG="en_GB.UTF-8"

在我的Gentoo中LANG已设置此文件,并且一切正常。

pbm@tauri ~ $ cat /etc/env.d/02locale 
LANG="pl_PL.UTF-8"

pbm@tauri ~ $ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=

请注意,您引用的部分还可以,但是指南还建议在中设置环境变量.bashrc,这是错误的(请参见我的回答,尤其是superuser.com/questions/217431)。
吉尔斯(Gilles)“所以,别再邪恶了”

感谢您提供如此详细的信息... :)我从未使用过.bashrc部分-设置env.d更通用。
pbm 2010年

也是按系统而不是按用户。我更喜欢将系统设置与用户设置分开。
Maciej Piechotka 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.