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

Posted

技术标签:

【中文标题】使用终端或 bash 脚本创建和写入 .plist【英文标题】:Creating and writing into .plist with Terminal or bash script 【发布时间】:2014-12-09 12:57:12 【问题描述】:

我需要在安装后创建一个 .plist 文件,我可以使用的唯一选项是 bash 脚本。我必须使用 bash 脚本在/Library/launchAgents 中创建一个 foo.plist,并且我使用了以下命令:

cd /Library/launchAgents
touch foo.plist

现在我需要将内容写入这个 .plist 文件,例如:

".plist contents" >> foo.plist

是否有命令可以在终端中执行此操作?

【问题讨论】:

要写入p​​list的plist内容在哪里?我的意思是你在文件中有他们的列表吗?与他们相应的价值?它们在 shell 变量中吗?为什么一定要用bash,为什么不能用编辑器? 是的,我有一个工作的 .plist 文件。我需要使用 bash,因为安装程序会运行这个 bash 脚本。以便在安装过程中将该过程作为安装后步骤自动化。 【参考方案1】:

PlistBuddy 就是你想要的。

/usr/libexec/PlistBuddy Info.plist
File Doesn't Exist, Will Create: Info.plist

然后像这样在文件中添加一个条目,

/usr/libexec/PlistBuddy -c 'add CFBundleIdenfier string com.tencent.myapp' Info.plist

顺便说一句,man plistman plutil 可能对你有帮助。

Command Format:
    Help - Prints this information
    Exit - Exits the program, changes are not saved to the file
    Save - Saves the current changes to the file
    Revert - Reloads the last saved version of the file
    Clear [<Type>] - Clears out all existing entries, and creates root of Type
    Print [<Entry>] - Prints value of Entry.  Otherwise, prints file
    Set <Entry> <Value> - Sets the value at Entry to Value
    Add <Entry> <Type> [<Value>] - Adds Entry to the plist, with value Value
    Copy <EntrySrc> <EntryDst> - Copies the EntrySrc property to EntryDst
    Delete <Entry> - Deletes Entry from the plist
    Merge <file.plist> [<Entry>] - Adds the contents of file.plist to Entry
    Import <Entry> <file> - Creates or sets Entry the contents of file

Entry Format:
    Entries consist of property key names delimited by colons.  Array items
    are specified by a zero-based integer index.  Examples:
        :CFBundleShortVersionString
        :CFBundleDocumentTypes:2:CFBundleTypeExtensions

Types:
    string
    array
    dict
    bool
    real
    integer
    date
    data

Examples:
    Set :CFBundleIdentifier com.apple.plistbuddy
        Sets the CFBundleIdentifier property to com.apple.plistbuddy
    Add :CFBundleGetInfoString string "App version 1.0.1"
        Adds the CFBundleGetInfoString property to the plist
    Add :CFBundleDocumentTypes: dict
        Adds a new item of type dict to the CFBundleDocumentTypes array
    Add :CFBundleDocumentTypes:0 dict
        Adds the new item to the beginning of the array
    Delete :CFBundleDocumentTypes:0 dict
        Deletes the FIRST item in the array
    Delete :CFBundleDocumentTypes
        Deletes the ENTIRE CFBundleDocumentTypes array

【讨论】:

我发现这篇文章除了这个答案之外非常有用:medium.com/@marksiu/what-is-plistbuddy-76cb4f0c262d【参考方案2】:

你的问题并没有很好地说明你得到了什么,或者为什么你需要在bash中这样做,但如果你必须这样做,你可以这样做:

#!/bin/bash
VERSION=2.12
cat > foo.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>BuildAliasOf</key>
        <string>ProEditor</string>
        <key>BuildVersion</key>
        <value>$VERSION</value>
</dict>
</plist>
EOF

因此,您将其保存在名为 Buildplist 的文件中,然后执行此操作以使其可执行

chmod +x Buildplist

然后你输入这个来运行它:

./Buildplist

您可以通过将第二行更改为以下内容,将 plist 文件直接写入/Library/launchAgents

cat > /Library/launchAgents/yourApp/yourApp.plist <<EOF

你也可以让它接受参数。所以如果你想传递Author作为第一个参数,你可以这样做:

#!/bin/bash
VERSION=2.12
AUTHOR="$1"
cat > foo.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>BuildAliasOf</key>
        <string>ProEditor</string>
        <key>BuildVersion</key>
        <value>$VERSION</value>
        <author>$AUTHOR</author>
</dict>
</plist>
EOF

然后运行

./Buildplist "Freddy Frog"

将“弗莱迪青蛙”作为作者。

如果你想避免覆盖任何已经存在的 plist 文件,你可以这样做:

#!/bin/bash
PLISTFILE="/Library/launchAgents/yourApp/yourApp.plist"

# If plist already exists, do not overwrite, just exit quietly
[ -f "$PLISTFILE" ] && exit

cat > "$PLISTFILE" <<EOF
...
...
EOF

为了简化维护,我把plist文件的名字放在了一个变量中,避免输入两次。

【讨论】:

“为什么我必须这样做?”因为我想在我的应用程序安装期间执行一个脚本。当安装程序“这是一个 DMG”和“PKG”安装程序完成安装时,我需要在最后执行此 bash 脚本以将此 .plist 文件放入 /Library.. 有什么方法可以检查并跳过文件是否已经存在?? 是的,当然。我在最后添加了一些额外的内容来展示如何做到这一点。请再看看。 /usr/libexec/PlistBuddy 更好。

以上是关于使用终端或 bash 脚本创建和写入 .plist的主要内容,如果未能解决你的问题,请参考以下文章

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

以 $HOME 开头的 plist 中存储的路径不会在 bash 脚本命令中扩展

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

使用 Xcode 读取和写入具有字典数组的 Plist

Bash 脚本日志文件连续显示到屏幕上

Bash脚本:如何在Linux Shell上输出和格式化文本