从本地 bash 脚本文件夹中编辑 plist
Posted
技术标签:
【中文标题】从本地 bash 脚本文件夹中编辑 plist【英文标题】:Editing a plist from within local bash script folder 【发布时间】:2014-01-01 17:29:38 【问题描述】:我正在尝试使用脚本编辑 plist,该脚本确定运行脚本的本地文件夹。我遇到的是一个空白的 plist。 Objective-C 环绕也是一种选择,但我没有从中得到预期的 plist 编辑。
当单独运行时,它按预期工作,最后没有第二个 sed 管道命令,并通过在 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;
【问题讨论】:
也许您可以将您的 shell 脚本缩减为一个更小的示例,该示例仍然可以演示该问题。 - 输入、输出和预期输出也会有所帮助。 感谢@Martin R,已完成,希望对您有所帮助。 执行最后一行时,您确定当前工作目录正确(即包含“MyPlist.plist”的目录)?也许添加一个pwd
调用来检查。
@Marin R,是的,因为脚本在没有 NSTask 的情况下完美运行,并且 plist 文件被编辑,但它只返回一个空 plist。
我不知道为什么会这样。 - 但我会使用 /usr/libexec/PlistBuddy 而不是 sed 来操作属性列表。参见“man PlistBuddy”。
【参考方案1】:
我推荐使用PlistBuddy
而不是sed
来修改属性列表文件,
哪个更不容易出错:
/usr/libexec/PlistBuddy -c "Set :KEY VALUE" /path/to/plistfile
【讨论】:
【参考方案2】:你可以使用dirname
,这对我来说更容易并且工作。
这样称呼它:scriptpath="$(dirname $0)"
或者另一种选择是:scriptpath="$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )"
【讨论】:
非常感谢@Dominik Hadl,第二个命令是在 OS X 上工作的命令,一直在努力寻找它。该脚本在其基础上工作,但不是所需的 NSTask。 我赞成你的答案,因为它更接近解决方案,但问题无法解决。【参考方案3】:线
cat MyPlist.plist | sed 's/<\/dict>/<key>My\ Plist\ Setting<\/key><string>1<\/string><\/dict>/g' > MyPlist.plist;
对我来说似乎不可靠。在 shell 为sed
命令的重定向输出打开相同文件之前,cat
子进程是否打开了预先存在的 MyPlist.plist 文件存在竞争条件。 shell 可能会使用O_TRUNC
打开它以丢弃其现有内容并从头开始。这可能发生在cat
阅读它之前。 (管道两侧的命令 ('|
') 是同时运行的,而不是串行的。)
如果命令成功,您应该暂时使用第二个文件,然后用结果替换原始文件。
【讨论】:
我使用了 sed infile > outfile,它仍然返回一个空的 plist。以上是关于从本地 bash 脚本文件夹中编辑 plist的主要内容,如果未能解决你的问题,请参考以下文章