【问题标题】:Editing a plist from within local bash script folder从本地 bash 脚本文件夹中编辑 plist
【发布时间】: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”。

标签: objective-c macos bash plist


【解决方案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。
    猜你喜欢
    • 2014-11-29
    • 2022-12-15
    • 1970-01-01
    • 2010-12-05
    • 2021-03-23
    • 2016-07-29
    • 1970-01-01
    • 2021-10-29
    • 2017-08-03
    相关资源
    最近更新 更多