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

Why is a tilde in a path not expanded in a shell script?

我试图让 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 使用破折号,而不是 bash)?波浪号在某些情况下不起作用吗?

我在 .bashrc 声明中用 $HOME 替换了 ~,然后它起作用了,所以 HOME 在运行时是已知的。

bash manual 中,注意大括号扩展 参数替换期间,但不是递归的:

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.

这意味着存储在 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 问题有一些不错的选择:

  • "Tilde expansion in quotes"
  • "How to manually expand a special variable (ex: ~ tilde) in bash"