【问题标题】:Why is a tilde in a path not expanded in a shell script?为什么路径中的波浪号没有在 shell 脚本中展开?
【发布时间】:2015-08-28 17:45:20
【问题描述】:

我试图让 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 是已知的。

【问题讨论】:

    标签: linux shell tilde-expansion


    【解决方案1】:

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

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

    这意味着存储在 bash 变量中未扩展的任何波浪号(或参数引用或命令替换)将不会自动解析。您的 JAVA_HOME 变量包含文字波浪号,因此 bash 不会自动扩展它。

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

    $ 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
    

    虽然更好的选择是确保您的分配是正确的,但如果您想手动扩展它,这些 SO 问题有一些不错的选择:

    【讨论】:

    • This answer 可能是一个更好的指向,但我还没有真正仔细研究过你链接的那个。
    • @EtanReisner 谢谢。有一些长期存在的“扩展我存储的代字号”问题可能需要进行重复数据删除。这是一个很好的;我会编辑它。(我宁愿链接到问题而不是答案,因为答案的广度有助于理解每个问题的优缺点。)
    • 是的,我已经打开了一些类似的选项卡,等待我决定如何很好地消除重复数据。我几乎发布了一个关于是否有可能让版主将一些更好的答案迁移到一个新的规范问题或其他东西的元问题。
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2011-08-21
    • 1970-01-01
    • 2018-01-06
    • 2019-05-05
    • 2021-02-03
    • 2017-02-28
    • 2019-01-04
    相关资源
    最近更新 更多