web-dev-qa-db-ja.com

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

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を使用しています。

31
Eric Wilson

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

シェルスクリプトを実行すると、新しいchildシェルが生成されます。このchildシェルはスクリプトコマンドを実行します。 fatherシェル環境は、childシェルで何が起こっても影響を受けません。

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

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

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

    そしてそれを調達する

    source sourcefile
    

    sourcefileの最初にシャバンが必要ないことに注意してください。ただし、これで動作します。

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

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

    それからevaluate:

    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を入力すると、fatherに戻ることに注意してください。

  4. エイリアスを~/.bashrcに入れます:

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

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

    prepare_environ
    
42
andcoz

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

. script_name

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

source script_name
19