bash

NetBSDの環境を整えようと久しぶりに新規の環境構築(当然一般ユーザ)。
何年ぶりだ?
ちょっと楽しいかも(*^_^*

標準ではシェルがsh、ksh、cshしか入っていないのでbashをインストール。
# pkg_add bash
その他もいつも通り、
# pkg_add screen
# pkg_add rsync
# pkg_add lynx
# pkg_add wget
# pkg_add gnupg
# pkg_add bunzip
# pkg_add bzip2
# pkg_add perl
# pkg_add zip
# pkg_add unzip
# pkg_add sudo
とかやって各種ツールをインストール。
で、.bashrc書いて・・・ログアウトして、再度ログイン。
$ history
ありゃ?ヒストリー保存されてない!?
→ .bash_historyの所有者がrootになってました(@_@ 

で、色々.bashrcに追加してたのですが、どうも.bashrcが読まれてない・・・気がする。

ktraceでチェック
$ ktrace -t n bash
bash$ exit
exit
$ kdump -f ktrace.out
  1491      1 ktrace   NAMI  "/home/gyao/bin/bash"
  1491      1 ktrace   NAMI  "/bin/bash"
  1491      1 ktrace   NAMI  "/sbin/bash"
  1491      1 ktrace   NAMI  "/usr/bin/bash"
  1491      1 ktrace   NAMI  "/usr/sbin/bash"
  1491      1 ktrace   NAMI  "/usr/X11R6/bin/bash"
  1491      1 ktrace   NAMI  "/usr/pkg/bin/bash"
  1491      1 ktrace   NAMI  "/usr/libexec/ld.elf_so"
  1491      1 bash     NAMI  "/etc/ld.so.conf"
  1491      1 bash     NAMI  "/usr/pkg/lib/libtermcap.so.0"
  1491      1 bash     NAMI  "/usr/lib/libtermcap.so.0"
  1491      1 bash     NAMI  "/usr/pkg/lib/libintl.so.0"
  1491      1 bash     NAMI  "/usr/lib/libintl.so.0"
  1491      1 bash     NAMI  "/usr/pkg/lib/libc.so.12"
  1491      1 bash     NAMI  "/usr/lib/libc.so.12"
  1491      1 bash     NAMI  "/dev/tty"
  1491      1 bash     NAMI  "/etc/nsswitch.conf"
  1491      1 bash     NAMI  "/etc/nsswitch.conf"
  1491      1 bash     NAMI  "/usr/pkg/lib/nss_compat.so.0"
  1491      1 bash     NAMI  "/usr/lib/nss_compat.so.0"
  1491      1 bash     NAMI  "/usr/pkg/lib/nss_nis.so.0"
  1491      1 bash     NAMI  "/usr/lib/nss_nis.so.0"
  1491      1 bash     NAMI  "/usr/pkg/lib/nss_files.so.0"
  1491      1 bash     NAMI  "/usr/lib/nss_files.so.0"
  1491      1 bash     NAMI  "/usr/pkg/lib/nss_dns.so.0"
  1491      1 bash     NAMI  "/usr/lib/nss_dns.so.0"
  1491      1 bash     NAMI  "/etc/pwd.db"
  1491      1 bash     NAMI  "/etc/pwd.db"
  1491      1 bash     NAMI  "/etc/nsswitch.conf"
  1491      1 bash     NAMI  "/home/gyao"
  1491      1 bash     NAMI  "."
  1491      1 bash     NAMI  "."
  1491      1 bash     NAMI  "/home/gyao/bin/bash"
  1491      1 bash     NAMI  "/bin/bash"
  1491      1 bash     NAMI  "/sbin/bash"
  1491      1 bash     NAMI  "/usr/bin/bash"
  1491      1 bash     NAMI  "/usr/sbin/bash"
  1491      1 bash     NAMI  "/usr/X11R6/bin/bash"
  1491      1 bash     NAMI  "/usr/pkg/bin/bash"
  1491      1 bash     NAMI  "/usr/pkg/bin/bash"
  1491      1 bash     NAMI  "/home/gyao/.bashrc" ← 読み込まれてる
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/var/mail/gyao"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/etc/localtime"
  1491      1 bash     NAMI  "/etc/localtime"
  1491      1 bash     NAMI  "/home/gyao/.termcap.db"
  1491      1 bash     NAMI  "/home/gyao/.termcap.db"
  1491      1 bash     NAMI  "/home/gyao/.termcap"
  1491      1 bash     NAMI  "/usr/share/misc/termcap.db"
  1491      1 bash     NAMI  "/usr/share/misc/termcap.db"
  1491      1 bash     NAMI  "/home/gyao/.inputrc"
  1491      1 bash     NAMI  "/etc/inputrc"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
  1491      1 bash     NAMI  "/home/gyao/.bash_history"
$

実際に実行されてる?って調べると
ログインシェル → .bashrcが読み込まれない
シェル上からbashを起動 → .bashrcが読み込まれる

なんでだろうか?と調べたが、結局bashのman pageで解決した

bash が対話的なログインシェルとして起動されるか、 --login オプション付きの非対話的シェルとして起動されると、 /etc/profile ファイルが存在すれば、 bash はまずここからコマンドを読み込んで実行します。 このファイルを読んだ後、 bash~/.bash_profile, ~/.bash_login, ~/.profile をこの 順番で探します。 bash は、この中で最初に見つかり、かつ読み込みが可能であるファイルから コマンドを読み込んで実行します。 --noprofile オプションを使ってシェルを起動すれば、 この動作を行わないようにできます。

できればbashの時だけ限定にしたいという事から
.profile → sh使うときも読み込まれるので、NG
残り、.bash_profileか.bash_loginということになる。別にどっちでもイイので、.bash_profileを採用。
$ cp .bashrc .bash_profile
で希望通りの動作に。

でも、今までの環境ってどうなってたの??という疑問があったので見てみた。
$ cat .bash_profile
#!/bin/sh
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
elif [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
しっかり、.bsdh_profile使ってました!しかも、.bashrcが読み込まれるようになってました。。。で、そんなことはすっかり忘れて.bashrcだけ触ってた・・・と。

結局、、、bashのmanページに続きがあって、、

bash は、自分を起動したのがリモートシェルデーモン (通常は rshd) かどうかを調べます。 rshd によって実行されていると bash が判断した場合、 ~/.bashrc が存在し、かつ読み込み可能であれば、 bash はコマンドをこのファイルから読み込んで実行します。 sh として呼び出された場合には、この動作は行いません。 --norc オプションを使えばこの動作を禁止できますし、 --rcfile オプションを使えば他のファイルを読ませるようにもできます。 しかし一般的には rshd は これらのオプションを付けてシェルを起動しませんし、 指定もできないようになっています。

とかいう記述もあったので、結局元の環境と同じにしました。触る必要のあるファイルが2つになるとまた混乱するので。(シンボリックリンク張って・・・も考えたけど)


まだまだ色々カスタマイズしないと・・・