13

我试图让 Android Studio 启动器 (studio.sh) 使用我手动安装的 Java(不是系统范围的默认 Java)。由于我已经在我的文件中声明了PATH,我只是在 shell 脚本中获取了该文件:JAVA_HOME.bashrc

. /home/foobar/.bashrc

但由于某种原因,$JAVA_HOME/bin/java脚本仍未将其识别为可执行文件。

我添加了一些日志记录,发现它JAVA_HOME被扩展为 ~/install/java...,即波浪号运算符没有扩展到主目录。

我做了一些搜索,但找不到任何不扩展的原因。波浪号是 Bash 特有的功能吗(脚本使用#!/bin/sh,Linux Mint 使用破折号,而不是 bash)?波浪号在某些情况下不起作用吗?

我在声明中替换~为,然后它起作用了,所以 HOME 在运行时是已知的。$HOME.bashrc

4

1 回答 1

17

bash 手册中,请注意参数替换期间的大括号扩展,但不是递归:

展开顺序为:大括号展开;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。

这意味着存储在 bash 变量中未扩展的任何波浪号(或参数引用或命令替换)都不会自动解析. 您的 JAVA_HOME 变量包含一个文字波浪号,因此 bash 不会自动扩展它。

您的修复很可能有效,因为波浪号扩展不适用于引号:

$ echo "~"
~
$ echo ~
/home/jeffbowman

...但是参数扩展$HOME确实出现在引号中。在分配 JAVA_HOME 期间,将其替换为 $HOME 会扩展到您的主目录。

FOO=~/bar        # stores /home/jeffbowman/bar
FOO="~/bar"      # stores ~/bar
FOO=$HOME/bar    # stores /home/jeffbowman/bar
FOO="$HOME/bar"  # stores /home/jeffbowman/bar

虽然更好的选择是确保您的分配是正确的,但如果您想手动扩展它,这些 SO 问题有一些不错的选择:

于 2015-08-28T17:52:15.877 回答