cronからシェルスクリプトを起動するのに、bashrcのPATHの設定を使いたくて、
source ~/.bashrc
と書いたのに、設定が読み込まれない。
なぜかと首をひねっていたら、bashrcの冒頭に以下の記述がありました。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
man bash
によると、
対話的なシェルとは、 オプションでない引き数がなく、 標準入力と標準エラー出力がいずれも端末に接続されていて (これは isatty(3) で調べられます)、 -c オプションが指定されていない状態で起動されたシェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $- に i が含まれます。 これを利用すると、対話的動作の状態であるかどうかを、 シェルスクリプトや起動ファイルの内部で調べられます。
つまり、シェルスクリプトからsource ~/.bashrc
としても、対話的シェルではないので$-
にi
が含まれず、returnしてしまうわけです。
Ubuntu14.04のデフォルトの.bashrcをそのまま使ってたので気づきませんでした……
.bash_profileはshebangを#!/bin/bash -l
とすれば自動で読み込まれるので、PATHはそちらに書いたほうが良さそうです