時間が空いてしまいましたが、ちょこっと先週調査した内容についてまとめ。
bashの設定ファイルと呼ばれるものとは
aliasとか細々自分のやりたいようにbashを設定したい時に色々やると思うんですよ。
よく使うコマンド系をaliasに貼る、とか
色を変える、だとか
pathを通すとかも含まれるでしょうか。
その方法を調べるとよく
~/.bash_profile
~/.bashrc
がよく名前が上がるかと思います。
あとは上のファイルにちょろっと追記した上で
~/.bash_alias
だとかファイルを追加して分割している方もいらっしゃるようです。
調査の目標と動機
目標
- ~/.bash_profile
- ~/.bashrc
って誰やねん、という疑問を解きたい。
動機
なんで~/.bash_profileだとか~/.bashrcという決め打ちのファイルに設定すればいいんだろう?そしてそれ以外のファイルにいいやつは本当にいないんだろうか?
と思ってしまった。とりあえずmacを使っているので、ターミナルを起動した時にどんな感じで動いているのかが軽く分かればいいかな、というライトな気持ちで調べてみた。
時系列順に調査結果報告
とりあえず/に移動して、profile読み出していそうなものをfindかけてみた。
結果
/etc/profile
/etc/bashrc
というやつがいることがわかった。ふむ。
とりあえず/etc/profileを読むと次のようになっていた。
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
とりあえず$Pathの設定と、bashの場合に限って/etc/bashrcを読みに行ってくれるらしい。
なるほど。
ちなみにshにも分類?というか分岐というか、そんなものがあると初めて知った。
- sh: 元祖BournShell
- bash, ksh, etc..: B系シェルと呼ばれる。bashがよくいるやつ。
- csh, tcsh, etc..: C系シェルと呼ばれるやつ。C言語風らしい。
- zsh: 上記二つのあいのこみたいなやつ?らしい。使ってないからわからん。
- fish: なんか先輩が使いやすいって言ってた。
/etc/profile にある${BASH-no}ってbashを使用していないときは"no"って入ってて、/etc/bashrcは読み込まれなくなっているっぽい。
まぁどっかで入れているんだろう。
さて
現状まだターミナルを起動した時に~/.profileだとかが読み込まれている気配はない。
というわけで先輩に助言をいただいたところ、なんとSystem系のUtilだし、Linux-sourceみてみたら?とのこと。
ガチンコやないか、、、
.
.
.
profileさえ分かればいいので、linuxのドキュメントをダウンロードしてfindかけて必要そうな内容をつまんでいくことに。
https://github.com/tkmru/linux-insides-ja/blob/master/SysCall/syscall-4.md
こちらにありがたいことにbash関連のコメントが発見された。
要はbash起動時の話なんだけれど、とりあえず起動時にこんなことしているよ、とのこと
- checks and tries to open /dev/tty;
- check that shell running in debug mode;
- parses command line arguments;
- reads shell environment;
- loads .bashrc, .profile and other configuration files;
- and many many more.
なるへそ。
下から2番目の[loads...]あたりが多分私が知りたいことなのだろう。
というわけでbashのソースの中のshell.cに含まれるmainを読みに行きましたとさ。
https://github.com/bminor/bash/blob/master/shell.c
Cやってないから辛いよと思いつつ
プリプロセッサなんてものがいるのかと思いつつ
探してみたところありましたよ。
ファイル名は全て変数に直打ちで
- profile使わない設定をしていないのであれば必ず
=> /etc/profile - sh を使うのであれば
=> ~/.profile - bashを使うのであれば上から順に探してあったらそこまで
=> ~/.bash_profile
=> ~/.bash_login
=> ~/.profile
と読みにいくよ
と分岐の流れから完全に書いてありました。
そしてbashrcに関してはprofileでは読みにいっていません。
/etc/bashrcに関しては上でのせた/etc/profileで読みにいくようになっています。
~/.bashrcに関しては、~/.profileにbashrcの設定を読みにいくように追記することが多いようです。
というように両方の設定方針は揃えてあるようですね。
はい。
実際にあのファイル名でないと読みにいってはくれないということがわかったので私は満足。
というわけで備忘でした。