質問: 環境: Debian/jessie ``` #!/bin/bash # insatll pyenv echo '##### install pyenv #####' git clone https://github.com/yyuu/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc source ~/.bashrc echo '##### finish install #####' ``` 上記のshellscriptを実行(実行方法: `$ ~/pyenv-install.sh` )すると `notfound source command` とは表示されずにpassされました。(エラーなし) つまりsourceコマンドが認識されたと思っていたのですが、コンソール上で `pyenv` コマンドが認識されていませんでした。sourceコマンドが認識されていたのにsourceコマンドが効いていない、という謎にハマっています。 ちなみに上記のshellscriptのpermissionは `-rwxr-xr-x (755)` です。 また `source ~/bashrc` すると `pyenv` コマンドは認識されます。 お知恵をお貸しいただけますと幸いです。 --- 備忘録: シェルスクリプト内でsourceコマンドを使いたい > > シェルが対話的でない時には、 shopt コマンドによって expand_aliases オプ > > ションが設定されていない場合に限り、エイリアスの展開は行われません > > > 類似質問を見つけましたが、そもそも `shellscriptを実行しているシェル` と `shellscriptが実行しているシェルは異なる` のでsourceコマンドは親のシェルに影響を与えない、との指摘を受けました。 備忘録として残しておきます。
回答: `source`は効いていますが、子シェルで実行しているので、その結果が有効なのはそのスクリプトファイルの末尾までで、呼び出したシェルには無関係です。 `source ~/pyenv-install.sh`として実行させてください。これだと、呼び出したシェルの中で動くのでファイルの中の`souce`もその後まで有効になります。