从本地 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]" )" &amp;&amp; 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的主要内容,如果未能解决你的问题,请参考以下文章

Bash - 在 plist 文本文件中修改 WhitelistedBlockedPlugins

用bash脚本从plist中提取字符串,也许是sed?

使用终端或 bash 脚本创建和写入 .plist

用于归档文件然后复制新文件的 Bash 脚本

使用 bash 脚本编辑 .tf 变量文件

一个bash脚本,用于使用bash脚本连接字符串并在同一文件中编辑一行