在shell别名中设置环境变量

时间:2015-10-27 08:47:08

标签: bash shell environment-variables alias

在我的系统上,我安装了两个版本的Java - 有些程序需要Java 7,有些需要Java 8。

Java 8是我的系统默认设置,因此当我运行Java 7命令时,我一直在使用:

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/ \
java_7_program

我想设置一个别名,所以我可以改为写

j7 java_7_program

我已定义:

alias j7='JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/'

然后运行j7 java -version会产生:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

man page(搜索"别名")声明这是作为直接替换完成的。有没有理由说明为什么这不起作用?

bash --version打印GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)

一个更孤立的例子(减去java):

$ alias foo='BAR=baz'
$ type foo
foo is aliased to `BAR=baz'
$ foo echo $BAR
[blank line]

4 个答案:

答案 0 :(得分:5)

回答你孤立的例子:

当你做这样的事情时:

bar=foo my_command

然后barmy_command的环境中设置(当前shell无法看到)。因此,当你这样做时:

bar=stuff
bar=foo my_command "$bar"

由于$bar 的扩展发生在my_command执行之前,所以它就像在做:

bar=foo my_command stuff

因为{/ 1>在 my_command分叉之前展开了。这解释了您在示例中获得的$bar

[blank line]

只是为了好玩,试试这些:

$ alias foo='BAR=baz'
$ type foo
foo is aliased to `BAR=baz'
$ foo echo $BAR
[blank line]

有道理吗?

$ alias foo=BAR=baz
$ BAR=something
$ foo echo "$BAR"
something

这是因为$ alias foo=BAR=baz $ foo eval 'echo "$BAR"' baz BAR的环境中传递,然后eval被展开...具有预期值(请注意单引号!)。

类似地,

echo "$BAR"

答案 1 :(得分:1)

jdk1.7.*.jdk位可能是问题所在。如果我在其中放置一个明确的版本可以正常工作

您可以使用/usr/libexec/java_home -v 1.7安装最新的1.7版本。

所以要重做你的别名,试试:

alias j7='JAVA_HOME=`/usr/libexec/java_home -v 1.7`'

请注意 java_home 位周围的后退标记,然后执行该命令以生成将 JAVA_HOME 设置为的正确路径。

答案 2 :(得分:1)

在设置环境之前,无法使用Shell别名执行任何操作。

Shell别名只能包含普通命令,没有 jocker 子命令

对于这样的事情,你必须编写一个包装器脚本或至少一个函数

sudo cat >/usr/local/bin/j7 <<<eof
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/
java $@
eof
sudo chmod +x /usr/local/bin/j7

或将此功能定义添加到.bashrc

j7() {
  export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/
  java $@
}

真正有用的bash包装器

类似的东西:

j7 () {
    local JLIBROOT dir
    # JLIBROOT=/usr/lib/jdk
    JLIBROOT=/Library/Java/JavaVirtualMachines
    while read dir && [ "$dir" = "${dir//1.7.}" ] ;do
        :
      done < <(
          /bin/ls -1trd $JLIBROOT/*
    )
    if [ "$dir" != "${dir//1.7.}" ] ;then
          export JAVA_HOME=$dir/Contents/Home
          java $@
      else
          echo "Version 1.7 not found in '$JLIBROOT'."
      fi
}

可以在我的Linux桌面上运行......

答案 3 :(得分:0)

使用env

您可以使用env实用程序设置环境。

alias foo='env - X=42 perl -E"say \$ENV{X}"'

这将设置别名foo,该别名声明环境变量X并将其初始化为42,然后执行perl并指示其打印环境变量{{1 }}。