在shell别名中设置环境变量

Fab*_*amp 6 bash shell alias environment-variables

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

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

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/ \
java_7_program
Run Code Online (Sandbox Code Playgroud)

我想设置一个别名,以便我可以写

j7 java_7_program
Run Code Online (Sandbox Code Playgroud)

我定义了:

alias j7='JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.*.jdk/Contents/Home/'
Run Code Online (Sandbox Code Playgroud)

但是然后运行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)
Run Code Online (Sandbox Code Playgroud)

该手册页(搜索“别名”)指出,这是作为一个直接替代完成。有什么原因不能解决这个问题?

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]
Run Code Online (Sandbox Code Playgroud)

gni*_*urf 5

回答您的孤立示例:

当您执行以下操作时:

bar=foo my_command
Run Code Online (Sandbox Code Playgroud)

然后bar在my_command的环境中设置(当前shell看不到)。因此,当您这样做时:

bar=stuff
bar=foo my_command "$bar"
Run Code Online (Sandbox Code Playgroud)

由于的展开$bar 是在my_command执行之前发生的,所以就像这样做:

bar=foo my_command stuff
Run Code Online (Sandbox Code Playgroud)

因为在 my_command被派生之前$bar扩展了。这就解释了您在示例中获得的:[blank line]

$ alias foo='BAR=baz'
$ type foo
foo is aliased to `BAR=baz'
$ foo echo $BAR
[blank line]
Run Code Online (Sandbox Code Playgroud)

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

$ alias foo=BAR=baz
$ BAR=something
$ foo echo "$BAR"
something
Run Code Online (Sandbox Code Playgroud)

说得通?

$ alias foo=BAR=baz
$ foo eval 'echo "$BAR"'
baz
Run Code Online (Sandbox Code Playgroud)

这是因为BAR在eval的环境中传递,然后echo "$BAR"用期望的值扩展(请注意单引号!)。

同样,

$ alias foo=BAR=baz
$ foo sh -c 'echo "$BAR"'
baz
Run Code Online (Sandbox Code Playgroud)