我正在尝试使用脚本编辑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;
答案 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
读取之前。 (管道两侧的命令(“|
”)同时运行,而不是连续运行。)
您应暂时使用第二个文件,然后在命令成功时将原始文件替换为结果。