外挿

外挿

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 に問題なくログインできます。(仮想コンソールにログインして、startxX セッションを開始することもできますが、これはもちろん長期的な解決策ではありません。)

しかし、走れば/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

関連情報