gpt4 book ai didi

bash - 在 shell 别名中设置环境变量

转载 作者:行者123 更新时间:2023-11-29 09:00:06 25 4
gpt4 key购买 nike

在我的系统上,我安装了两个版本的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com