質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Q&A

解決済

2回答

5471閲覧

shellscriptでpyenvの設定が上手くいかない

marimo.

総合スコア48

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

0グッド

0クリップ

投稿2017/08/14 10:36

編集2017/08/14 12:56

環境: Debian/jessie

shellscript

1#!/bin/bash 2 3# insatll pyenv 4echo '##### install pyenv #####' 5git clone https://github.com/yyuu/pyenv.git ~/.pyenv 6echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc 7echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc 8echo 'eval "$(pyenv init -)"' >> ~/.bashrc 9source ~/.bashrc 10echo '##### 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コマンドは親のシェルに影響を与えない、との指摘を受けました。
備忘録として残しておきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

sourceは効いていますが、子シェルで実行しているので、その結果が有効なのはそのスクリプトファイルの末尾までで、呼び出したシェルには無関係です。
source ~/pyenv-install.shとして実行させてください。これだと、呼び出したシェルの中で動くのでファイルの中のsouceもその後まで有効になります。

投稿2017/08/14 11:41

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimo.

2017/08/14 12:52

なるほどスクリプトを実行した場合、子シェルで実行していて、実行を終了するとそのシェルが閉じられる。 つまり有効なのはそのスクリプトファイルの末尾までで、呼び出したシェルには無関係となる、といった感じでしょうか。 `source ~/pyenv-install.sh` を使ってのshell実行は初めて知りました、ご指摘ありがとうございます。
guest

0

シェルスクリプトは、原則、別のプロセスとして起動されたシェル(bash, zshなど)上で動作します。そのため、sourceコマンドで実行した内容については、別のプロセスとして起動されたシェルの環境に対してのみ反映されます(スクリプト実行後に破棄されます)。

なお、このスクリプトの呼び出し元に対してsourceの内容を反映させることはできなかったと記憶しておりますので、素直にターミナルを再起動するか、スクリプト実行後以下のコマンドでシェルを上書き実行してください。

shell

1exec $(SHELL) -l

投稿2017/08/14 11:26

yukkeorg

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimo.

2017/08/14 12:45

回答有り難うございます。 > スクリプト実行後に破棄されます 少し自分が勘違いをしていたような気が致します。 terminalを再起動して対応します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問