为什么在一个shell脚本中没有扩展path的代字符?

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

。 /home/foobar/.bashrc

但由于某些原因,$ JAVA_HOME / bin / java仍然不被脚本识别为可执行文件。

我添加了一些日志logging,发现JAVA_HOME扩展为〜/ install / java …,即代字符操作符没有扩展到主目录。

我做了一些search,但没有find任何理由为什么没有扩大。 是代表Bash特定function(脚本使用#!/ bin / sh,而Linux Mint使用破折号而不是bash)? 在某些情况下,代字号不起作用吗?

我用.bashrc声明中的$ HOMEreplace了〜,然后运行,所以HOME在运行时是已知的。

在bash手册中 ,请注意参数替换过程中进行大括号扩展,但不能递归:

扩展的顺序是:支撑扩展; 代字符扩展,参数和变量扩展,算术扩展和命令替换(按照从左到右的方式完成); 分词; 和文件名扩展。

这意味着在bash变量中存储的非波形(或参数引用或命令替换) 不会自动解析 。 你的JAVA_HOME变量包含一个文字波浪号,所以bash不会自动扩展它。

您的修正很可能是因为代字号扩展不适用于引号:

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

…但像$HOME参数扩展不会出现在引号中。 用$ HOME替换它将在JAVA_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扩大报价”
  • “如何在bash中手动扩展一个特殊的变量(例如:〜代字号)