以 $HOME 开头的 plist 中存储的路径不会在 bash 脚本命令中扩展

Posted

技术标签:

【中文标题】以 $HOME 开头的 plist 中存储的路径不会在 bash 脚本命令中扩展【英文标题】:Path stored in plist starting with $HOME does not expand in bash script command 【发布时间】:2017-02-22 20:03:22 【问题描述】:

我正在编写一个 bash 脚本来自动化我们的构建过程。我需要将路径存储在设置 plist 文件中,并使用 plistbuddy 在 shell 脚本中检索它。

下面的键指定存档的存储路径,桌面上的一个文件夹:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>archives_path</key>
   <string>$HOME/Desktop/Archives/</string>
</dict>
</plist>

在我的 shell 脚本中,我访问了密钥:

SETTINGS_PATH="path/to/plist/file"

ARCHIVES=$(/usr/libexec/PlistBuddy -c "Print archives_path" "$SETTINGS_PATH")
#outputs "$HOME/Desktop/Archives/"

mkdir "$ARCHIVES/test/"
#outputs "mkdir: $HOME/Desktop/Archives: No such file or directory"

ARCHIVES 变量没有像我预期的那样扩展到 /Users/*username*/Desktop/Archives/

我通过创建一个具有相同字符串的 var 进行了测试:

ARCHIVES="$HOME/Desktop/Archives/" 

echo "$ARCHIVES" 
#expands to "/Users/*username*/Desktop/Archives/"

mkdir "$ARCHIVES/test/"
#creates the 'test' directory

由于此脚本将在未知用户帐户下运行,我如何强制 $HOME 正确展开。

【问题讨论】:

试试mkdir 选项-p @Cyrus mkdir -p $ARCHIVES 在桌面上创建一个名为$HOME 的文件夹,其中包含文件夹Desktop/Archives/test/ 【参考方案1】:

PlistBuddy 返回的 $ARCHIVE 包含文字 $HOME

简单演示:

str='$HOME/tmp/somefile'
echo "The HOME isn't expanded: [[$str]]"

打印出来:

The HOME isn't expanded: [[$HOME/tmp/somefile]]

您可以使用eval 进行扩展,例如:

expanded_str1=$(eval "echo $str")
echo "The HOME is DANGEROUSLY expanded using eval: [[$expanded_str1]]"

打印出来的

The HOME is DANGEROUSLY expanded using eval: [[/Users/jm/tmp/somefile]]

但是使用eval 是危险的!评估任何不受您控制的字符串真的很危险。

因此,您需要手动将文字$HOME 替换为其实际的。它可以通过多种方式完成,例如:

expanded_str2="$str/\$HOME/$HOME"
# or
expanded_str2=$(echo "$str" | sed "s!\$HOME!$HOME!")
# or
expanded_str2=$(echo "$str" | perl -plE 's/\$(\w+)/$ENV$1/g')
# or ... other ways...

使用

echo "$expanded_str2"

打印

/Users/jm/tmp/somefile

【讨论】:

以上是关于以 $HOME 开头的 plist 中存储的路径不会在 bash 脚本命令中扩展的主要内容,如果未能解决你的问题,请参考以下文章

六:数据存储的五种方式

Linux命令

Xamarin App 编辑 info.plist 名称不能以“<”字符开头

Firebase 部署错误以非零退出代码开头(项目路径中的空格)

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

iOS -- plist数据存储与偏好设置数据存储