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

时间:2017-02-22 20:03:23

标签: bash macos shell plist plistbuddy

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

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

907

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

N = 500

正如我所料,<?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> var未扩展为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"

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

ARCHIVES

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

1 个答案:

答案 0 :(得分:1)

$ARCHIVE返回的PlistBuddy包含文字$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