2つの異なるシステムで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
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
$
Q1:なぜこれが起こっているのですか?
/ bin / shがbashではなくdashを指すようになったことを理解していますが、それが本当なら、なぜ$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の空の文字列を返します。 、テストに合格しました!それは、私の.bashrcのソースに進み、以前と同じエラーを私に与えます。
今、私は本当に混乱しています。
$SHELL
/etc/passwd
(またはgetent passwd
)の最後のフィールドが言うものは何でも。
~/.profile
、bash固有のものをに配置し~/.bashrc
、~/.bash_profile
両方をソースにする必要があります。
dash -l
を$SHELL
持つことも示していることに注意してください/bin/bash
。