Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么路径中的平铺在shell脚本中没有展开?_Linux_Shell_Tilde - Fatal编程技术网

Linux 为什么路径中的平铺在shell脚本中没有展开?

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目录 我

我试图让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不会自动展开它

很可能您的修复工作正常,因为平铺扩展不适用于引号:

$ echo "~"
~
$ echo ~
/home/jeffbowman
…但是像
$HOME
这样的参数扩展确实出现在引号中。将其替换为$HOME将在分配JAVA_HOME时扩展到您的主目录

虽然更好的选择是确保作业正确,但如果您想手动展开作业,这些问题有一些好的选择:


可能是一个更好的指向,但我还没有仔细看过你链接的那个。@EtanReisner谢谢。有几个长期存在的“扩展我存储的tilde”问题可能需要重复数据消除。这是个好主意;我将在中编辑它。(我宁愿链接到问题而不是答案,因为答案的广度有助于了解每个问题的优缺点。)是的,我已经打开了一些类似的选项卡,等待我决定如何很好地消除重复。我几乎贴出了一个元问题,关于是否有可能让主持人将一些更好的答案迁移到一个新的规范问题或其他问题上。
FOO=~/bar        # stores /home/jeffbowman/bar
FOO="~/bar"      # stores ~/bar
FOO=$HOME/bar    # stores /home/jeffbowman/bar
FOO="$HOME/bar"  # stores /home/jeffbowman/bar