--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/09/02

ubuntu でログイン時に .bash_profile が読み込まれない

参考URL:

どうやら ubuntu ではデフォルトだと、グラフィカルログインの時には $HOME/.bash_profile が読み込まれない設定らしい。/etc/gdm/Xsession を編集してやることで、これを回避できる。

参考URLに紹介してある /etc/gdm/Xsession のように、

sudo vi /etc/gdm/Xsession

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.bash_profile" && . "$HOME/.bash_profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

のように、bash_profile を読み込むよう設定してやればよい。

ちなみにデフォルトだと、$HOME/.profile というファイルが読み込まれる設定になっていた。デフォルトシェルが bash なんだから .bash_profile 読み込むようにしときゃいいもんを、なぜこういう設定になっているのかが謎。

追記

ログインしなおしてみようとしたところ、何やらエラーが出てログインすることができなかった。おそらく原因は ~/.bash_profile 内で ~/.bashrc を読み込むという処理が行われるタイミングが、早すぎるのではという結論に達した。

デフォルトの ~/.bash_profile では、以下のようにして ~/.bashrc を読み込んでいると思う。少なくとも僕はそうだった。

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

ところが、デフォルトの設定で ~/.bash_profile の代わりに読み込まれるようになっていた、 ~/.profile 内では、この処理を以下のように行っていた。

if [ -n "$BASH_VERSION" ]; then
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi
fi

BASH_VERSION が null ではないかというチェックが外についている。これが何を意味するのかはまだ分かっていないが、とりあえずこれに ~/.bash_profile もあわせるよう修正したところ、エラーは止まった。

それとこの ~/.bash_profile の読み込み問題とは関係ないが、デフォルトの ~/.bash_profile で、~/bin の設定のしかたが少しまずかったので指摘しておく。デフォルトではこのように記述してある。

if [ -d ~/bin ]; then
    PATH=~/bin:"${PATH}"
fi

つまり、~/bin というディレクトリが存在した場合、 $PATH の先頭に設定されている。これがまずい。

ユーザ固有の実行ファイルが詰められるであろう ~/bin は、システムの bin ディレクトリ、(/bin, /usr/bin, /usr/X11/bin などなど)よりも常に後に来るべき。

理由は簡単で、コマンドを実行する際、bash はこの $PATH に設定されたディレクトリを走って入力されたコマンドを探しにいくわけだが、当然先頭から探しにいくわけだ。つまりシステムの実行ファイルと同じ名前の実行ファイルが ~/bin の中にあった場合、 ~/bin の中のものが呼ばれてしまう。これはあまりに無謀である。それに加えてクラッカー達がこの危険な PATH と suid ビットを組み合わせて、セキュリティホールを作るシナリオがあるからだ。と、入門 bash に書いてあった。なので詳しいことは実は知らない。とりあえず危険らしい。

なので、以下のように修正するといい。ついでになぜか2度追加される現象が起こったので、それを防ぐ処理も追加している。

if [ -d ~/bin ]; then
    if [ ! "$(echo $PATH | grep $HOME/bin)" ]; then
        PATH=$PATH:~/bin
    fi
fi

これで無事 $PATH の最後に ~/bin が追加され、かつ重複追加も防ぐことができる。

もういっちょ追記

BASH_VERSION が null ではないかというチェックが外についている。これが何を意味するのかはまだ分かっていないが、とりあえずこれに ~/.bash_profile もあわせるよう修正したところ、エラーは止まった。

~/.profile のコメントに思いっきり書いてあった。

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f ~/.bashrc ]; then
	. ~/.bashrc
    fi
fi

要するに bash が走ってるかどうかのチェックをしてるみたい。

修正

~/.bash_profile における PATH の二重追加を防ぐために入れていた if 文の grep のところを、 $HOME/bin にした。こっちのほうがより正確かなと。

スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。