在我的系统上,我安装了两个版本的 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]
最佳答案
回答您的孤立示例:
当你做这样的事情时:
bar=foo my_command
然后 bar
设置在 my_command
的环境中(当前 shell 看不到)。因此,当您这样做时:
bar=stuff
bar=foo my_command "$bar"
因为 $bar
的扩展 发生在 my_command
执行之前,所以它就像在做:
bar=foo my_command stuff
因为 $bar
在 fork my_command 之前展开。这解释了您在示例中获得的 [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"
被扩展......具有期望值(注意单引号!)。
同样,
$ alias foo=BAR=baz
$ foo sh -c 'echo "$BAR"'
baz
关于bash - 在 shell 别名中设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33363345/