~/.bashrcは何も出力してはいけない(するならエラー出力に)

知ってて当たり前の超凡ミス。

起こったこと:rsyncが失敗する

rsyncが何故か失敗してしまう。"protocol incompatibility"と出ていますが、--protocolオプションを指定しても、最新版のrsyncをインストールしても、同じエラーが出ます。なぜでしょう?

Tue Nov  4 12:15:46 2014 Normal: recursive startup rsync: /home/xxxxxxx/Documents/src/xxxxxxx/ -> vagrant@deva:xxxxxxx/ excluding
/cucumber/vendor
/cucumber/.bundle
~/.bashrc loaded
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(174) [sender=3.1.0]
Tue Nov  4 12:15:47 2014 Error: Failure on startup of "/xxxxxxxxx".

原因:~/.bashrcでechoしている

上のログに "~/.bashrc loaded" という行があります。これが原因です。.bashrc*1の最後の行で"echo"していました。もちろん、echo以外でも、何かしらの出力をしてしまうとscpやrsyncはコケます。

# ~/.bashrcの最後の行
echo "~/.bashrc loaded"

これと同じ問題です。

bash - SCP doesn't work when echo in .bashrc? - Stack Overflow

How the SCP protocol works (Jan Pechanec's weblog)によると、 scpは初めにリモート側にプロトコルを問い合わせるのですが、~/.bashrcが何かを出力するとそれが混乱してしまうようです。多分rsyncも同様なのでしょう。

回避策:Greetingは標準エラー出力に出す

echo "~/.bashrc loaded" >&2

*1:安直に、どのOSにもデフォルトで入っているBashを使っています。本物のプログラマならバギーで文法が汚く補完が中途半端なbashではなく、堅牢で高速なdashですよね?分かっています