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



我试图让Android Studio启动器(Studio .sh)使用我手动安装的Java(不是系统范围内的默认Java)。因为我已经在我的.bashrc文件中声明了PATHJAVA_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) "

相关内容

  • 没有找到相关文章

最新更新