シェルの初期化を調べたキッカケ
先日新たにセットアップしたcentOSインスタンスにrsyncしようとしたところ、
下記エラーが起こった。
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(69)
rsyncのoptionでなにかミスったかと思ったけど、
ぐぐってココで
There is probably a script producing output in your .bash_profile or similar file
とおっしゃっていた。
sshでサーバへ接続してみると接続直後に
Now using node v0.10.29
が出力されていた。
シェル初期化について
シェルは、起動時の環境設定を下記のように読み込む
- /etc/profileがあれば読み込む
- シェルがログインシェルとして起動されたか否か
- ログインシェルとして起動された場合、~/.bash_profileか~/.bash_loginか~/.profileの最初に見つかったファイルを読み込み
- 非ログインシェルの場合、~/.bashrcを読み込み
~/.bash_profileや ~/.bashrcの中ではnodeのバージョンに関する処理はなかった。
/etc/profileの最後で/etc/profile.d/ 配下のシェルを実行していることが分かった。
/etc/profile
の一部抜粋
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
/etc/profile.d/
にあるファイルをみると
PS1.sh やら、colorls.cshやら
grep.sh、lang.csh、lang.sh、less.csh
less.sh、node.sh、nvm.sh、vim.csh、
vim.sh、which2.sh
アプリケーション毎の設定を書いている模様。
vim.sh
ファイルの中身は、
$ cat /etc/profile.d/vim.sh
if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
[ -x /usr/bin/id ] || return
ID=`/usr/bin/id -u`
[ -n "$ID" -a "$ID" -le 200 ] && return
# for bash and zsh, only if no alias is already set
alias vi >/dev/null 2>&1 || alias vi=vim
fi
vim ファイル名 = vi ファイル
なのは、このシェルが初期化で実行されているからなのか!!
シェル実行時、標準出力を止める
さて、node関連は nvm.sh
に間違いない。
nvm.sh
. /usr/local/nvm/nvm.sh
nvm use v0.10.29
nvm use v0.10.29
をnvm use v0.10.29 > /dev/null
に修正
問題なくrsyncできるようになった(●^o^●)