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)
回答您的孤立示例:
当您执行以下操作时:
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)
| 归档时间: |
|
| 查看次数: |
5292 次 |
| 最近记录: |