为什么路径中的波浪号在 shell 脚本中没有展开?
Why is a tilde in a path not expanded in a shell script?
我试图让 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 在运行时是已知的。
在 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"
我试图让 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 在运行时是已知的。
在 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.
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"