我试图让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使用dash,而不是bash)?波浪在某些情况下不起作用吗?
我在.bashrc
声明中用$HOME
替换了~
,然后它工作了,所以HOME在运行时是已知的。
在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
虽然更好的选择是确保你的作业是正确的,但如果你想手动展开它,这些问题有一些不错的选择:
- "波浪扩展引号"
- "如何在bash中手动展开一个特殊变量(例如:~ tilde) "