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



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

我添加了一些日志记录,发现JAVA_HOME已扩展为〜/install/java ...,即波浪号运算符未扩展到主目录中。

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

我在.bashrc声明中用$ HOME替换〜,然后它起作用了,因此在运行时就知道HOME了。

最佳答案

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问题也有一些不错的选择:
  • "Tilde expansion in quotes"
  • "How to manually expand a special variable (ex: ~ tilde) in bash"
  • 10-04 11:17
    查看更多