为什么路径中的波浪号未在shell脚本中展开?

时间:2015-08-28 17:45:20

标签: linux shell tilde

我试图让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。

1 个答案:

答案 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问题有一些不错的选择: