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

问题描述 投票:0回答:1

我尝试让 Android Studio 启动器 (studio.sh) 使用我手动安装的 Java(不是系统范围的默认 Java)。由于我已经在

PATH
文件中声明了
JAVA_HOME
.bashrc
,因此我只需在 shell 脚本中获取该文件即可:

。 /home/foobar/.bashrc

但是由于某种原因,

$JAVA_HOME/bin/java
仍然没有被脚本识别为可执行文件。

我添加了一些日志记录,发现

JAVA_HOME
已扩展为 ~/install/java...,即波浪号运算符未扩展到主目录中。

我做了一些搜索,但找不到任何不扩展的原因。波形符是 Bash 特有的功能吗(脚本使用

#!/bin/sh
,Linux Mint 使用破折号,而不是 bash)?波形符在某些情况下不起作用吗?

我在

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

linux shell tilde-expansion
1个回答
27
投票

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

展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。

这意味着任何未展开存储在 bash 变量中的波形符(或参数引用或命令替换)将

不会自动解析。您的 JAVA_HOME 变量包含一个文字波浪号,因此 bash 不会自动扩展它。

您的修复很可能有效,因为波形符扩展不适用于引号:

$ echo "~" ~ $ echo ~ /home/jeffbowman
...但是像 

$HOME

 这样的参数扩展确实发生在引号中。将其替换为 $HOME 会扩展到您的主目录
在分配 JAVA_HOME 期间。请记住,bash 中的引号可以从单词中间开始。

FOO=~/bar # stores /home/jeffbowman/bar 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问题有一些不错的选择:

  • “引号中的波形符扩展”
  • “如何在 bash 中手动扩展特殊变量(例如:~波浪线)”
© www.soinside.com 2019 - 2024. All rights reserved.