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

标签 bash shell environment-variables alias

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

相关文章:

bash - 在 .txt 文件中查找最长的行并用 'blank Spaces' 填充该长度的所有行?

bash -\n 在 Bash 字符串和相等性检查中

c - 用 C 中的颜色复制当前路径

javascript - 如何向Javascript添加数据库环境变量

python - 在 Jenkins 中设置特定的 Python

php - 从 PHP 启动交互式 SSH bash session

linux - 如何回复linux提示(根据提示中的关键字)

linux - 我正在尝试使用 awk 旋转文件

Docker-compose .env 文件内部变量替换

bash - 遍历 Ubuntu 16 中的文件夹文件