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

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

我正在使用Cygwin。

Answers:


39

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

运行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

    请注意,在源文件的开头无需进行任何改动,但可以使用它。

  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. 配置并运行新的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

1
我注意到这source仅适用于bash。输出为ksh/bin/ksh: source: not found,为shsh: 0: source: not found。对于这些外壳,应考虑以下答案。
Danny Lo

@dannylo,您是对的,但问题显然是bash中心的。
andcoz 2015年

$ PATH是否需要'export'-大概已经存在?
esskov

@esskov通常不是。我记得在AIX上只有旧版本的sh需要它(大约在1992年),但可能是某种错误。
andcoz


-1

安装Chocolatey @ unix,您可以运行RefreshEnv将更新的环境变量添加到当前会话中

详情


1
您也链接的问题(及其答案)都与Windows有关。   这个问题是关于Unix和Linux的,因此您的帖子没有回答这个问题。
G-Man说'恢复莫妮卡''18

已安装Chocolatey @ unix
小色狼

好的,您声称此答案适用于Unix。您的详细信息链接仍然无关紧要。请提供有关它在Unix中如何工作的详细信息。指向权威文档的链接会很好,但不要仅发布链接;将相关信息放入您的答案中。……请不要在评论中回复;编辑您的答案,使其更清晰,更完整。
G-Man说'恢复莫妮卡''18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.