我正在两个不同的系统上运行全新的Oneiric安装(即不是升级),并且遇到了一系列看似相关的问题。
最令人沮丧的是,当我使用从Mac OS X附带的.profile和.bashrc时,通过LightDM登录到X会使我立即注销。我相信这是由于以下事实造成的:当运行“ / bin / sh”时,它的行为类似于/ bin / dash,但仍将$ SHELL变量设置为/ bin / bash。
外推法
我有一个巨大的.bashrc
。如果需要,您可以在这里看到它,但是它的内容可能不相关,除了它充满了bashisms的事实,而且它在xterm内或虚拟控制台上没有错误地工作。
我的.profile
样子如下(略):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
如果我尝试通过LightDM登录到X,它将立即使我注销。我收到.xsession-errors
与.bashrc相关的错误,看起来像这样(缩写):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
就像我说的那样,当我从虚拟控制台运行bash时,不会出现这些错误。此外,如果删除.profile,则可以正常登录X。(我也可以登录到虚拟控制台,并startx
用来启动有效的X会话,但这当然不是一个长期的解决方案。)
但是,我发现,如果运行/bin/sh -l
,我会得到错误。这是一个示例会话(请注意:我简化为bash提示符bash>
,而sh提示符只是$
):
bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
$
问题1:为什么会这样?
我知道/ bin / sh现在指向破折号而不是bash,但是如果这是真的,那么为什么$SHELL
仍然返回/bin/bash
?
Q2:我该如何解决?
有办法解决这个问题吗?我想保持我的配置文件加载.bashrc,以便在登录和非登录外壳上都具有相同的环境,但是显然我只希望它为bash本身加载,而不是/ bin / sh伪装成bash。
您可能已经注意到上面$ BASH_VERSION变量的内容有所不同。我试过将我的.profile包装成这样的东西:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
该-n
只如果字符串的长度为非零在上述会议上试验应返回true,但是,即使当我跑下/bin/sh -l
它返回$ BASH_VERSION一个空字符串,当它包含在我的.profile这样,它通过了测试!他们继续获取我的.bashrc并给我和以前一样的错误。
现在我真的很困惑。
$SHELL
是/etc/passwd
(或getent passwd
)中最后一个字段所说的。
~/.profile
,bash专用的东西放在中~/.bashrc
,并同时提供~/.bash_profile
源代码。
dash -l
也显示$SHELL
具有/bin/bash
。