ter*_*don 32 bash design .profile bashrc
这些是~/.profile
我的 13.10 附带的股票内容(已删除注释行):
if [ -n "$BASH_VERSION" ]; then
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Run Code Online (Sandbox Code Playgroud)
这是从 Debian 继承的,但为什么 Canonical 决定保留它?据我所知,这不是标准的 *nix 方式,我见过各种系统都没有发生这种情况,所以我认为他们一定有充分的理由这样做。这可能会导致在运行登录 shell 时出现意外行为(例如,当 ssh 进入机器时),而用户不希望有~/.bashrc
来源。
我能想到的唯一好处是不要将用户与许多启动文件混淆,并允许他们.bashrc
单独编辑并读取该文件,而不管 shell 类型。然而,这是一个可疑的好处,因为为登录和交互式 shell 设置不同的设置通常很有用,这会阻止您这样做。此外,登录 shell 通常不在图形环境中运行,这可能会导致错误、警告和问题(天哪!),具体取决于您在这些文件中设置的内容。
那么为什么 Ubuntu 会这样做,我错过了什么?
ter*_*don 16
这是来自 Debian 的上游决定。其原理在这个非常好的wiki 帖子 中进行了解释,以下是其中的摘录。执行摘要是“确保 GUI 和非 GUI 登录以相同的方式工作”:
我们以 xdm 为例。pierre 有一天休假回来,发现他的系统管理员在 Debian 系统上安装了 xdm。他登录得很好,xdm 读取了他的 .xsession 文件并运行了fluxbox。一切似乎都很好,直到他在错误的语言环境中收到错误消息!由于他覆盖了 .bash_profile 中的 LANG 变量,并且 xdm 从不读取 .bash_profile,因此他的 LANG 变量现在设置为 en_US 而不是 fr_CA。
现在,这个问题的天真解决方案是,他可以配置他的窗口管理器来启动“xterm -ls”,而不是启动“xterm”。这个标志告诉 xterm 它应该启动一个登录 shell 而不是启动一个普通的 shell。在这种设置下,xterm 生成 /bin/bash 但它把“-/bin/bash”(或者可能是“-bash”)放在参数向量中,所以 bash 就像一个登录 shell。这意味着每次他打开一个新的 xterm 时,它都会读取 /etc/profile 和 .bash_profile(内置 bash 行为),然后是 .bashrc(因为 .bash_profile 说要这样做)。起初这似乎工作得很好——他的点文件并不重,所以他甚至没有注意到延迟——但还有一个更微妙的问题。他还直接从他的 Fluxbox 菜单启动了一个网络浏览器,并且 Web 浏览器继承了 Fluxbox 的 LANG 变量,该变量现在设置为错误的语言环境。因此,尽管他的 xterms 可能没问题,并且从他的 xterms 启动的任何内容都可能没问题,但他的 Web 浏览器仍然为他提供了错误区域设置的页面。
那么,这个问题的最佳解决方案是什么?真的没有万能的。更好的方法是将 .xsession 文件修改为如下所示:
Run Code Online (Sandbox Code Playgroud)[ -r /etc/profile ] && source /etc/profile [ -r ~/.bash_profile ] && source ~/.bash_profile xmodmap -e 'keysym Super_R = Multi_key' xterm & exec fluxbox
这会导致解释 .xsession 脚本的 shell 在运行 xmodmap 或 xterm 或“执行”窗口管理器之前读取 /etc/profile 和 .bash_profile 如果它们存在且可读。但是,这种方法有一个潜在的缺点:在 xdm 下,读取 .xsession 的 shell 在没有控制终端的情况下运行。如果 /etc/profile 或 .bash_profile 使用任何假设存在终端的命令(例如“fortune”或“stty”),这些命令可能会失败。这是 xdm 默认不读取这些文件的主要原因。如果您打算使用这种方法,您必须确保“点文件”中的所有命令在没有终端时都可以安全运行。