在我的系统上,我安装了两个版本的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]
答案 0 :(得分:5)
回答你孤立的例子:
当你做这样的事情时:
bar=foo my_command
然后bar
在my_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别名只能包含普通命令,没有 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 $@
}
类似的东西:
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 }}。