[Ubuntu][Shell]Ubuntuの/bin/shでsourceコマンドが効かない件

virtualenv(wrapper)環境で動作するPythonスクリプトをcronで運用したくて 下記のようなシェルスクリプトを書いたのですが、

#!/bin/sh
export LANG=ja_JP.utf-8
export ENV_NAME=test
export VIRTUALENV_PATH=$HOME/.virtualenvs/$ENV_NAME
source $VIRTUALENV_PATH/bin/activate
cd $HOME/tmp/test
python ./hoge.py
exit

Ubuntuの場合、これがエラーとなる(確認したのは12.04と14.04)

hoge.sh: 5: hoge.sh: source: not found
Traceback (most recent call last):
  File "./hoge.py", line 2, in <module>
    from twython import Twython
ImportError: No module named twython

結論からいうとUbuntuの/bin/sh の実態はDashというシェルで、Dashには sourceコマンドがないようです。
※上記の場合、sourceでvirtualenvのactivateが出来ずに結果的にシステムのPythonが使われImportErrorを発生させた

$ls -l `which sh`
lrwxrwxrwx 1 root root 4  9月 21 22:27 /bin/sh -> dash

DashAsBinSh - Ubuntu Wikiによると "source"の代わりに"."を使えと。

上記スクリプトの場合、このようになります。

#!/bin/sh
export LANG=ja_JP.utf-8
export ENV_NAME=test
export VIRTUALENV_PATH=$HOME/.virtualenvs/$ENV_NAME
. $VIRTUALENV_PATH/bin/activate
cd $HOME/tmp/test
python ./hoge.py
exit

それかシェバングのsh を bash 等に替えちゃうとかですかね


  • このエントリーをはてなブックマークに追加
PAGE TOP