为什么路径中的波浪号在 shell 脚本中没有扩展?

2024-10-12 10:28:00
admin
原创
198
摘要:问题描述:我尝试让 Android Studio 启动器 (studio.sh) 使用我手动安装的 Java(而不是系统范围的默认 Java)。由于我已经在文件中声明PATH了,因此我只需在 shell 脚本中获取该文件即可:JAVA_HOME`.bashrc`./home/foobar/.bashrc但由于...

问题描述:

我尝试让 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)”

请注意,不仅波浪号本身的引用状态是相关的:直到第一个未加引号的斜杠(如果存在)的所有字符都被视为“波浪号前缀”,并且只有当该前缀中的任何字符都没有被引用时,才会扩展为登录名。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用