シェルスクリプト内でPATHを変更する方法は?


28

Java / Grails / Mavenのバージョンを変更する必要があるプロジェクトがいくつかあります。変更を行うスクリプトでこれを処理しようとしています。例えば:

#!/bin/sh

export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
export PATH=$JAVA_HOME/bin:$PATH
export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3
export PATH=$GRAILS_HOME/bin:$PATH
export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11
export PATH=$MAVEN_HOME/bin:$PATH
which java
which grails
which mvn

これが実行されると、スクリプトのコンテキスト内でPATHが正常に変更されますが、スクリプトは終了し、変更は行われません。

現在作業しているシェルのPATHを変更する方法でスクリプトを実行するにはどうすればよいですか?

Cygwinを使用しています。

回答:


39

新しいシェルを作成するsourceか、evalまたは使用する必要があります。

シェルスクリプトを実行すると、新しいシェルが生成されます。このシェルはスクリプトコマンドを実行します。父のシェル環境は何で手つかずのままで起こるシェル。

この状況を管理するには、さまざまな手法があります。

  1. 現在のシェルでコマンドのリストを含むファイルsourcefileを準備しますsource

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    

    そしてそれをソース

    source sourcefile

    sourcefileの先頭にsha-bangが必要ないことに注意してください。しかし、それはそれで動作します。

  2. 環境を設定するコマンドを出力するスクリプトevalfile.shを準備します。

    #!/bin/sh
    echo "export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22"
    echo "export PATH=$JAVA_HOME/bin:$PATH"
    

    そしてそれをeval食べました:

    eval `evalfile.sh`
  3. 新しいシェルを構成して実行します。

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash
    

    exitこのシェルに入力すると、父親のシェルに戻ることに注意してください。

  4. にエイリアスを入れてください~/.bashrc

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'

    必要なときに呼び出します:

    prepare_environ

1
私はそれsourceだけのために働くことに気づいたbash。の出力ksh/bin/ksh: source: not foundshsh: 0: source: not found。これらのシェルについては、以下の答えを考慮する必要があります。
ダニー・ロー

@dannylo、あなたは正しいですが、質問は明らかにbash中心的です。
-andcoz

「エクスポート」は$ PATHで必要ですか-おそらく既に存在しますか?
esskov

@esskovは通常そうではありません。AIXで必要だったshの古い古いバージョン(1992年頃)しか覚えていませんが、おそらく何らかのバグでした。
andcoz

19

ソースビルトインを使用してそれを行うことができます:

. script_name

一部のシェルはsourceという名前のエイリアスを提供します

source script_name

-1

Chocolatey @ unixをインストールすると、RefreshEnvを実行して、更新された環境変数を現在のセッションに取得できます。

細部


1
リンクした質問(およびその回答)もWindowsについてのものです。   この質問はUnixとLinuxに関するものなので、あなたの投稿はこの質問に答えません。
G-Manが「Reinstate Monica」と言う

Chocolatey @ unix
小色狼

OK、この答えはUnixで機能すると主張しています。詳細リンクはまだ関係ありません。これがUnixでどのように機能するかについて詳しく説明してください。信頼できるドキュメントへのリンクは良いでしょうが、リンクだけを投稿しないでください。関連情報を回答に入れてください。…コメントに返信しないでください。回答を編集して、より明確で完全なものにします。
G-Manが「Reinstate Monica」と言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.