如何在 shell 脚本中更改 PATH?

Eri*_*son 36 shell cygwin path environment-variables

我有几个项目需要我更改 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
Run Code Online (Sandbox Code Playgroud)

执行此操作时,它成功地更改了脚本上下文中的 PATH,但随后脚本结束,并且没有完成任何更改。

如何以某种方式运行脚本以更改我当前工作的 shell 的 PATH?

我正在使用 Cygwin。

and*_*coz 45

您必须使用sourceeval或来生成新的外壳。

当您运行 shell 脚本时,会生成一个新的shell。这个shell 将执行脚本命令。在父亲的事情在发生的shell环境将保持不变壳。

有很多不同的技术来管理这种情况:

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

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    Run Code Online (Sandbox Code Playgroud)

    然后来源

    source sourcefile
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,源文件的开头不需要 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"
    
    Run Code Online (Sandbox Code Playgroud)

    然后使用eval它:

    eval `evalfile.sh`
    
    Run Code Online (Sandbox Code Playgroud)
  3. 配置并运行一个新的 shell:

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,当您输入exit此 shell 时,您将返回到shell 。

  4. 将别名放入您的~/.bashrc:

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'
    
    Run Code Online (Sandbox Code Playgroud)

    并在需要时调用它:

    prepare_environ
    
    Run Code Online (Sandbox Code Playgroud)


小智 20

你可以通过使用内置的源代码来做到这一点:

. script_name
Run Code Online (Sandbox Code Playgroud)

一些 shell 提供了一个名为source的别名:

source script_name
Run Code Online (Sandbox Code Playgroud)