Mic*_*ter 13 bash scripts dash-shell
我正在两个不同的系统上运行全新的 Oneiric 安装(即不是升级),并且遇到了相同的一组看似相关的问题。
最令人沮丧的是,当我使用从 Mac OS X 随身携带的 .profile 和 .bashrc 时,通过 LightDM 登录到 X 会立即将我注销。我相信这是因为当运行“/bin/sh”时,它表现为/bin/dash,但仍然将$SHELL 变量设置为/bin/bash。
我有一个巨大的.bashrc。如果你愿意,你可以在这里看到它,但它的内容可能不相关,除了它充满了 bashism 的事实,以及它在 xterm 内或在虚拟控制台上没有错误的事实。
我的.profile样子是这样的(缩写):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Run Code Online (Sandbox Code Playgroud)
如果我尝试通过 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
Run Code Online (Sandbox Code Playgroud)
正如我所说,当我从虚拟控制台运行 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
$
Run Code Online (Sandbox Code Playgroud)
我知道/bin/sh 现在指向 dash 而不是 bash,但如果这是真的,那么为什么$SHELL仍然返回/bin/bash?
有没有办法解决这个问题?我想保持我的配置文件加载 .bashrc 以便我在登录和非登录 shell 上获得相同的环境,但显然我只希望它为 bash 本身加载,而不是 /bin/sh 伪装成 bash。
您可能已经注意到上面 $BASH_VERSION 变量的内容有所不同。我试过将我的 .profile 包装成这样:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
Run Code Online (Sandbox Code Playgroud)
该-n只如果字符串的长度为非零在上述会议上试验应返回true,但是,即使当我跑下/bin/sh -l它返回$ BASH_VERSION一个空字符串,当它包含在我的.profile这样,它通过了测试!他们继续获取我的 .bashrc 并给我和以前一样的错误。
现在我真的很困惑。
Sco*_*nce 12
你可以让$BASH_VERSION空白的事实dash为你工作:
if [ "$BASH_VERSION" = '' ]; then
echo "This is dash."
else
echo "This is bash."
fi
Run Code Online (Sandbox Code Playgroud)
您只需要在变量上使用引号BASH_VERSION即可使用-n
if [ -n "$BASH_VERSION" ];then
echo "this is bash";
else
echo "this is dash";
fi
Run Code Online (Sandbox Code Playgroud)