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

4 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在运行时已知.

Jef*_*ica 6

bash手册中,请注意参数替换期间支撑扩展,但不是递归:

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

这意味着在bash变量中未展开存储的任何代字号(或参数引用或命令替换)都不会自动解析.您的JAVA_HOME变量包含文字波浪号,因此bash不会自动展开它.

您的修复可能有效,因为代字号扩展不适用于引号:

$ echo "~"
~
$ echo ~
/home/jeffbowman
Run Code Online (Sandbox Code Playgroud)

...但是参数扩展就像$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
Run Code Online (Sandbox Code Playgroud)

虽然更好的选择是确保您的分配正确,但如果您想手动扩展它,这些SO问题有一些很好的选择: