我有几个项目需要我更改 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
您必须使用source
或eval
或来生成一个新的 shell。
当你运行一个新的 shell 脚本时孩子贝壳已生成。这孩子shell 将执行脚本命令。这父亲shell 环境将保持不受发生的任何事情的影响孩子壳。
有很多不同的技术可以处理这种情况:
准备一个文件源文件
source
包含当前 shell 中的命令列表:export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22 export PATH=$JAVA_HOME/bin:$PATH
然后获取它的来源
source sourcefile
请注意,在开始时不需要 sha-bang源文件,但它会与它一起工作。
准备脚本评估文件.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`
配置并运行新的 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 中键入时,您将返回到父亲一。在您的中添加别名
~/.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