我试图让Android Studio启动器(studio.sh)使用我手动安装的Java(不是系统范围的默认Java)。因为我已经在我的.bashrc文件中声明了PATH和JAVA_HOME,所以我只是在shell脚本中找到了该文件:
。 /home/foobar/.bashrc
但由于某种原因,脚本仍然没有将$ JAVA_HOME / bin / java识别为可执行文件。
我添加了一些日志记录,发现JAVA_HOME扩展为〜/ install / java ...,即代字号操作符未扩展到主目录。
我做了一些搜索,但无法找到任何原因,因为它没有扩展。是否为特定于Bash的功能(脚本使用#!/ bin / sh,Linux Mint使用短划线,而不是bash)?在某些情况下代字号不起作用吗?
我在.bashrc声明中用$ HOME替换了〜然后它运行了,所以在运行时就知道了HOME。
答案 0 :(得分:7)
在bash manual中,请注意在参数替换期间支撑扩展,但不是递归:
扩展的顺序是:支撑扩展;代码扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。
这意味着在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问题有一些不错的选择: