为什么路径中的波浪号在 shell 脚本中没有扩展?
- 2024-10-12 10:28:00
- admin 原创
- 72
问题描述:
我尝试让 Android Studio 启动器 (studio.sh) 使用我手动安装的 Java(而不是系统范围的默认 Java)。由于我已经在文件中声明PATH
了,因此我只需在 shell 脚本中获取该文件即可:JAVA_HOME
`.bashrc`
./home/foobar/.bashrc
但由于某种原因,$JAVA_HOME/bin/java
该脚本仍然没有将其识别为可执行文件。
我添加了一些日志并发现它JAVA_HOME
扩展为 ~/install/java...,即波浪号运算符没有扩展到主目录。
我进行了一些搜索,但找不到它没有扩展的任何原因。tilde 是 Bash 特有的功能吗(脚本使用#!/bin/sh
,而 Linux Mint 使用 dash,而不是 bash)?tilde 在某些情况下不起作用吗?
我在声明中替换~
了,然后它就起作用了,所以 HOME 在运行时是已知的。$HOME
`.bashrc`
解决方案 1:
在bash 手册中,请注意括号扩展发生在参数替换期间,但不是递归的:
扩展的顺序是:括号扩展;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);单词拆分;和文件名扩展。
The Open Group 提供的 POSIX 标准也在第 2.6 节中列出了这种行为。
这意味着任何未展开的波浪符号(或参数引用或命令替换)存储在 bash 变量中都不会自动解析。您的 JAVA_HOME 变量包含文字波浪符号,因此 bash 不会自动展开它。
您的修复很可能有效,因为波浪号扩展不适用于引号:
$ echo "~"
~
$ echo ~
/home/jeffbowman
...但参数扩展确实出现在引号中。用 $HOME 替换它会在分配 JAVA_HOME 期间$HOME
扩展到您的主目录。请记住,bash 中的引号可以从单词中间开始。
FOO=~/bar # stores /home/jeffbowman/bar
FOO=~jeffbowman/bar # stores /home/jeffbowman/bar
FOO=~"jeffbowman"/bar # stores ~jeffbowman/bar
FOO=~"/bar" # stores ~/bar
FOO="~/bar" # stores ~/bar
FOO=$HOME/bar # stores /home/jeffbowman/bar
FOO="$HOME/bar" # stores /home/jeffbowman/bar
虽然更好的选择是确保你的作业是正确的,但如果你想手动扩展它,这些 SO 问题有一些不错的选择:
“引号中的波浪符号扩展”
“如何在 bash 中手动扩展特殊变量(例如:~tilde)”
请注意,不仅波浪号本身的引用状态是相关的:直到第一个未加引号的斜杠(如果存在)的所有字符都被视为“波浪号前缀”,并且只有当该前缀中的任何字符都没有被引用时,才会扩展为登录名。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件