.bashrcでexportしたPATHが/procにあるプロセスファイルの環境変数(PATH)と一致しないように見える
Ubunt 15.04
を使っています。
どういう際に利用するかは措いておくとして、/proc
にある各プロセスIDの名前がついたディレクトリにある、environ
というファイルを、プログラミング時の環境変数取得に利用できないかと思いました。
そこで、例えば、gnome端末エミュレータから起動したシェルのPATH
であれば次のように取得できることを確認しました。
$echo $$
3009
$ tr '\000' '\012' < /proc/3009/environ | grep ^PATH
PATH=/home/cul8er/bin:/home/cul8er/.gem/ruby/2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
念の為、実際にPATH
をecho
で表示させました。
$ echo $PATH
/home/cul8er/jdk1.8.0_60/bin:/home/cul8er/bin:/home/cul8er/.gem/ruby/2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
/home/cul8er/jdk1.8.0_60/bin
が加わっています。つまり、/proc
の情報と異なっています。
調べると、過去にnetbeansを使うためにインストールしたjavaを使えるよう.bashrc
でPATH
を設定していました。
-- /home/cul8er/.bashrc --
export JAVA_HOME=$HOME/jdk1.8.0_60
export PATH=$JAVA_HOME/bin:$PATH
.profile
でもrubyを実行するためにPATH
情報の変更がされていました。(なんでこういう違いを作ったのかは思いだせません…)
-- /home/cul8er/.profile
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$HOME/.gem/ruby/2.1.0/bin:$PATH"
fi
.profile
内で.
コマンドを使って.bashrc
を呼び出している点に加えて、通例言われているところであれば、.profile
もログインシェルから.
コマンドで実行されるはずなので、.bashrc
で変数をexport
すれば問題なくログインシェルの環境変数として使えるはずですし、実際echo
の表示がそれを裏付けているように思えます。
カレントシェルがログインシェルでなくてもサブシェルなら.bashrc
は起動されるはずですからなおさらです。
それが/proc
以下のenviron
ファイルでは.profile
での設定しか含まれていません。
man proc
でオンラインヘルプを読むと以下の記述しか見つけられませんでした。
/proc/[pid]/environ このファイルはプロセスの環境変数を含んでいる。 各エントリはヌルバイト ('\0')
で区切られていて、 末尾にヌルバイトがあるかもしれない。
こういうものだと現実から理解するのも悪くないですが、単純に自分が無知なままでプログラミングすると後に無用な苦労をすることも多々ありますので、.bashrc
での設定が生かされない理由を、分かるものなら知りたいです。
ヒントでもいいのでご教示おねがいします。