【问题标题】:Bash - Error parsing ~ in environment variableBash - 在环境变量中解析〜错误
【发布时间】:2020-05-13 03:44:15
【问题描述】:

我有环境变量export MY_WORK_DIR="~/project"。 当我使用以下命令时,它给了我一个错误:

realpath $MY_WORK_DIR

realpath: '~/project': No such file or directory

在我的猜测中,~ 在使用这个环境变量时没有被处理。

顺便说一句,export MY_WORK_DIR=~/project 不适合我。 ~ 应该在字符串中。

您能否指导我如何从环境变量~/project 中获取真实路径?

编辑

对不起。该变量来自其他应用程序,因此我无法修改包含波浪号的环境变量。 (不能选择使用波浪号扩展形式存储变量)。

EDIT2

这样使用eval 命令安全吗? eval "echo ${MY_WORK_DIR}"。它适合我使用。

【问题讨论】:

  • 对不起。该变量来自其他应用程序,因此我无法修改包含波浪号的环境变量。 (使用波浪号扩展形式存储变量不是一种选择)。我只想知道如何正确地从波浪号包含的变量中获取真实路径。
  • 好的,我重新打开了这个问题。
  • 哦。我试过 eval 命令。它按预期工作。使用 eval 命令是否安全? eval "echo ${MY_WORK_DIR}"
  • 如果你不能修改环境变量,那么你的选择只有eval,恐怕。 eval realpath "$MY_WORK_DIR",eval 不安全,因为它可以扩展/执行变量中的任意命令(shell 注入 101),所以使用它需要您自担风险...

标签: bash double-quotes tilde-expansion


【解决方案1】:

如果可以避免的话,我不会使用eval。尤其是在你这样做的方式上,这是通过将危险代码嵌入MY_WORK_DIR 来造成破坏的邀请。

对于您的具体示例,一个便宜的解决方案是做一个

if [[ ${MY_WORK_DIR:0:1} == '~' ]]
then 
  MY_WORK_DIR="$HOME/${MY_WORK_DIR:1}"
fi

它消除了烦人的~ 并预先添加了您的主目录。但如果将MY_WORK_DIR 设置为~einstein/project,这将失败。

在这种情况下,您必须提取用户名 (einstein) 并在主目录中搜索该用户。

【讨论】:

    【解决方案2】:

    以下步骤可以提供解决方案:

    1. 您需要将“~”替换为项目目录的完整路径。
    2. 使用pwd命令标识项目目录的全路径;例如/root/Documents/project 是您获得的完整路径。
    3. 执行此命令export MY_WORK_PROJECT=/root/Documents/project
    4. 执行这个命令echo $MY_WORK_PROJECT所以你应该得到这个结果 /root/Documents/project

    【讨论】:

    • 对于第 2 步:为什么不改用 $PWD
    • 执行PWD$PWD产生的输出路径相同,在本例中为/root/Documents/project
    • 效果是一样的,只是你创建了一个不必要的子进程。这可能很重要,如果有问题的代码在循环中重复执行,这就是我选择``$PWD. OTOH,$(pwd)总是正确的,而$PWD 可能会“撒谎”,因为有人之前明确指定了PWD=....。至少提出两种选择并解释优缺点可能是有意义的,因此 OP 可以理解差异并根据自己的喜好进行选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2016-10-30
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多