从本地bash脚本文件夹中编辑plist

时间:2014-01-01 17:29:38

标签: objective-c macos bash plist

我正在尝试使用脚本编辑plist,该脚本确定运行脚本的本地文件夹。我遇到的是一个空白的plist。 Objective-C环绕也是一个选项,但我没有从中得到预期的plist编辑。

在没有第二个sed pipe命令的情况下单独运行并将其从shell中运行脚本然后添加它时,它按预期工作。

当从shell单独运行时,整个cat MyPlist.plist等行按预期工作。

输出:无,它只是运行

这是我的剧本:

#!/bin/sh    

# scriptname is the full path of the script location.
scriptpath=`echo $scriptname | sed 's/MyScript.sh/\//g'`
cd $scriptpath
cd ..
cat MyPlist.plist | sed 's/<\/dict>/<key>My\ Plist\ Setting<\/key><string>1<\/string><\/dict>/g' > MyPlist.plist;

3 个答案:

答案 0 :(得分:3)

我建议使用sed来修改属性列表文件,而不是PlistBuddy, 这不容易出错:

/usr/libexec/PlistBuddy -c "Set :KEY VALUE" /path/to/plistfile

答案 1 :(得分:1)

您可以使用dirname,这对我来说更容易实现。

这样称呼:
scriptpath="$(dirname $0)"

或另一种选择是:
scriptpath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

答案 2 :(得分:0)

该行

cat MyPlist.plist | sed 's/<\/dict>/<key>My\ Plist\ Setting<\/key><string>1<\/string><\/dict>/g' > MyPlist.plist;

对我来说似乎不可靠。在shell为cat命令的重定向输出打开相同文件之前,sed子进程是否已打开预先存在的MyPlist.plist文件存在竞争条件。 shell可能会用O_TRUNC打开它以丢弃其现有内容并从头开始。这可能发生在cat读取之前。 (管道两侧的命令(“|”)同时运行,而不是连续运行。)

您应暂时使用第二个文件,然后在命令成功时将原始文件替换为结果。