
2 つの異なるシステムで Oneiric の新規インストール (つまり、アップグレードではない) を実行していますが、一見関連しているように見える一連の同じ問題に遭遇しています。
最もイライラするのは、Mac OS X から持ち込んだ .profile と .bashrc を使用すると、LightDM 経由で X にログインするとすぐにログアウトされてしまうことです。これは、"/bin/sh" を実行すると /bin/dash として動作するものの、$SHELL 変数が /bin/bash に設定されているために発生するものだと思います。
外挿
私は巨大なを持っています.bashrc
。あなたはそれを見ることができますここただし、内容は、バシズムでいっぱいであることと、xterm 内または仮想コンソール上でエラーなしで動作するという事実を除けば、おそらく関係ありません。
私の.profile
見た目はこんな感じです(省略):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
LightDM 経由で X にログインしようとすると、すぐにログアウトされてしまいます。.bashrc.xsession-errors
に関連する次のようなエラーが発生します (省略形):
/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 で実行しているときに空の文字列が返されますが、このように .profile に含まれている場合は、テストに合格します。その後、.bashrc をソースし、以前と同じエラーが発生します。
今私は本当に混乱した。
答え1
$BASH_VERSION
空白になっている事実を、dash
次のように活用することができます。
if [ "$BASH_VERSION" = '' ]; then
echo "This is dash."
else
echo "This is bash."
fi
答え2
変数をBASH_VERSION
使用するには引用符を使用する必要があります-n
if [ -n "$BASH_VERSION" ];then
echo "this is bash";
else
echo "this is dash";
fi
答え3
/proc/[PID]/cmdline
スクリプトが何で実行されているかを確認し、スクリプトに何が含まれているかをテストするために使用します。$$
変数は実行中のシェルのPIDを提供します。したがって、次のようなスクリプトを作成できます。
#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
echo "This is bash"
else
echo "This is some other shell"
fi
同じスクリプトのテストを次に示します。
$> bash test_script.sh
This is bash
$> dash test_script.sh
This is some other shell