我尝试让 Android Studio 启动器 (studio.sh) 使用我手动安装的 Java(不是系统范围的默认 Java)。由于我已经在
PATH
文件中声明了 JAVA_HOME
和 .bashrc
,因此我只需在 shell 脚本中获取该文件即可:
。 /home/foobar/.bashrc
但是由于某种原因,
$JAVA_HOME/bin/java
仍然没有被脚本识别为可执行文件。
我添加了一些日志记录,发现
JAVA_HOME
已扩展为 ~/install/java...,即波浪号运算符未扩展到主目录中。
我做了一些搜索,但找不到任何不扩展的原因。波形符是 Bash 特有的功能吗(脚本使用
#!/bin/sh
,Linux Mint 使用破折号,而不是 bash)?波形符在某些情况下不起作用吗?
我在
~
声明中将 $HOME
替换为 .bashrc
,然后它就起作用了,所以 HOME 在运行时是已知的。
在 bash 手册中,请注意大括号扩展 在参数替换期间,但不是递归的:
展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。这意味着任何未展开存储在 bash 变量中的波形符(或参数引用或命令替换)将
不会自动解析。您的 JAVA_HOME 变量包含一个文字波浪号,因此 bash 不会自动扩展它。
您的修复很可能有效,因为波形符扩展不适用于引号:
$ echo "~"
~
$ echo ~
/home/jeffbowman
...但是像 $HOME
这样的参数扩展确实发生在引号中。将其替换为 $HOME 会扩展到您的主目录在分配 JAVA_HOME 期间。请记住,bash 中的引号可以从单词中间开始。
FOO=~/bar # stores /home/jeffbowman/bar
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问题有一些不错的选择: