通过bash别名修改$ PATH变量

时间:2014-12-03 01:41:49

标签: bash path alias

我在.bashrc文件中创建了这个别名:

alias changepath="export PATH=$JAVA_HOME/bin:$PATH"

我想要做的是更改$JAVA_HOME,然后更改$PATH以包含新的$JAVA_HOME/bin

当我更改$JAVA_HOME并输入此命令而不是使用别名时,它会按预期工作。 但是,当我更改$JAVA_HOME然后使用别名时,changepath命令会将旧$JAVA_HOME/bin而不是新$JAVA_HOME/bin添加到$PATH

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

您还可以通过单引用别名定义推迟对变量的评估,即

alias changepath='export PATH=$JAVA_HOME/bin:$PATH'

请注意,别名或功能解决方案无法解决清除您设置的任何先前JAVA_HOME的问题。

所以你最终可以找到疯狂的PATH

 PATH="/usr/bin:/sys"

 PATH=/usr/bin/java:/usr/bin:/sys

 PATH=/usr/bin/java/bin:/usr/bin/java:/usr/bin:/sys

答案 1 :(得分:2)

尝试改为使用函数:

changepath () {
    export PATH="$JAVA_HOME/bin:$PATH";
}

在您设置别名时,会解释"$JAVA_HOME$PATH。因此,它们固定在执行.bashrc

的那一刻

使用函数,变量将在启动时解释。

  

注意:我复制/粘贴您export PATH=...,但请注意,每次发布时都会添加$PATH的内容。

答案 2 :(得分:1)

这就是我如何处理Java 7和8 SDK之间的更改问题。我相信有人可以改进这些bash功能,但我想重要的部分是使用 sed 来编辑路径。

这将找到并替换JAVA_HOME值,而不是继续添加到PATH变量。

function java7 () {
  export PATH=$(echo $PATH | sed s~$JAVA_HOME~${JAVA_7_HOME}"/bin"~)
  export JAVA_HOME="${JAVA_7_HOME}";
}

function java8 () {
  export PATH=$(echo $PATH | sed s~$JAVA_HOME~${JAVA_8_HOME}"/bin"~)
  export JAVA_HOME="${JAVA_8_HOME}";
}

答案 3 :(得分:1)

我需要在8到11之间切换,所以我要做的是:

  1. 在.profile中添加NO_JAVA_PATH
    export NO_JAVA_PATH=$PATH
    export JAVA_HOME="<path>"
    export PATH=$JAVA_HOME/bin:$PATH
  1. 在.bashrc中添加了别名
    alias j8='export JAVA_HOME="<path>" ; export PATH=$JAVA_HOME/bin:$NO_JAVA_PATH'
    alias j11='export JAVA_HOME="<path>" ; export PATH=$JAVA_HOME/bin:$NO_JAVA_PATH'