如何在 shell 脚本中更改 PATH?

如何在 shell 脚本中更改 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,但随后脚本结束,并且没有完成任何更改。

如何运行脚本来更改我当前正在使用的 shell 的 PATH?

我正在使用 Cygwin。

答案1

您必须使用sourceeval或来生成一个新的 shell。

当你运行一个新的 shell 脚本时孩子贝壳已生成。这孩子shell 将执行脚本命令。这父亲shell 环境将保持不受发生的任何事情的影响孩子壳。

有很多不同的技术可以处理这种情况:

  1. 准备一个文件源文件source包含当前 shell 中的命令列表:

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

    然后获取它的来源

    source sourcefile
    

    请注意,在开始时不需要 sha-bang源文件,但它会与它一起工作。

  2. 准备脚本评估文件.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. 配置并运行新的 shell:

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

    请注意,当您exit在此 shell 中键入时,您将返回到父亲一。

  4. 在您的中添加别名~/.bashrc

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

    并在需要时调用它:

    prepare_environ
    

答案2

您可以通过使用来做到这一点来源内置:

. script_name

一些 shell 提供了一个别名,名为来源:

source script_name

相关内容