Linux 为什么路径中的平铺在shell脚本中没有展开?
我试图让Android Studio启动器(Studio.sh)使用我手动安装的Java(而不是系统范围的默认Java)。因为我已经在我的.bashrc文件中声明了PATH和JAVA_HOME,所以我只是在shell脚本中获取了该文件的源代码: /home/foobar/.bashrc 但是由于某种原因,$JAVA_HOME/bin/JAVA仍然没有被脚本识别为可执行文件 我添加了一些日志,发现JAVA_HOME被扩展为~/install/JAVA…,即tilde操作符没有扩展到HOME目录 我做了一些搜索,但找不到它没有扩展的任何原因。tilde是Bash特有的特性吗(脚本使用#!/bin/sh,LinuxMint使用dash而不是Bash)?瓷砖在某些情况下不起作用吗 在.bashrc声明中,我将~替换为$HOME,然后它工作了,因此HOME在运行时是已知的。在中,请注意,在参数替换过程中大括号展开,但不是递归展开: 展开顺序为:支撑展开;波浪线展开、参数和变量展开、算术展开和命令替换(以从左到右的方式完成);分词;和文件名扩展 这意味着任何未展开存储在bash变量中的tilde(或参数引用或命令替换)都不会自动解析。JAVA_HOME变量包含一个文字tilde,因此bash不会自动展开它 很可能您的修复工作正常,因为平铺扩展不适用于引号:Linux 为什么路径中的平铺在shell脚本中没有展开?,linux,shell,tilde,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…,即tilde操作符没有扩展到HOME目录 我
$ echo "~"
~
$ echo ~
/home/jeffbowman
…但是像$HOME
这样的参数扩展确实出现在引号中。将其替换为$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